我们正在使用我们的大型遗留应用调试内存问题,并希望使用Valgrind来跟踪它。该应用程序使用ACE/TAO CORBA library但是,Valgrind在库中抱怨非法的“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()
中的烦恼说明(如果您有兴趣,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
答案 0 :(得分:1)
也许您可以使用来自DTS的valgrind 3.12,而不是devtoolset-6-valgrind
包的形式?
valgrind 3.9中添加了对AVX2指令的支持,因此您可能会避免重新编译软件。
答案 1 :(得分:0)
VEX很新。使用旧架构,例如-march=pentium4
将禁止VEX指令编码,但您保留SSE2。
答案 2 :(得分:-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前缀。