gcc / C ++禁止生成vex指令

时间:2017-09-01 02:43:27

标签: c++ gcc g++ valgrind

我们正在使用我们的大型遗留应用调试内存问题,并希望使用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

3 个答案:

答案 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前缀。