C++ gcc/C++;禁用生成vex指令

C++ gcc/C++;禁用生成vex指令,c++,gcc,g++,valgrind,C++,Gcc,G++,Valgrind,我们正在调试大型遗留应用程序的内存问题,并希望使用Valgrind来跟踪它。然而,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 copy

我们正在调试大型遗留应用程序的内存问题,并希望使用Valgrind来跟踪它。然而,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)
,建议使用
-mno AVX
禁用AVX指令,这对某些事情有效。但是,仍然存在一些问题

我试过
-mno-sse2avx-mno-avx-mno-sse4.1-mno-sse4.2-mno-sse4-mno-sse4a
,但Valgrind仍然抱怨
中的vex指令::bit_ops()
(如果您感兴趣,在上定义了
bit_ops

如何完全禁用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

也许您可以使用DTS中的valgrind 3.12,以
devtoolset-6-valgrind
包的形式


valgrind 3.9中添加了对AVX2指令的支持,因此您可以避免重新编译软件。

也许您可以使用DTS中的valgrind 3.12,格式为
devtoolset-6-valgrind
软件包


valgrind 3.9中添加了对AVX2指令的支持,因此您可以避免重新编译软件。

VEX是一个非常新的版本。使用旧的体系结构,例如
-march=pentium4
将不允许VEX指令编码,但您保留SSE2。

VEX是一个全新的体系结构。使用旧的体系结构,例如
-march=pentium4
将不允许VEX指令编码,但保留SSE2。

是Valgrind抽象机器表示。这是Valgrind的一个基本部分,你不能关闭它。您需要告诉编译器发出您的Valgrind版本能够理解的机器代码,或者升级到能够理解AVX的Valgrind的最新版本


AVX,而您正在使用的Valgrind版本是在2012年9月发布的,它可能没有添加AVX支持。令人困惑的是,这些扩展还使用了一个。在这种情况下,来自Valgrind的“vex x86->IR”消息指的是Valgrind的vex,而不是AVX vex前缀。

是Valgrind抽象机器表示。这是Valgrind的一个基本部分,你不能关闭它。您需要告诉编译器发出您的Valgrind版本能够理解的机器代码,或者升级到能够理解AVX的Valgrind的最新版本


AVX,而您正在使用的Valgrind版本是在2012年9月发布的,它可能没有添加AVX支持。令人困惑的是,这些扩展还使用了一个。在这种情况下,来自Valgrind的“vex x86->IR”消息指的是Valgrind的vex,而不是AVX vex前缀。

32位Centos 6最多只支持devtools-3。valgrind 3.9的发行说明中说“支持英特尔AVX2指令。此指令仅在64位上提供”…32位Centos 6最多支持devtools-3。valgrind 3.9的发行说明中说“支持英特尔AVX2指令。这仅适用于64位”…@PaulFloyd:这个术语是重载的,但在这里它显然是指x86 VEX编码。您可以在“未处理的指令字节:
0xC4 0xE2 0x7B 0xF7
”中看到这一点。0xC4是x86 VEX前缀。我不知道VEX操作码前缀。在Valgrind方面,该消息与此无关。在VEX/priv/guest_x86_toIR.c中有
/*所有解码失败都在这里结束。*/vex_printf(“vex x86->IR:未处理的指令字节:”
@PaulFloyd:解码失败的原因是
0xC4 0xE2 0x7B 0xF7
指令,这是Valgrind无法解析的x86 VEX编码指令。通过使用
-march=pentium4
,GCC不会生成
0xC4
指令,从而避免了解码失败。我同意这是一个很好的解决方案。我只想更清楚的是,Valgrind的消息是一条通用消息。@PaulFloyd:该术语是重载的,但在这里它明确表示x86 VEX编码。您可以在“未处理的指令字节:
0xC4 0xE2 0x7B 0xF7
中看到这一点.0xC4是x86 VEX前缀。我不知道VEX操作码前缀。在Valgrind端,消息与此无关。在VEX/priv/guest_x86_toIR.c中有
/*所有解码失败都会在这里结束。*/VEX_printf(“VEX x86->IR:未处理的指令字节:”
@PaulFloyd:解码失败的原因是
0xC4 0xE2 0x7B 0xF7
指令,这是Valgrind无法解析的x86 VEX编码指令。通过使用
-march=pentium4
,GCC不会生成
0xC4
指令,从而避免了解码失败。我同意这是一个很好的解决方案。我只想更清楚的是,来自Valgrind的消息是一条通用消息。“您需要告诉编译器发出您的Valgrind版本能够理解的机器代码”与其说是对问题的回答,不如说是对问题的重述。编译器是GCC;如何让GCC在不使用x86 VEX的情况下发出x86机器代码?这一点已经得到了回答。但是,如果将来的读者遇到类似“VEX x86->IR:未处理指令字节0xf 0x5”的错误他们发现这个问题/答案,然后禁用编译器VEX/AVX生成不太可能有帮助。“您需要告诉编译器发出您的Valgrind版本能够理解的机器代码”与其说是对问题的回答,不如说是对问题的重述。编译器是GCC;如何让GCC在不使用x86 VEX的情况下发出x86机器代码?这一点已经得到了回答。但是,如果将来的读者遇到类似“VEX x86->IR:未处理指令字节0xf 0x5”的错误他们发现这个问题/答案,然后禁用编译器VEX/AVX生成不太可能有帮助。