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