Что вызывает сигнал «SIGILL»? - PullRequest
83 голосов
/ 26 октября 2011

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

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

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

Ответы [ 4 ]

673 голосов
/ 26 октября 2011

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

  1. похороните мертвого кота в полночь при полной луне
  2. Перезапустите эмулятор устройства Android

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

23 голосов
/ 26 октября 2011

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

21 голосов
/ 26 октября 2011

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

0 голосов
/ 11 июля 2019

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

...