大規模なレガシーアプリケーションでメモリの問題をデバッグしており、Valgrindを使用してそれを追跡したいと考えています。アプリはACE/TAO CORBA libraryを使用していますが、Valgrindはライブラリ内の不正な "vex"命令を訴えています。gcc/C++ 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命令を無効にすることを示唆しました。しかし、まだ問題があります。
私がValgrindのを使用することができますので、私は完全にVEX命令の生成を無効にするにはどうすればよい
(興味のある方は、bit_ops
がline 956 of this file上で定義されている)私は-mno-sse2avx -mno-avx -mno-sse4.1 -mno-sse4.2 -mno-sse4 -mno-sse4a
を試みたが、Valgrindのはまだ::bit_ops()
でVEX命令を訴えますデバッグ?
プラットフォームは、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
@PaulFloyd:この用語は過負荷ですが、ここではx86 VEXエンコーディングを意味します。これは「未処理の命令バイト:0xC4 0xE2 0x7B 0xF7'」で見ることができます。 0xC4はx86 VEXプレフィックスです。 – MSalters
私はVEXオペコードプレフィックスについて知らなかった。 Valgrind側では、このメッセージは関連していません。 VEX/priv/guest_x86_toIR.cには '/ *すべてのデコード失敗がここにあります。 */vex_printf( "vex x86-> IR:未処理命令バイト:" –
@PaulFloyd:デコード失敗の_cause_は、Valgrindが解析できないx86 VEXエンコード命令である '0xC4 0xE2 0x7B 0xF7'命令です。'-march = pentium4'を使うことで、GCCはその' 0xC4'命令を生成せず、デコードの失敗を回避します。 – MSalters