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  

Я на Debian, используя стандартные пакеты на платформе x86-64, компилирующую с gcc 5.3.1, используя valgrind-3.11.0. Похоже, что незаконная инструкция находится внутри libstdС++ 6.

Как мне получить valgrind для профайла моего кода?

Ответ 1

Фактически, Valgrind эмулирует вашу программу с промежуточным языком (VEX), чтобы узнать, обнаруживает ли это нарушение памяти.

Этот язык VEX фиксирует все инструкции нескольких сборщиков, таких как i386, amd64, arm,... Но время от времени он пропускает несколько инструкций (особенно специализированные, такие как rdrand, который связан с определенным набором инструкций AES).

Ну, это именно то, что произошло с вашей программой. Valgrind, вероятно, наткнулся на неизвестную инструкцию и не смог перевести ее на промежуточный язык VEX.

Но вы не единственный, кто находится в очереди, ожидая исправления:

  • Такая же проблема на Launchpad.
  • Такая же проблема в KDE bugtracker.
  • ... и т.д.

Вот патч, который был применен к Valgrind, и что может решить проблему для вас (в зависимости от вашего процессора).

Но единственное, что вы можете сделать, это установить более новую версию Valgrind и надеяться, что инструкция будет поддерживаться в самой новой версии.