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" ou, s'il n'est pas disponible, nous reconstruirons et nous installerons le paquet "hello" pour avoir 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

Assurez-vous d'avoir l'archive AutomaticDebugPackages dans votre ?SourceList (indiquez celle correspondant à votre release) : (pick the one for your release):

 deb http://debug.mirrors.debian.org/debian-debug/ stretch-debug main
 deb http://debug.mirrors.debian.org/debian-debug/ testing-debug main
 deb http://debug.mirrors.debian.org/debian-debug/ unstable-debug main
 deb http://debug.mirrors.debian.org/debian-debug/ experimental-debug main

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

 $ apt-cache search hello | grep dbg
 p   hello-dbgsym            - Debug symbols for hello

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 :

 # apt-get install hello-dbgsym

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

Reconstruire le paquet que vous déboguez

Rebuilding the package you’re debugging

Vous pouvez passer cette section si vous avez pu installer le(s) paquet(s) -dbg ou -dbgsym nécessaires dans la section précédente.

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