Що викликає сигнал "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

Це означає, що центральний процесор намагався виконати інструкцію, яку не зрозумів. Це може бути спричинено корупцією, напевно, або, можливо, вона скомпільована для неправильної архітектури (у такому випадку я міг би подумати, що O / S відмовляється запускати виконуваний файл). Не зовсім впевнений, у чому полягає коренева проблема.


24
Ще однією причиною виконання недійсної інструкції є перехід на адресу, яка не в області програми.
Пол Натан

Дивно, це я зрозумів, коли компілював із clang, але з gcc це спрацювало
Post Self

22

Це може бути якийсь неініціалізований вказівник на функцію, зокрема, якщо у вас пошкоджена пам’ять (тоді це може дати підроблена таблиця неправильних вказівників C ++ на недійсні об’єкти).

BTW gdbконтрольні точки та контрольні точки, а також valgrind можуть бути корисними (якщо такі є) для налагодження таких проблем. Або якийсь дезінфікуючий засіб .


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

11

Переконайтеся, що всі функції з недійсним типом повернення мають returnоператор.

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


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