2013-03-07 23 views
5

Per creare l'eseguibile .out, devo inserire:Programmazione C: come usare gdb con Makefile e argomenti della riga di comando?

$: make 
$: myprogram.out name.ged 

mio programma incorpora un argomento da riga di comando, così la "name.ged".

Ogni volta che corro gdb dopo aver ottenuto un errore di segmentazione (core dumped), entro in:

$: gdb a.out core 
(gdb): bt 

Ho quindi utilizzare il comando posteriore traccia e gdb rendimenti:

#0 0x4a145155 in ??() 
#1 0x08a16ce0 in ??() 

Ho anche provato usando il comando su t muovi in ​​cima allo stack, ma ancora senza fortuna. Non riesco a capire quale linea del mio programma mi stia dando il segnale di errore. gdb funziona con i miei altri programmi che non coinvolgono un Makefile e gli argomenti del comando, quindi mi chiedo se i miei comandi non sono corretti.

+4

È necessario compilare con il flag '-g'. Dato che non hai pubblicato il Makefile, non posso darti ulteriore aiuto. –

+0

Quindi il comando dovrebbe essere gcc -g myprogram.out name.ged? – Bonnie

+0

Nel file make c'è un comando per compilare il codice (gcc ...) Quel comando ha bisogno del flag -g per aggiungere ulteriori informazioni per far funzionare efficacemente gdb. –

risposta

7

Riassumere i commenti (prima che qualcun altro lo faccia :).

Nel file eseguibile mancano le informazioni simboliche su cui gdb deve visualizzare il codice sorgente pertinente. È necessario aggiungere l'opzione -g al comando di compilazione e produrre un nuovo eseguibile. Quindi rieseguire il test in errore per produrre un nuovo file core. gdb con questo eseguibile e core sarà in grado di mostrare lo stack di chiamate di funzione utilizzando backtrace.

In un makefile, il modo più semplice per farlo è aggiungere (a) la variabile CFLAGS che viene utilizzata con la regola implicita .o.c.

CFLAGS= -g -Wall -Wextra 

È inoltre possibile aggiungere questo direttamente alla riga di comando (assumendo una shell decente :). Imposta il valore come variabile di ambiente durante l'esecuzione del comando make (e dei comandi secondari).

$ CFLAGS='-g -Wall -Wextra' make 

mi piacerebbe davvero consiglio di aggiungere questo alla tua .profile bash, in modo da ottenere sempre il massimo informazioni dal compilatore.

CFLAGS='-Wall -Wextra' 

Poi, quando ne avete bisogno, mettere questo nel makefile per fare un eseguibile debuggable:

CFLAGS+= -g 
Problemi correlati