Debug di core files in ambienti crosscompilati

From Ability
Jump to: navigation, search

Configurazione di GDB per l'analisi automatica dei core file in ambienti crosscompilati per ARM

  • Copiare il filesystem crosscompilato per ARM in 'release/'. Questo deve necessariamente contenere i binari non strippati o in alternativa i simboli di debug.
  • Creare il file per inizializzare gdb in relazione alla release in 'release/gdbinit.txt'. Sostituire alla variabile "$sysroot_release" la directory che contiene il filesystem.
# Setting della root del filesystem
set sysroot $sysroot_release

# Preporre alle path la root del filesystem
set solib-absolute-prefix $sysroot_release
set substitute-path /usr/src/debug $sysroot_release/usr/src/debug

# Specificare la posizione delle librerie
set solib-search-path $sysroot_release/usr/lib/

# Specificare la posizione dei simboli di debug, in caso siano separati dai binari
#set debug-file-directory $sysroot_release/usr/lib/debug
  • Può essere utile aggiungere in coda a 'release/gdbinit.txt' del codice per stampare in maniera leggibile le strutture dati standard C++, come in https://gist.github.com/4528704 .
  • L'inizializzazione fatta è sufficiente per eseguire gdb per analizzare interattivamente il corefile di esempio "core.foo" generato al crash del binario "/usr/bin/foo".
$ arm-none-linux-gnueabi-gdb "releases/usr/bin/foo" "cores/core.foo" -ix "releases/gdbinit.txt" 
  • Se si desidera una analisi per estrarre automaticamente stack trace e altre informazioni di debug, creare il file 'release/gdbrc.txt' con i comandi da eseguire in gdb.
# Mostra le librerie linkate dal binario e la disponibilità dei debug symbols
echo \n=== Info sharedlibrary\n
info sharedlibrary

# Mostra i thread in secuzione al momento del crash
echo \n=== Info threads\n
info threads

# Mostra il sommario del backtrace
echo \n=== Backtrace\n
backtrace

# Mostra il backtrace completo su tutti i thread
echo \n=== Thread apply all backtrace full\n
thread apply all backtrace full

# Mostra il contenuto dei registri al momento del crash
echo \n=== Info registers\n
info registers

# Disassembla la funzione in esecuzione al momento del crash
echo \n=== Disas\n
disas
  • Eseguire gdb in modo da analizzare il core file automaticamente e salvare l'output in "analysis/core.foo.analysis.txt" senza bisogno di iterazione con l'utente.
$ arm-none-linux-gnueabi-gdb "releases/usr/bin/foo" "cores/core.foo" -ix "releases/gdbinit.txt" -x "releases/gdbrc.txt" -batch > "analysis/core.foo.analysis.txt"