Co powoduje sygnał „SIGILL”?


92

Przenoszę kod C ++ do Androida przy użyciu NDK i GCC. Kod w zasadzie działa. W pewnym momencie podczas debugowania w Eclipse wywołanie

Dabbler::Android::Factory* pFactory = new Dabbler::Android::Factory;

powoduje ten błąd:

Thread [1] (Suspended: Signal 'SIGILL' received. Description: Illegal instruction.) 
    1 <symbol is not available> 0x812feb44

Co to znaczy? Czy kompilator z jakiegoś powodu wygenerował niedozwolony kod? Mam punkt przerwania w konstruktorze (który nic nie robi) i nie jest trafiony. Zrobiłem już pełną przebudowę.

Co mogłem zrobić źle, aby spowodować ten problem?

Odpowiedzi:


27

Oznacza to, że procesor próbował wykonać instrukcję, której nie zrozumiał. Może to być spowodowane korupcją, jak sądzę, lub może został skompilowany dla złej architektury (w takim przypadku pomyślałem, że system operacyjny odmówi uruchomienia pliku wykonywalnego). Nie do końca jestem pewien, na czym polega problem główny.


24
Inną przyczyną wykonania nieprawidłowej instrukcji jest przeskoczenie do adresu, który nie znajduje się w obszarze programu.
Paul Nathan,

Dziwne, dostałem to, kiedy skompilowałem z clang, ale działało dobrze z gcc
Post Self

22

Może to być jakiś niezainicjalizowany wskaźnik funkcji, w szczególności jeśli masz uszkodzoną pamięć (wtedy fałszywa tabela vtable w C ++ błędnych wskaźników do nieprawidłowych obiektów może to dać).

BTW gdbwatchpoints & tracepoints, a także valgrind mogą być przydatne (jeśli są dostępne) do debugowania takich problemów. Lub środek odkażający adres .


Dla mnie nie zwracałem żadnej wartości z funkcji, która miała zwrócić int. Więc trochę związane z tą odpowiedzią. Nie mam pojęcia, jak udało się skompilować.
Chris Watts

11

Upewnij się, że wszystkie funkcje o innym niż void zwracanym typie mają returninstrukcję.

Podczas gdy niektóre kompilatory automatycznie dostarczają domyślną wartość zwracaną, inne wysyłają SIGILL lub SIGTRAP w czasie wykonywania, próbując pozostawić funkcję bez wartości zwracanej.


Nie masz pojęcia, jak długo szukałem przyczyny SIGILL (QT + Android), aby znaleźć brakującą instrukcję powrotu w funkcji (zainspirowana Twoją odpowiedzią). Dziękuję Ci.
Vega4
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.