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. Недопустимая инструкция, кажется, находится внутри libstdc ++ 6.

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

24

Решение

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

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

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

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

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

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

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

28

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]