c++ - Valgrind instrucción no reconocida
libstdc++ gcc5 (1)
Tengo el siguiente código:
#include <iostream>
#include <random>
int main() {
std::mt19937_64 rng(std::random_device{}());
std::cout << std::uniform_int_distribution<>(0, 100)(rng) << ''/n'';
}
Intento perfilarlo usando valgrind
, pero 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)
Precedido por múltiples instancias 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
Estoy en Debian usando paquetes estándar en una plataforma x86-64 compilando con gcc 5.3.1 usando valgrind-3.11.0. La instrucción ilegal parece estar dentro de libstdc ++ 6.
¿Cómo puedo hacer que valgrind
mi código?
De hecho, Valgrind emula su programa con un lenguaje intermedio (VEX) para saber si descubre una violación de memoria.
Este lenguaje VEX captura todas las instrucciones de varios ensambladores como i386, amd64, arm, ... Pero, de vez en cuando, faltan algunas instrucciones (especialmente las especializadas como rdrand
que está vinculada al conjunto de instrucciones específicas de AES).
Bueno, esto es exactamente lo que pasó con tu programa. Valgrind probablemente tropezó con una instrucción desconocida y no pudo traducirla al lenguaje intermedio VEX.
Pero, no eres el único que está en línea esperando una solución:
- Mismo problema en Launchpad .
- El mismo problema en KDE bugtracker .
- ... y así ...
Aquí hay un parche que se ha aplicado a Valgrind y que puede resolver el problema por usted (dependiendo de su CPU).
Pero, lo único que puede hacer es instalar una versión más reciente de Valgrind y esperar que la instrucción sea compatible con la versión más reciente.