Cosa causa il segnale "SIGILL"?


90

Sto trasferendo del codice C ++ su Android utilizzando NDK e GCC. Il codice fondamentalmente viene eseguito. A un certo punto, durante il debug in Eclipse, la chiamata

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

causa questo errore:

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

Cosa significa? Il compilatore ha generato codice illegale per qualche motivo? Ho un punto di interruzione nel costruttore (che non fa nulla) e non viene raggiunto. Ho già fatto una ricostruzione completa.

Cosa potrei fare di sbagliato per causare questo problema?

Risposte:


27

Significa che la CPU ha tentato di eseguire un'istruzione che non comprendeva. Ciò potrebbe essere causato dalla corruzione immagino, o forse è stato compilato per l'architettura sbagliata (nel qual caso avrei pensato che il sistema operativo si sarebbe rifiutato di eseguire l'eseguibile). Non del tutto sicuro di quale sia il problema principale.


24
Un'altra causa dell'esecuzione di un'istruzione non valida è il salto a un indirizzo che non è nell'area del programma.
Paul Nathan

Strano, ho capito quando ho compilato con clang, ma ha funzionato bene con gcc
Post Self

22

Potrebbe trattarsi di un puntatore a funzione non inizializzato, in particolare se si dispone di memoria corrotta (quindi il falso vtable di puntatori C ++ errati a oggetti non validi potrebbe darlo).

gdbWatchpoint e tracepoint BTW e anche valgrind potrebbero essere utili (se disponibili) per eseguire il debug di tali problemi. O un disinfettante per indirizzi .


Per me, non stavo restituendo alcun valore da una funzione che avrebbe dovuto restituire un int. Quindi in qualche modo correlato a questa risposta. Non ho idea di come sia riuscito a compilare.
Chris Watts

11

Assicurati che tutte le funzioni con tipo restituito non void abbiano returnun'istruzione.

Mentre alcuni compilatori forniscono automaticamente un valore di ritorno predefinito, altri invieranno un SIGILL o SIGTRAP in fase di esecuzione quando si tenta di lasciare una funzione senza un valore di ritorno.


Non hai idea di quanto sono andato a cercare un motivo dietro SIGILL (QT + Android) solo per trovare un'istruzione di ritorno mancante in una funzione (ispirata dalla tua risposta). Grazie.
Vega4
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.