我們正在調試我們的大型遺留應用程序的內存問題,並希望使用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 question,VTT建議禁用與-mno-avx
,這對一些事情的工作AVX指令。但是,仍然有問題。
我試過-mno-sse2avx -mno-avx -mno-sse4.1 -mno-sse4.2 -mno-sse4 -mno-sse4a
但Valgrind的仍然::bit_ops()
抱怨的VEX指令(如果你有興趣,bit_ops
上line 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
@PaulFloyd:這個術語是重載的,但這裏清楚地表示x86 VEX編碼。你可以在「未處理的指令字節:0xC4 0xE2 0x7B 0xF7」中看到。 0xC4是x86 VEX前綴。 – MSalters
我不知道VEX操作碼的前綴。在Valgrind方面,消息與此無關。在VEX/priv/guest_x86_toIR.c中有'/ *所有解碼失敗都在這裏結束。 */vex_printf(「vex x86-> IR:未處理的指令字節:」' –
@PaulFloyd:解碼失敗的_cause_是0xC4 0xE2 0x7B 0xF7指令,它是Valgrind無法解析的x86 VEX編碼指令。通過使用'-march = pentium4',GCC不會生成'0xC4'指令,避免解碼失敗。 – MSalters