valgrind 未处理的指令字节:0xF 0xB 0xFF 0x85

Posted

技术标签:

【中文标题】valgrind 未处理的指令字节:0xF 0xB 0xFF 0x85【英文标题】:valgrind unhandled instruction bytes: 0xF 0xB 0xFF 0x85 【发布时间】:2011-07-28 12:53:49 【问题描述】:

我尝试在 valgrind 3.6.1 下运行使用 Apple GCC 3.2.1(强制 32 位模式,仅限 x86)编译的程序,但我得到了初始化阶段出现以下错误:

vex x86->IR: unhandled instruction bytes: 0xF 0xB 0xFF 0x85
==80746== valgrind: Unrecognised instruction at address 0x2a6c2a9.
==80746== Your program just tried to execute an instruction that Valgrind
==80746== did not recognise.  There are two possible reasons for this.
==80746== 1. Your program has a bug and erroneously jumped to a non-code
==80746==    location.  If you are running Memcheck and you just saw a
==80746==    warning about a bad jump, it's probably your program's fault.
==80746== 2. The instruction is legitimate but Valgrind doesn't handle it,
==80746==    i.e. it's Valgrind's fault.  If you think this is the case or
==80746==    you are not sure, please let us know and we'll try to fix it.
==80746== Either way, Valgrind will now raise a SIGILL signal which will
==80746== probably kill your program.
==80746== 
==80746== Process terminating with default action of signal 4 (SIGILL)
==80746==  Illegal opcode at address 0x2A6C2A9

你能告诉我这条指令是什么,我该怎么做吗?如果我在 gdb 下运行我的应用程序,我会毫无问题地通过此代码区域...

【问题讨论】:

你能用debug编译吗?也许它会给你更多的信息.​​.....特别是解析地址0x2a6c2a9 只是这个应用程序还是这个系统上 valgrind 的一般问题? 是的,我正在运行我的应用程序的调试版本,这是 valgrind 唯一遇到问题的应用程序... 那么你知道你在那个地址做什么吗?我知道在 GDB 中,您可以通过 list *address 通过地址获取源代码。但这并没有太大帮助,因为在运行 valgrind 时,程序的位置与在 gdb 中再次运行时不同 在 valgrind 命令上通过--db-attach=yes 将调试器添加到 valgrind,这将(希望)在发生错误时要求您附加,然后您可以在给定的地址上执行list *address 【参考方案1】:

字节序列0xF 0xB是操作码UD2

这是一个已定义的“未定义指令”,如果这有意义的话:有许多可能的操作码是不合法的,但这个是专门保留为保证引发#UD 无效操作码异常的指令,甚至在未来的处理器上。

有一个(我只能想到一个)模糊合理的原因说明它可能故意由代码执行:GCC 内置 __builtin_trap() 在 x86 上生成 UD2 指令,我偶尔会看到用它代替 abort() 会导致致命错误,该错误将被调试器捕获。

【讨论】:

伙计...谢谢,马修,我会尝试调查一下,虽然我不知道为什么 gdb 没有问题... 该死!我错过了一个警告'不能传递非 POD 类型的对象......' :(虽然,我仍然不明白为什么 gdb 对非 POD 类型没有问题......【参考方案2】:

我不知道这是否有帮助,但这看起来是一个未定义的指令:

http://ref.x86asm.net/coder32.html#x0F0B

更多类似:http://ref.x86asm.net/coder32.html#xFB

看起来正在进行一些低级别的中断管理(例如对于信号量)。但是通常这只能由内核模式下的特权线程完成,所以我想知道为什么那个代码可以做到。


我更可能对哪条指令不正确,但 valgrind 对 x86 中的中断指令知之甚少是有道理的

【讨论】:

这可能是调试中断(int 3)或类似的东西吗? 会不会是 STI 指令(需要 IO 权限)? 这与中断无关。这是针对操作码 ud2,故意未定义 @Bob Heh,是的,看起来是这样 :) 我没想到会弹出未定义的指令,但我想这只是其中一种罕见的情况

以上是关于valgrind 未处理的指令字节:0xF 0xB 0xFF 0x85的主要内容,如果未能解决你的问题,请参考以下文章

生成随机中文

hdu2030汉字统计

php随机生成汉字

PCI 设备的前64字节寄存器布局

python 随机生成汉字

在 Valgrind 中是不是需要处理仍然可访问的内存?