web-dev-qa-db-ja.com

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  

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

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

27
nwp

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

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

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

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

これがValgrindに適用された パッチ であり、可能性があります(CPUによって異なります)。

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

32
perror