Что вызывает сигнал SIGILL?


92

Я портирую код C ++ на Android с помощью NDK и GCC. Код в основном работает. В какой-то момент при отладке в Eclipse вызов

Dabbler::Android::Factory* pFactory = new Dabbler::Android::Factory;

вызывает эту ошибку:

Thread [1] (Suspended: Signal 'SIGILL' received. Description: Illegal instruction.) 
    1 <symbol is not available> 0x812feb44

Что это значит? Компилятор по какой-то причине сгенерировал недопустимый код? У меня есть точка останова в конструкторе (который ничего не делает), и он не попадает. Я уже сделал полную перестройку.

Что я мог делать не так, чтобы вызвать эту проблему?

Ответы:


27

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


24
Другой причиной выполнения недопустимой инструкции является переход по адресу, который не находится в программной области.
Пол Натан

Странно, у меня это получилось, когда я скомпилировал с помощью clang, но он отлично работал с gcc
Post Self

22

Это может быть какой-то неинициализированный указатель на функцию, в частности, если у вас повреждена память (тогда это может дать фиктивная vtable плохих указателей C ++ на недопустимые объекты).

BTW точки gdbнаблюдения и трассировки, а также valgrind могут быть полезны (если доступны) для отладки таких проблем. Или какое-нибудь дезинфицирующее средство для адресов .


Для меня я не возвращал никакого значения из функции, которая должна была возвращать int. Так что немного связано с этим ответом. Не знаю, как это удалось скомпилировать.
Крис Уоттс

11

Убедитесь, что все функции с ненулевым типом возврата имеют returnоператор.

В то время как некоторые компиляторы автоматически предоставляют возвращаемое значение по умолчанию, другие отправляют SIGILL или SIGTRAP во время выполнения при попытке оставить функцию без возвращаемого значения.


Вы не представляете, как долго я искал причину SIGILL (QT + Android), просто чтобы найти отсутствующий оператор возврата в функции (вдохновленный вашим ответом). Спасибо.
Vega4
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.