2017-09-01 91 views
0

我們正在調試我們的大型遺留應用程序的內存問題,並希望使用Valgrind來追蹤它。然而,該應用使用ACE/TAO CORBA library,Valgrind抱怨庫中的非法「vex」指令。gcc/C++禁用生成vex指令

==29992== Memcheck, a memory error detector 
==29992== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al. 
==29992== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info 
==29992== Command: DvMain 
==29992== 
DvMain. Version 6.0 Build 38B16 
vex x86->IR: unhandled instruction bytes: 0xC4 0xE2 0x7B 0xF7 
==29992== valgrind: Unrecognised instruction at address 0x5f37a4b. 
==29992== at 0x5F37A4B: ACE_Select_Reactor_Impl::bit_ops(int, unsigned long, ACE_Select_Reactor_Handle_Set&, int) (in /usr/local/dvstation/lib3p/ACE/libACE.so.6.2.7) 

In another SO questionVTT建議禁用與-mno-avx,這對一些事情的工作AVX指令。但是,仍然有問題。

我試過-mno-sse2avx -mno-avx -mno-sse4.1 -mno-sse4.2 -mno-sse4 -mno-sse4a但Valgrind的仍然::bit_ops()抱怨的VEX指令(如果你有興趣,bit_opsline 956 of this file定義)

如何完全禁用的VEX指令的產生,所以我可以用Valgrind的來調試?

平臺是32位的Centos 6,G ++ 4.9.4

(請不要建議移動到64位這是不與本產品的選項。)

參考:

對有問題的文件編譯行:

/usr/local/gcc-4.9.4/bin/c++4.9 -mno-sse2avx -fvisibility=hidden 
-fvisibility-inlines-hidden -fdiagnostics-color=auto 
-mno-avx -mno-sse4.1 -mno-sse4.2 -mno-sse4 -mno-sse4a 
-O3 -march=native -pthread -fno-strict-aliasing 
-Wall -W -Wpointer-arith -pipe -D_GNU_SOURCE 
-c -fPIC -o .shobj/Select_Reactor_Base.o Select_Reactor_Base.cpp 

回答

0

VEX很新穎。使用舊的架構,例如-march=pentium4將禁止VEX指令編碼,但您保留SSE2。

+0

@PaulFloyd:這個術語是重載的,但這裏清楚地表示x86 VEX編碼。你可以在「未處理的指令字節:0xC4 0xE2 0x7B 0xF7」中看到。 0xC4是x86 VEX前綴。 – MSalters

+0

我不知道VEX操作碼的前綴。在Valgrind方面,消息與此無關。在VEX/priv/guest_x86_toIR.c中有'/ *所有解碼失敗都在這裏結束。 */vex_printf(「vex x86-> IR:未處理的指令字節:」' –

+0

@PaulFloyd:解碼失敗的_cause_是0xC4 0xE2 0x7B 0xF7指令,它是Valgrind無法解析的x86 VEX編碼指令。通過使用'-march = pentium4',GCC不會生成'0xC4'指令,避免解碼失敗。 – MSalters

1

或許你可以從DTS使用的valgrind 3.12代替,在devtoolset-6-valgrind包的形式?在Valgrind的3.9加入

支持AVX2指令,所以你可能會避免重新編譯軟件。

+0

32位Centos 6只支持devtools-3。 valgrind 3.9的發行說明中提到「支持英特爾AVX2指令,這隻適用於64位」...... – Danny

-1

VEX是Valgrind抽象機器表示。這是Valgrind的基本部分,您無法關閉它。您需要告訴編譯器發出您的Valgrind版本可以理解的機器代碼,或者升級到可理解AVX的更新版本的Valgrind。

AVX dates from about 2011雖然您使用的Valgrind版本於2012年9月發佈,但它可能未添加AVX支持。令人困惑的是,這些擴展也使用"VEX" prefix。在這種情況下,來自Valgrind的「vex x86-> IR」消息指的是Valgrind的VEX而不是AVX VEX前綴。

+0

「你或者需要告訴編譯器發出你的Valgrind版本能夠理解的機器代碼」並不是重述問題的答案。編譯器是GCC;如何讓GCC在不使用x86 VEX的情況下發出x86機器代碼? – MSalters

+0

這已經得到解答。但是,如果未來的讀者有一個像「vex x86-> IR:未處理的指令字節0xf 0x5」的錯誤,並且他們發現這個問題/答案,那麼禁用編譯器VEX/AVX生成不太可能有幫助。 –