2016-05-04 21 views
15

は、私は次のコードを持っている:Valgrindは認識できない命令

#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 

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

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

答えて

21

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

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

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

  • 同じ問題:

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

  • KDE bugtrackerに同じ問題があります。
  • ...のように...

はここでValgrindのに適用されているa patchであり、その(あなたのCPUに依存)あなたのための問題を解決することがあります。

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

+1

[パッチ内のリンクされた]の1文字(https://github.com/svn2github/valgrind-vex/commit/1ab61656f71e94ce12b68de87f1e28cf3dc0c18c)を変更すると、valgrindが正しく機能するようになりました。 – nwp

関連する問題