2011-07-28 80 views
1

我试图运行我的苹果GCC 3.2.1(强制32位模式,仅适用于x86)下的valgrind 3.6.1编译的程序,但我得到以下初始化阶段出错:的valgrind未处理的指令字节:0xF 0XB 0xFF的0x85

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运行我的申请,我通过这个代码区没有问题...

+0

你可以用debug进行编译吗?也许它会给你一些更多的信息.​​...特别是解决地址'0x2a6c2a9' –

+0

它是只与这个应用程序或在这个系统上valgrind的一般问题? – Nobody

+0

是的,我正在运行我的应用程序的调试版本,这是valgrind遇到的唯一的应用程序... – Ryan

回答

3

的字节序列0xF 0xB是操作码UD2中断指令。

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

有一个(我只能想到一个)依稀似是而非的原因可能是故意通过代码执行:内置__builtin_trap()海合会产生x86上的UD2指令,而我偶尔看到使用而不是abort()导致一个致命的错误,将被调试器捕获。

+0

人...谢谢,马修,我会尝试看看吧,虽然我不知道为什么GDB没有问题,它... – Ryan

+0

该死!我错过了一个警告'不能传递非POD类型的对象...':(虽然,我仍然不明白为什么gdb没有非POD类型的问题... – Ryan

0

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

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

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

看起来是一些低级别中断管理回事(信号量为例)。但通常这只能通过内核模式下的特权线程完成,所以我不知道为什么代码可以做到这一点。


更有可能的是我是不正确有关该指令,但它会更有意义的valgrind不知道太多关于86

+0

这可能是调试打破(INT 3)或类似的东西? – Ryan

+0

你的意思是:http: //ref.x86asm.net/coder32.html#xCC指令 –

+0

它可能是'STI'指令(它需要IO特权)? –