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的主要内容,如果未能解决你的问题,请参考以下文章