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

Я портирую некоторый код 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

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

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

Ответ 1

Теперь он работает. Для всех, кто борется с Android/NDK/GCC/Eclipse, вот как я его решил:

  • Похороните мертвую кошку в полночь, когда полная луна
  • Перезапустите эмулятор устройства Android.

Не проверено, действительно ли оба действия необходимы, а если нет, то какой из них избыточен.

Ответ 2

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

Ответ 3

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

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

Ответ 4

Если вы переносите код из gcc в clang и начинаете получать SIGILL или SIGTRAP в последнем операторе некоторой функции, то убедитесь, что функция имеет оператор return если она была объявлена с типом возврата, отличным от void.