Was verursacht das Signal 'SIGILL'?

90

Ich portiere C ++ - Code mit NDK und GCC auf Android. Der Code läuft grundsätzlich. Einmal, beim Debuggen in Eclipse, der Aufruf

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

verursacht diesen Fehler:

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

Was bedeutet das? Hat der Compiler aus irgendeinem Grund illegalen Code generiert? Ich habe einen Haltepunkt im Konstruktor (der nichts tut) und er wird nicht getroffen. Ich habe bereits einen vollständigen Umbau durchgeführt.

Was könnte ich falsch machen, um dieses Problem zu verursachen?

Dabbler
quelle

Antworten:

27

Dies bedeutet, dass die CPU versucht hat, eine Anweisung auszuführen, die sie nicht verstanden hat. Dies könnte durch Korruption verursacht werden, oder es wurde möglicherweise für die falsche Architektur kompiliert (in diesem Fall hätte ich gedacht, dass das Betriebssystem die Ausführung der ausführbaren Datei ablehnen würde). Ich bin mir nicht ganz sicher, wo das Hauptproblem liegt.

Trojaner
quelle
24
Eine weitere Ursache für die Ausführung einer ungültigen Anweisung ist das Springen zu einer Adresse, die sich nicht im Programmbereich befindet.
Paul Nathan
Seltsam, ich habe das bekommen, als ich mit clang kompiliert habe, aber es hat gut mit gcc funktioniert
Post Self
22

Es könnte sich um einen nicht initialisierten Funktionszeiger handeln, insbesondere wenn Sie den Speicher beschädigt haben (dann könnte die falsche Tabelle mit fehlerhaften C ++ - Zeigern auf ungültige Objekte dies anzeigen).

BTW gdbBeobachtungspunkte & Trace, und auch valgrind könnte nützlich sein (falls vorhanden) solche Probleme zu debuggen. Oder ein Adressdesinfektionsmittel .

Basile Starynkevitch
quelle
Für mich gab ich keinen Wert von einer Funktion zurück, die ein int zurückgeben sollte. Also etwas verwandt mit dieser Antwort. Keine Ahnung, wie es gelungen ist zu kompilieren.
Chris Watts
11

Stellen Sie sicher, dass alle Funktionen mit dem Rückgabetyp nicht ungültig eine returnAnweisung haben.

Während einige Compiler automatisch einen Standardrückgabewert bereitstellen, senden andere zur Laufzeit ein SIGILL oder SIGTRAP, wenn sie versuchen, eine Funktion ohne Rückgabewert zu belassen.

Max Klint
quelle
Sie haben keine Ahnung, wie lange ich nach einem Grund für SIGILL (QT + Android) gesucht habe, um eine fehlende return-Anweisung in einer Funktion zu finden (inspiriert von Ihrer Antwort). Danke dir.
Vega4