30

次のコードがあります。

#include <iostream>
#include <random>

int main() {
    std::mt19937_64 rng(std::random_device{}());
    std::cout << std::uniform_int_distribution<>(0, 100)(rng) << '\n';
}

を使用してプロファイリングしようとしましvalgrindたが、次のように表示されます。

vex amd64->IR: unhandled instruction bytes: 0xF 0xC7 0xF0 0x89 0x6 0xF 0x42 0xC1
vex amd64->IR:   REX=0 REX.W=0 REX.R=0 REX.X=0 REX.B=0
vex amd64->IR:   VEX=0 VEX.L=0 VEX.nVVVV=0x0 ESC=0F
vex amd64->IR:   PFX.66=0 PFX.F2=0 PFX.F3=0
==2092== valgrind: Unrecognised instruction at address 0x4cdc1b5.  
==2092== at 0x4CDC1B5:std::(anonymous namespace)::__x86_rdrand() (random.cc:69)  
==2092== by 0x4CDC321: std::random_device::_M_getval() (random.cc:130)  
==2092== by 0x4009D4: main (random.h:1619)  

次の複数のインスタンスが先行します:

--2092-- WARNING: Serious error when reading debug info  
--2092-- When reading debug info from /lib/x86_64-linux-gnu/ld-2.22.so:  
--2092-- Ignoring non-Dwarf2/3/4 block in .debug_info  

私は、valgrind-3.11.0 を使用して gcc 5.3.1 でコンパイルする x86-64 プラットフォームで標準パッケージを使用して Debian を使用しています。不正な命令は libstdc++6 内にあるようです。

valgrindコードをプロファイリングするにはどうすればよいですか?

4

1 に答える 1

34

実際、Valgrind は中間言語 (VEX) を使用してプログラムをエミュレートし、メモリ違反を検出したかどうかを確認します。

この VEX 言語は、i386、amd64、arm などのいくつかのアセンブラのすべての命令をキャプチャしますが、時々、いくつかの命令が欠落します (特にrdrand、AES 固有の命令セットにリンクされているような特殊な命令)。

さて、これはまさにあなたのプログラムで起こったことです。Valgrind はおそらく未知の命令に出くわし、それを VEX 中間言語に変換できませんでした。

しかし、修正を待っているのはあなただけではありません。

これは、 Valgrind に適用されたパッチであり、問​​題を解決する可能性があります (CPU によって異なります)。

ただし、できることは、新しいバージョンの Valgrind をインストールして、その命令が最新バージョンでサポートされることを願うことだけです。

于 2016-05-04T16:02:27.143 に答える