Domanda

C'è qualche possibilità gcc posso impostare che mi darà il numero di riga del guasto di segmentazione?

So che posso:

  1. linea di debug per riga
  2. Mettere printfs nel codice di restringere.

Le modifiche:

  1. bt / where sul gdb dare No stack.
  2. utile suggerimento
È stato utile?

Soluzione

Non so di un'opzione gcc, ma si dovrebbe essere in grado di eseguire l'applicazione con gdb e poi quando si blocca, il tipo where di dare uno sguardo al camino, quando è uscita, che dovrebbe ottenere si chiude .

$ gdb blah
(gdb) run
(gdb) where

Modifica per completezza:

Si dovrebbe anche fare in modo di costruire l'applicazione con flag di debug utilizzando l'opzione di gcc -g per includere i numeri di riga nel file eseguibile.

Un'altra opzione è quella di utilizzare il comando bt (backtrace).

Altri suggerimenti

Ecco un guscio sessione di completa / gdb

$ gcc -ggdb myproj.c
$ gdb a.out
gdb> run --some-option=foo --other-option=bar
(gdb will say your program hit a segfault)
gdb> bt
(gdb prints a stack trace)
gdb> q
[are you sure, your program is still running]? y
$ emacs myproj.c # heh, I know what the error is now...

Felice l'hacking: -)

È possibile ottenere gcc per stampare una stacktrace quando il programma riceve un segnale SEGV, simile a come Java e altri linguaggi amichevoli gestire le eccezioni puntatore nullo. Vedere la mia risposta qui per maggiori dettagli:

La cosa bella di questo è che si può semplicemente lasciare nel codice; non è necessario eseguire le cose attraverso gdb per ottenere il bel output di debug.

Se si compila con -g e seguire le istruzioni, è possibile utilizzare uno strumento da riga di comando come addr2line per ottenere informazioni sul file / linea dall'output.

Esegui sotto Valgrind.

è inoltre necessario costruire con flag di debug on-g

È inoltre possibile aprire il core dump con gdb (è necessario -g però).

Se tutti i suggerimenti precedenti per la compilazione con il debug (-g) ed eseguiti in un debugger (gdb, Run, bt) non funziona per voi, allora:

  • elementare: Forse non sei in esecuzione nel debugger, si sta solo cercando di analizzare il core dump post mortem. (Se si avvia una sessione di debug, ma non si esegue il programma, o se esce, poi quando si chiede un backtrace, gdb dirà "No stack" - perché non c'è nessun programma in esecuzione a tutti Non dimenticare. di tipo "run"). Se si segfaulted, non dimenticare di aggiungere il terzo argomento (core) quando si esegue gdb, altrimenti si avvia nello stesso stato, non collegato a qualsiasi immagine di memoria particolare processo o.
  • Difficile: Se il vostro programma è / è stato davvero in esecuzione, ma il tuo gdb è dire "No stack" forse il vostro stack pointer è gravemente fracassato. In questo caso, si può essere un problema di buffer overflow da qualche parte, abbastanza grave da schiacciare il vostro stato di runtime del tutto. GCC 4.1 supporta la ProPolice "Stack Smashing Protector" che viene attivato con -fstack-protector-all. Esso può essere aggiunto a GCC 3.x con una patch.

Non esiste un metodo per GCC di fornire queste informazioni, si dovrà fare affidamento su un programma esterno come GDB.

GDB può dare la linea dove si è verificato un incidente con il comando "bt" (abbreviazione di "backtrace") dopo che il programma è Seg errore. Questo vi darà non solo la linea del disastro, ma l'intero stack del programma (in modo da poter vedere ciò che ha chiamato la funzione in cui l'incidente è accaduto).

Il No stack problema sembra accadere quando l'uscita programma di successo.

Per la cronaca, ho avuto questo problema perché avevo dimenticato un ritorno nel mio codice, che ha reso la mia uscita di programma con codice di errore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top