2016-05-04 5 views
15

Ho il seguente codice:Valgrind non riconosciuto istruzioni

#include <iostream> 
#include <random> 

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

cerco di profilo utilizzando valgrind, ma dice:

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) 

Preceduto da più istanze di:

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

Sono su Debian usando pacchetti standard su una piattaforma x86-64 compilando gcc 5.3.1 usando valgr ind-3.11.0. L'istruzione illegale sembra essere all'interno di libstdC++ 6.

Come ottengo valgrind per profilare il mio codice?

risposta

21

Infatti, Valgrind emula il tuo programma con una lingua intermedia (VEX) per sapere se rileva la violazione della memoria.

Questa cattura lingua VEX tutte le istruzioni di diversi assemblatori, come i386, amd64, braccio, ... Ma, di tanto in tanto, è perdere qualche manuale (in particolare quelli specializzati come rdrand che è collegato al AES specifica set di istruzioni).

Bene, questo è esattamente quello che è successo con il tuo programma. Probabilmente Valgrind si è imbattuto in un'istruzione sconosciuta e non è riuscito a tradurlo nella lingua intermedia VEX.

Ma, non sono l'unico ad essere in linea in attesa di una correzione:

Ecco a patch che è stato applicato per Valgrind e che possono risolvere il problema per voi (a seconda della CPU).

Tuttavia, l'unica cosa che si può fare è installare una versione più recente di Valgrind e sperare che l'istruzione sia supportata nella versione più recente.

+1

Cambiare quell'unico carattere [nella patch collegata] (https://github.com/svn2github/valgrind-vex/commit/1ab61656f71e94ce12b68de87f1e28cf3dc0c18c) ha fatto il trucco, ora valgrind fa la cosa giusta. – nwp