2017-09-01 2 views
0

大規模なレガシーアプリケーションでメモリの問題をデバッグしており、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_opsline 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 

答えて

0

VEXはかなり新しいです。古いアーキテクチャを使用します(例: -march=pentium4はVEX命令のコーディングを禁止しますが、SSE2は保持します。

+0

@PaulFloyd:この用語は過負荷ですが、ここではx86 VEXエンコーディングを意味します。これは「未処理の命令バイト:0xC4 0xE2 0x7B 0xF7'」で見ることができます。 0xC4はx86 VEXプレフィックスです。 – MSalters

+0

私はVEXオペコードプレフィックスについて知らなかった。 Valgrind側では、このメッセージは関連していません。 VEX/priv/guest_x86_toIR.cには '/ *すべてのデコード失敗がここにあります。 */vex_printf( "vex x86-> IR:未処理命令バイト:" –

+0

@PaulFloyd:デコード失敗の_cause_は、Valgrindが解析できないx86 VEXエンコード命令である '0xC4 0xE2 0x7B 0xF7'命令です。'-march = pentium4'を使うことで、GCCはその' 0xC4'命令を生成せず、デコードの失敗を回避します。 – MSalters

1

はおそらく、あなたはdevtoolset-6-valgrindパッケージの形で、代わりにDTSからvalgrindの3.12を使用することができますか?

あなたがソフトウェアを再コンパイルを避ける可能性があるので、AVX2命令のサポートは、valgrindの3.9で追加されました。

+0

32ビットのCentOS 6は、devtools-3までしかサポートしていません。 valgrind 3.9のリリースノートは、「Intel AVX2命令のサポートです。これは64ビットでのみ利用可能です」... – Danny

-1

VEXはValgrind抽象機械表現である。それはValgrindの基本的な部分であり、あなたはそれをオフにすることはできません。 Valgrindのバージョンが理解できるマシンコードを出力するようにコンパイラに指示するか、またはAVXを理解するValgrindのより新しいバージョンにアップグレードする必要があります。

AVX dates from about 2011あなたが使用しているValgrindのバージョンは2012年9月にリリースされましたが、おそらくAVXサポートが追加されていませんでした。紛らわしく、これらの拡張も"VEX" prefixを使用します。この場合、Valgrindの「vex x86-> IR」メッセージは、AVG VEXプレフィックスではなくValgrindのVEXを指します。

+0

"Valgrindのバージョンが理解しているマシンコードを出力するようにコンパイラに指示する必要があります。「質問の再記述としての回答はそれほどありません。コンパイラはGCCです。 _how_ x86 VEXを使わずにx86マシンコードをGCCに出すのですか? – MSalters

+0

これはすでに回答済みです。しかし、将来の読者が "vex x86-> IR:未処理の命令バイト0xf 0x5"のようなエラーを持っていて、彼らがこの質問/回答を見つけたら、コンパイラのVEX/AVX生成を無効にすることは役に立たないでしょう。 –

関連する問題