Comment obtenir un Backtrace utile

Cette page tente d'expliquer comment obtenir le backtrace d'un programme qui plante de manière reproductible. Pour cet exemple, nous installerons le paquet "hello" avec les symboles de déboguage (*-dbg). Si le paquet n'est pas disponible, il faut reconstruire le paquet et l'installer, de manière à conserver les informations de déboguage.

Pour rappel, un "#" en début de ligne signifie que ce qui suit est une commande à exécuter en tant que root (ou avec sudo). Un "$" en début de ligne signifie que la commande doit être exécutée par un utilisateur normal. Un "(gdb)" en début de ligne signifie que ce qui suit doit être saisi dans l'invite de gdb (GNU Debugger).

Installer les symboles de déboguage

Pour savoir si le paquet que vous essayez de déboguer dispose d'un paquet de déboguage, (par exemple, si hello est le paquet source, le paquet de déboguage sera hello-dbg), cherchez-le dans le gestionnaire de paquet. En ligne de commande, ceci donne :

 $ aptitude search hello | grep dbg
 p   hello-dbg            - hello debug symbols

Si rien n'est retourné, il faut reconstruire le paquet comme expliqué dans la section suivante. En revanche, si un paquet existe, installez-le, par exemple avec :

 # aptitude install hello-dbg

et sautez alors la section suivante pour passer directement à l'exécution de gdb.

Reconstruire le paquet que vous deboguez

Exécuter gdb

 $ gdb hello
 ... gdb loads ...
 (gdb) set pagination 0
 (gdb) run [--args]
 ... hello loads...

 (gdb) bt

 (gdb) quit

Si le problème semble être dans une librairie majeure telle que libc6, xlibs, ou libgtk2.0-0, If the problem seems to be in a major library such as libc6, xlibs, or libgtk2.0-0, you’ll want to install the appropriate -dbg package (e.g. libc6-dbg in the case of libc6) and then run the problematic program again under gdb.

Often, you will see a backtrace where one or more of the top lines is in malloc() or g_malloc(). When this happens, chances are your backtrace isn’t very useful. The easiest way to find some useful information is to set the environment variable MALLOC_CHECK_ to a value of 2. You can do this while running gdb by doing this:

 $ MALLOC_CHECK_=2 gdb hello

Commandes gdb avancées

Déboguer des erreurs X

If a GTK program has received an X error; i.e. you see a message of the form:

The program 'preview1' received an X Window System error.

then you can try running the program with --sync, and break on the gdk_x_error function in order to obtain a backtrace, thus:

 (gdb) break gdk_x_error
 (gdb) run --sync

Liens utiles

--AriPollak and ?LoicMinier

CategoryDebugging