web-dev-qa-db-fra.com

Valgrind Instruction non reconnue

J'ai le code suivant:

#include <iostream>
#include <random>

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

J'essaie de le profiler en utilisant valgrind, mais il dit:

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)  

Précédé de plusieurs instances de:

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

Je suis sur Debian en utilisant des paquets standard sur une plate-forme x86-64 compilant avec gcc 5.3.1 en utilisant valgrind-3.11.0. L'instruction illégale semble se trouver dans libstdc ++ 6.

Comment puis-je obtenir valgrind pour profiler mon code?

27
nwp

En fait, Valgrind émule votre programme avec un langage intermédiaire (VEX) pour savoir s'il découvre une violation de mémoire.

Ce langage VEX capture toutes les instructions de plusieurs assembleurs tels que i386, AMD64, arm, ... Mais, de temps en temps, il manque quelques instructions (en particulier des instructions spécialisées comme rdrand = qui est lié à l'ensemble d'instructions spécifiques AES).

Eh bien, c'est exactement ce qui s'est passé avec votre programme. Valgrind est probablement tombé sur une instruction inconnue et n'a pas pu la traduire dans le langage intermédiaire VEX.

Mais vous n'êtes pas le seul à faire la queue en attendant un correctif:

Voici n patch qui a été appliqué à Valgrind et qui peut résoudre le problème pour vous (en fonction de votre CPU).

Mais, la seule chose que vous pouvez faire est d'installer une version plus récente de Valgrind et espérons que l'instruction est prise en charge dans la dernière version.

32
perror