Valgrind 无法识别的指令
Valgrind Unrecognised instruction
我有以下代码:
#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 平台上的标准包,使用 valgrind-3.11.0 使用 gcc 5.3.1 进行编译。非法指令似乎在 libstdc++6.
如何 valgrind
分析我的代码?
事实上,Valgrind 使用中间语言 (VEX) 模拟您的程序,以了解它是否发现内存违规。
这种 VEX 语言捕获了几个汇编器的所有指令,例如 i386、amd64、arm ……但是,有时它会遗漏一些指令(尤其是像 rdrand
这样的专用指令链接到 AES 特定指令集)。
好吧,这正是您的程序所发生的事情。 Valgrind 确实可能偶然发现了一条未知指令,无法将其翻译成 VEX 中间语言。
但是,您不是唯一排队等待修复的人:
- Launchpad 上的相同问题。
- KDE bugtracker 上的相同问题。
- ...等等...
这里是a patch已经应用于Valgrind,可能为你解决问题(取决于你的CPU)。
但是,您唯一能做的就是安装更新版本的 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 平台上的标准包,使用 valgrind-3.11.0 使用 gcc 5.3.1 进行编译。非法指令似乎在 libstdc++6.
如何 valgrind
分析我的代码?
事实上,Valgrind 使用中间语言 (VEX) 模拟您的程序,以了解它是否发现内存违规。
这种 VEX 语言捕获了几个汇编器的所有指令,例如 i386、amd64、arm ……但是,有时它会遗漏一些指令(尤其是像 rdrand
这样的专用指令链接到 AES 特定指令集)。
好吧,这正是您的程序所发生的事情。 Valgrind 确实可能偶然发现了一条未知指令,无法将其翻译成 VEX 中间语言。
但是,您不是唯一排队等待修复的人:
- Launchpad 上的相同问题。
- KDE bugtracker 上的相同问题。
- ...等等...
这里是a patch已经应用于Valgrind,可能为你解决问题(取决于你的CPU)。
但是,您唯一能做的就是安装更新版本的 Valgrind,并希望该指令在最新版本中得到支持。