La technique est décrite ici :
http://unixhelp.ed.ac.uk/CGI/man-cgi?strip
– Link the executable as normal
– Copy "foo" to "foo.full" ou "objcopy –only-keep-debug foo foo.full"
– Run "strip –strip-debug foo"
– Run "objcopy –add-gnu-debuglink=foo.full foo"
La commande « symbol-file » doit pouvoir permettre d’aller lire les symboles depuis un autre fichier que le fichier courant.
Pour add-symbol-file il faut connaître l’adresse à laquelle on souhaite lire les symboles.
La page suivante décrit la technique pour déterminer cette adresse :
http://linux-mobile-hacker.blogspot.com/2008/02/debug-shared-library-with-gdbserver.html
# cat /proc/pid_proc/maps b7f11000-b7f12000 r-xp 00000000 08:02 1759414 /usr/lib/libfoo.so b7f12000-b7f13000 rw-p 00000000 08:02 1759414 /usr/lib/libfoo.so # objdump -h /usr/lib/libfoo.so grep text .text 00000154 000002f0 000002f0 000002f0 2**4 (gdb) ADDR=0xb7f11000+0x000002f0=0xb7f112f0 (gdb) add-symbol-file libfoo.so 0xb7f112f0
Sinon on peut créer un core après un attach avec la commande generate-core-file
Ou bien directement en ligne de commande : gcore <pid>
http://wiki.debian.org/HowToGetABacktrace
thread apply all bt 10
Ignorer les signaux qui ne nous intéressent pas :
handle SIGPIPE nostop noprint pass
http://tedlab.mit.edu/~dr/gdbintro.html
finish (fin)
Continue until the current function has returned.
until (u) [function][line]
Continue until the program reaches a source line greater than the current one
Au passage pour voir précisément les secondes avec ls :
ls --time-style="full-iso" -l mbox
ou bien
ls --time-style="+%d-%m-%y %H:%M:%S" -l mbox
Pour les registres : http://sunsite.ualberta.ca/Documentation/Gnu/gdb-4.18/html_node/gdb_61.html
info registers
Par exemple :
x/x $rdi+40
Au passage :
set print demangle on set print asm-demangle on set disassembly-flavor intel disassemble /m
Pour placer un breakpoint hardware sur une données :
watch logger ## logger est le nom d'une variable
Cf http://sunsite.ualberta.ca/Documentation/Gnu/gdb-4.18/html_node/gdb_30.html#SEC30
D’autres détails utile à lire :
– stackoverflow – GDB hardware watchpoint very slow – why?
– stackoverflow -gdb problem setting hardware watchpoint/how to set software watchpoint
Des détails pour explorer les symboles :
http://developer.apple.com/mac/library/documentation/DeveloperTools/gdb/gdb/gdb_14.html
Savoir à quel morceu de code correspond une adresse :
info line *0x0006f5dc
Voir les info de lignes dans un exe : readelf – Displays information about ELF files.
http://linux.die.net/man/1/readelf
–debug-dump[=line
Examiner le contenu de la table de symbole de GBD :
http://www.slac.stanford.edu/comp/unix/package/rtems/doc/html/gdb/gdb.info.Symbols.html
info files // montre tous les fichiers symboles qui ont été chargés, et à quelles adresses se trouvent ces symboles pour chaque fichier
echo info files > command gdb monprog.dbg corefile < command > list_symbol_map.txt
Attention : Si un fichier .so qui est impliqué dans la backtrace ne peut pas être chargé, il peut empécher de remonter la backtrace. Par contre, les erreurs d’offset où gdb parle de problème de prelink ne sont pas bloquantes.
Commentaires