代码之家  ›  专栏  ›  技术社区  ›  Danny

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

  •  0
  • Danny  · 技术社区  · 7 年前

    我们正在调试我们的大型遗留应用程序的内存问题,并希望使用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 建议使用禁用AVX指令 -mno-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进行调试?

    (请不要建议移动到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 回复  |  直到 7 年前
        1
  •  1
  •   MSalters    7 年前

    VEX是一个新事物。使用旧架构,例如。 -march=pentium4

        2
  •  1
  •   Florian Weimer    7 年前

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

        3
  •  0
  •   Paul Floyd    7 年前

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

    AVX公司 dates from about 2011 虽然您使用的Valgrind版本于2012年9月发布,但它可能没有添加AVX支持。令人困惑的是,这些扩展还使用 "VEX" prefix