2012-04-10 15 views
5

Sto usando backtrace() e backtrace_symbols() per backtrace di uscita sul SIGSEGV e altri segnali in formato simile a questo:Come interpretare gli indirizzi backtrace per il debug con GDB

0: [0xb750818] 
1: /opt/server/libQtScript.so.4(+0x6f42a) [0xb782c42a] 
2: /opt/server/libQtScript.so.4(+0x7bffc) [0xb7838ffc] 
3: /opt/server/libQtScript.so.4(+0x86946) [0xb7843946] 
4: /opt/server/libQtScript.so.4(+0x7c4bc) [0xb78394bc] 
5: /opt/server/libQtScript.so.4(+0x86946) [0xb7843946] 
6: /opt/server/libQtScript.so.4(+0x9603e) [0xb785303e] 
7: /opt/server/libQtScript.so.4(_ZN12QScriptValue4callERKS_RK5QListIS_E+0x2e7) [0xb7891647] 

In questo caso particolare, telaio # 7 per me va bene, sebbene il frame 1-6 mi dia degli indirizzi "+ x" gentili.

Come ottenere la linea esatta in smontaggio per "+ 0x6f42a" e altri indirizzi in GDB? E quale frame # 0, senza modulo descritto, significa?

risposta

8

Come arrivare linea esatta a smontare per "+ 0x6f42a" e altri indirizzi a GDB?

gdb /opt/server/libQtScript.so.4 
(gdb) x/10i 0x6f42a 

Di solito si vorrà istruzioni eseguite prima 0x6f42a, quindi dovrete fare questo:

(gdb) x/20i 0x6f42a-30 

Ignorate le prime istruzioni: si potrebbe iniziare lo smontaggio da un mezzo di uno. Di solito il disassemblaggio si risincronizza dopo poche istruzioni e inizierà a mostrare il corretto flusso di istruzioni.

E quale frame # 0, senza modulo descritto, significa?

La libreria è stata spogliata dei simboli, così gli unici simboli che vedere (ad esempio _ZN12QScriptValue4callERKS_RK5QListIS_E) sono i esternamente visibili (aka esportati) quelli.

Ci sono file di simboli libQtScript.so.4.5.2.debug nella cartella QT_SOURCE/lib. Quindi forse dovrei copiare il file .debug vicino all'eseguibile per ottenere il backtrace con simboli completi?

GDB deve caricare i simboli da libQtScript.so.4.5.2.debug automaticamente se si imposta debug-file-directory a $QT_SOURCE/lib.

Aggiornamento:

I MENT ottenere backtrace con i simboli senza associare GDB

Non credo ci sia alcun supporto in backtace_symbols() per il caricamento dei file debuginfo separati.

+0

debug-file-directory è per GDB, ma sto ottenendo il backtrace con i simboli senza associare GDB. Come assicurarsi che backtrace_symbols() ottenga tutti i dati dei simboli? Il file .debug sarebbe sufficiente? Questi arresti anomali sono rari, quindi non posso semplicemente riprodurli nell'ambiente di sviluppo di mine. –

0

Se si dispone di libQTScript compilato con simboli di debug, si otterrà un backtrace migliore con nomi di funzioni e valori di parametro. Non so esattamente come estrarre le stesse informazioni senza simboli di debug (anche se dovrebbe essere possibile se si ha il file map-file o symbol-table corretto di libQTScript).

Ma il modo semplice è installare libqt con i simboli di debug ed eseguire nuovamente il backtrace. Se sono installate sia le librerie strippate che quelle di debug e gdb sceglie lo stripped, prova a puntare gdb alle librerie di debug con LD_LIBRARY_PATH = path/to/debug/libs. (Vedi questa risposta per un altro metodo per impostare il percorso How do I prepend a directory the library path when loading a core file in gdb on Linux)

+0

Ci sono file di simboli libQtScript.so.4.5.2.debug nella cartella QT_SOURCE/lib. Quindi forse dovrei copiare il file .debug vicino all'eseguibile per ottenere il backtrace con simboli completi? –

+0

Puoi dire a gdb di usare quel file come tabella dei simboli. Prova il comando add-symbol-file da gdb e controlla se funziona. Quindi digitare di nuovo bt per il backtrace. –

+0

Il file di aggiunta-simbolo vuole un indirizzo di memoria come argomento. Penso che puoi ottenere l'indirizzo esaminando l'output del comando: info sharedlibrary (avvia il debugging, quindi emetti il ​​comando info). –

Problemi correlati