Что вызывает сигнал 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

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

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

Dabbler
источник

Ответы:

27

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

Trojanfoe
источник
24
Другой причиной выполнения недопустимой инструкции является переход по адресу, который не находится в программной области.
Пол Натан
Странно, у меня это получилось, когда я скомпилировал с помощью clang, но он отлично работал с gcc
Post Self
22

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

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

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

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

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

Макс Клинт
источник
Вы не представляете, как долго я искал причину SIGILL (QT + Android), просто чтобы найти отсутствующий оператор возврата в функции (вдохновленный вашим ответом). Спасибо.
Vega4