[SOS] Encore des trucs pour debugger

David Decotigny david.decotigny at free.fr
Sam 11 Juin 17:49:37 CEST 2005


Bonjour,

Dans le magazine et par des messages de Thomas, on vous a donne quelques
trucs pour debugger. En voici un autre.

Imaginons que j'ai un defaut de page ou une assertion qui explose. Sur
mon terminal, j'ai droit au fameux "backtrace". Comment exploiter ce
backtrace sans trop se fatiguer ? En utilisant l'outil "addr2line" qui
utilise les symboles de debuggage presents dans "sos.elf".

Exemple :
-----------------------------------
[baloo] src/sos/sos/art1 >qemu -fda fd.img
warning: could not open /dev/net/tun: no virtual network emulation
Message in a bochs: This is SOS article 8 MASTER.
Unresolved page Fault at instruction 0x215dd7 on access to address 0x34
(info=0)!
[0] PC=0x208251 arg1=0x1 arg2=0x1 arg3=0xc
[1] PC=0x20b928 arg1=0x21b980 arg2=0x215dd7 arg3=0x34
[2] PC=0x20c033 arg1=0xe arg2=0x2e7ee0 arg3=0x100010
[3] PC=0x20215a arg1=0x215dd7 arg2=0x8 arg3=0x246
[4] PC=0x0 arg1=0x15000 arg2=0x24 arg3=0x0
[5] PC=0x215339 arg1=0x250460 arg2=0x0 arg3=0x0
[6] PC=0x2127d8 arg1=0x0 arg2=0x21240 arg3=0x0
[7] PC=0x20bb9f arg1=0x2badb002 arg2=0x2d8c0 arg3=0xffffffff
[8] PC=0x201011 arg1=0xffffffff arg2=0xffffffff arg3=0xffffffff
-----------------------------------

Je prends ma souris, je sélectionne tout ça, et, au prompt du shell, je
fais :
-----------------------------------
sed 's/.*PC=\(0x[0-9a-f]*\).*/\1/g' | addr2line -e sos.elf -f
-----------------------------------
Puis je copie dans le terminal ce que je viens de selectionner, je fais
"Ctrl-D", et j'obtiens :
-----------------------------------
sos_thread_dump_backtrace
sos/thread.c:858
sos_display_fatal_error
sos/assert.c:45
pgflt_ex
sos/main.c:355
sos_exception_wrapper_14
hwcore/exception_wrappers.S:232
??
??:0
virtfs_mount
drivers/fs_virtfs.c:642
sos_fs_subsystem_setup
sos/fs.c:102
sos_main
sos/main.c:2326
loop
bootstrap/multiboot.S:70
-----------------------------------

Qui me donne tout simplement le backtrace sous la forme d'une liste de :
-----------------------------------
nom_de_fonction
chemin_vers_source:numero_de_ligne
-----------------------------------

Bref, vous l'aurez compris, ca donne la meme chose que gdb. Mais voila,
quand on a oublie de lancer gdb avant, c'est une solution bien pratique.

C'etait le grand classique du jour.

Bonne journee,



Plus d'informations sur la liste de diffusion Sos