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

gcc / C++ Disable generation of vex instructions

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

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

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

VEX 很新。使用旧架构,例如-march=pentium4 将禁止 VEX 指令编码,但您保留 SSE2。

VEX 是 Valgrind 抽象机表示。它是 Valgrind 的基本组成部分,您无法将其关闭。您需要告诉编译器发出您的 Valgrind 版本可以理解的机器代码,或者升级到可以理解 AVX 的更新版本的 Valgrind。

AVXdates from about 2011 whilst the version of Valgrind that you are using was released in September 2012 and it probably hadn't added AVX support. Confusingly, these extensions also use a "VEX" prefix。在这种情况下,来自 Valgrind 的 "vex x86->IR" 消息指的是 Valgrind 的 VEX 而不是 AVX VEX 前缀。