Ho un'applicazione da riga di comando che quando eseguito non fa ciò che dovrebbe fare e ad un certo punto lascia il messaggio:
Segmentation fault
Cosa significa questo? Cosa dovrei fare?
Ho un'applicazione da riga di comando che quando eseguito non fa ciò che dovrebbe fare e ad un certo punto lascia il messaggio:
Segmentation fault
Cosa significa questo? Cosa dovrei fare?
Risposte:
Un errore di segmentazione è il risultato di una violazione di accesso alla memoria. Il programma ha fatto riferimento a un indirizzo di memoria al di fuori di ciò che gli è stato assegnato e il kernel del sistema operativo risponde uccidendo il programma con SIGSEGV.
Questo è un errore, dal momento che non ha senso tentare di accedere alla memoria inaccessibile (non può essere fatto). Errori di questo tipo sono facili da fare, tuttavia, in particolare in linguaggi come C e C ++ (che rappresentano molte applicazioni comuni). Indica un bug nel programma stesso o in una libreria a cui si collega. Se si desidera segnalare il bug (fare - questo aiuta), è una buona idea includere un backtrace degli eventi che hanno portato all'errore di seg.
Per fare ciò, è possibile eseguire il programma all'interno gdb
(il debugger GNU), che dovrebbe essere disponibile da qualsiasi distribuzione Linux se non è già installato (il pacchetto si chiamerà semplicemente "gdb"). Se l'applicazione rotta si chiama "brokenapp":
gdb brokenapp
Apparirà un paragrafo sul copyright e le licenze e alla fine un prompt con il cursore:
(gdb) _
Digita run
e premi invio. Se è necessario fornire argomenti (ad es. -x --foo=bar whatever
) Aggiungere quelli ( run -x --foo=bar whatever
). Il programma farà quello che fa, vedrai l'output e se hai bisogno di interagire puoi (nota che puoi eseguire qualsiasi tipo di programma, incluso un GUI, all'interno di gdb). Nel punto in cui di solito segfault vedrai:
Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _
La seconda riga di output qui è solo un esempio. Ora digita bt
(per "backtrace") e premi invio. Vedrai qualcosa del genere, anche se potrebbe essere molto più lungo:
(gdb) bt
#0 0x00000000006031c9 in ?? ()
#1 0x000000000040157f in mishap::what() const ()
#2 0x0000000000401377 in main ()
Se è più lungo, otterrai solo uno schermo alla volta e ci sarà un --More--
messaggio. Continua a premere invio fino al termine. Ora puoi quit
, l'output rimarrà nel tuo terminale. Copia tutto da quel momento Program received signal SIGSEGV
in un file di testo e invia una segnalazione di bug con il bug tracker dell'applicazione; puoi trovarli online cercando, ad es. "segnalazione di bug rotti" - probabilmente dovrai registrarti per poterti inviare una risposta via e-mail. Includi la descrizione del problema, eventuali argomenti forniti run
, ecc. E una copia del backtrace (se è molto lungo, potrebbe esserci un modo per allegare un file di testo nell'interfaccia del tracker dei bug). Includi anche la versione, se sai di cosa si tratta ( brokenapp --version
potrebbe funzionare o la pagina man potrebbe indicare come ottenerla),
Si spera che qualcuno ti risponderà tra non molto tempo. La presentazione di bug è generalmente apprezzata.
gdb
fa molte cose . Si desidera passare alla sezione 5.1
Ciò significa che l'applicazione ha un bug.
Se sei un utente finale, devi contattare il fornitore dell'applicazione.
Se è la tua applicazione, puoi:
$ ulimit -c unlimited
$ ./yourapp
$ gdb ./yourapp core
I file core saranno anche molto utili per gli sviluppatori diversi da te: contengono lo stato completo del programma al momento del crash; se hai intenzione di presentare una segnalazione di bug, allegarli e in alcuni casi al file binario dell'app. Tieni presente che ci sono poche possibilità che i tuoi dati personali come numeri di account, password e simili possano rimanere in memoria del programma al momento del crash. In molti casi, la segnalazione del solo backtrace del thread bloccato è di grande aiuto per gli sviluppatori per trovare il problema. Per ottenere il backtrace, è possibile caricare il file core con debugger (come gdb executable corefile
).