2016-05-04 10 views
15

Ich habe den folgenden Code:Valgrind Unerkannte Anweisung

#include <iostream> 
#include <random> 

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

Ich versuche es zum Profil valgrind verwenden, aber es sagt:

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) 

Vorgänger mehrere Instanzen:

--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 

Ich bin auf Debian mit Standard-Paketen auf einer x86-64-Plattform kompiliert mit gcc 5.3.1 mit valgr ind-3.11.0. Die illegale Anweisung scheint innerhalb von libstdC++ 6 zu liegen.

Wie bekomme ich valgrind, um meinen Code zu profilieren?

Antwort

21

In der Tat, Valgrind emulieren Ihr Programm mit einer Zwischensprache (VEX) zu wissen, ob es Speicherverletzung entdeckt.

Diese VEX-Sprache erfasst alle Anweisungen mehrerer Assembler wie i386, amd64, arm, ... Aber von Zeit zu Zeit fehlen einige Anweisungen (besonders spezialisierte wie rdrand, die mit dem AES-spezifischen verknüpft sind) Anweisungen eingestellt).

Nun, genau das ist mit Ihrem Programm passiert. Valgrind ist wahrscheinlich auf eine unbekannte Anweisung gestoßen und konnte sie nicht in die VEX-Zwischensprache übersetzen.

Aber sind Sie nicht der einzige in der Linie für einen Fix warten zu sein:

Hier a patch, die Valgrind angewendet wurde und dass lösen das Problem für Sie können (auf der CPU abhängig).

Aber das einzige, was Sie tun können, ist eine neuere Version von Valgrind zu installieren und hoffen, dass die Anweisung in der neuesten Version unterstützt wird.

+1

Das Ändern dieses einen Charakters [in dem Patch, den du verlinkt hast] (https://github.com/svn2github/valgrind-vex/commit/1ab61656f71e94ce12b68de87f1e28cf3dc0c18c) hat den Trick gemacht, Valgrind macht jetzt das Richtige. – nwp