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?

Amator
źródło

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.

trojanfoe
źródło
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 .

Basile Starynkevitch
źródło
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.

Max Klint
źródło
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