valgrind необработанные байты инструкции: 0xF 0xB 0xFF 0x85 - PullRequest
1 голос
/ 28 июля 2011

Я попытался запустить мою программу, скомпилированную с Apple GCC 3.2.1 (принудительный 32-разрядный режим, только для x86) под valgrind 3.6.1 , но я получаю следующую ошибкуна этапе инициализации:

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 , я передаю эту область кода без проблем ...

Ответы [ 2 ]

3 голосов
/ 29 июля 2011

Последовательность байтов 0xF 0xB - это код операции UD2.

Это определенная «Неопределенная инструкция», если это имеет смысл: есть много возможных кодов операций, которые не являются допустимыми, но этотспециально зарезервировано как инструкция, которая гарантированно вызывает #UD недопустимое исключение кода операции, даже на будущих процессорах.

Существует одна (и я могу думать только об одной) неопределенно вероятная причина, по которой это может быть намеренно выполняется кодом: встроенная в GCC __builtin_trap() генерирует инструкцию UD2 на x86, и я иногда видел, что она используется вместо abort(), чтобы вызвать фатальную ошибку, которая будет обнаруженаотладчик.

0 голосов
/ 28 июля 2011

Я понятия не имею, помогает ли это, но это выглядит неопределенной инструкцией:

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

Больше похоже на: http://ref.x86asm.net/coder32.html#xFB

Похоже, что происходит какое-то низкоуровневое управление прерываниями (например, для семафоров).Но обычно это может быть сделано только привилегированными потоками в режиме ядра, поэтому я удивляюсь, почему этот код может это делать.не знаю много о инструкции прерывания в x86

...