【问题标题】:Valgrind Unrecognised instructionValgrind 无法识别的指令
【发布时间】:2016-08-30 03:55:37
【问题描述】:

我有以下代码:

#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 分析我的代码?

【问题讨论】:

    标签: c++ valgrind libstdc++ gcc5


    【解决方案1】:

    事实上,Valgrind 使用中间语言 (VEX) 模拟您的程序,以了解它是否发现内存违规。

    这种 VEX 语言捕获了几个汇编程序的所有指令,例如 i386、amd64、arm ......但是,它有时会丢失一些指令(尤其是与 AES 相关的 rdrand 等专用指令具体指令集)。

    嗯,这正是您的程序发生的情况。 Valgrind 确实可能偶然发现了一条未知指令,无法将其翻译成 VEX 中间语言。

    但是,你不是唯一一个排队等待修复的人:

    这是已应用于 Valgrind 的 a patch,它可能为您解决问题(取决于您的 CPU)。

    但是,您唯一能做的就是安装更新版本的 Valgrind,并希望最新版本支持该指令。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多