web-dev-qa-db-fra.com

Comment obtenir python informations de trace de pile à l'aide de GDB?

J'utilise GDB pour déboguer une erreur de segmentation dans mon application python sous Kubuntu 12.04. La version 7 de GDB est supposément dotée de macros intégrées permettant d'extraire des informations sur la pile python (http://docs.python.org/devguide/gdb.html), mais je ne parviens pas à la faire fonctionner. J'ai installé python-dbg.

Lorsque je demande une trace de pile python dans GDB, le résultat est le suivant:

(gdb) py-bt
#5 (unable to read python frame information)
#16 (unable to read python frame information)
#26 (unable to read python frame information)
...

Ma version de GDB est 7.4-2012.04-0-0, 2Python est 2.7.3-0ubuntu3.

11
Luke

Voici le problème: pour avoir accès aux symboles de débogage dans GDB, vous devez appeler un autre binaire: "python-dbg" au lieu de "python" (trouvé dans /usr/share/doc/python2.7-dbg/README.debug ).

16
Luke

Sur Ubuntu 16.04, j’ai réussi à obtenir Python trace de pile dans Python 3.5 par:

  1. Installer python3-dbg et python3-dev:

    $ Sudo apt install python3-dbg python3-dev

    Le paquet python3-dbg est livré avec une courte documentation sur son utilisation dans /usr/share/doc/python3-dbg/README.debug que je vais utiliser à la prochaine étape.

  2. Ajout du script d'assistance GDB non compressé /usr/share/doc/python3.5/gdbinit.gz à ~/.gdbinit:

    zcat /usr/share/doc/python3.5/gdbinit.gz >> ~/.gdbinit

Maintenant, gdb sera capable de trouver des symboles pour Python binary et py-bt fonctionne pour l'affichage de la trace de pile Python dans gdb:

$ gdb -p 4762
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos Word" to search for commands related to "Word".
Attaching to process 4762
[New LWP 4852]
[New LWP 4853]
[New LWP 4854]
[Thread debugging using libthread_db enabled]
Using Host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
0x00007f38e43deb5d in poll () at ../sysdeps/unix/syscall-template.S:84
84      ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) py-bt
Traceback (most recent call first):
  File "/usr/bin/indicator-cpufreq", line 80, in <module>
    Gtk.main()
(gdb)
5
rutsky

Cela peut peut-être aider quelqu'un: le binaire s'appelle python2.7-dbg sur mon système Debian, et provient du paquet python2.7-dbg. J'ai également installé le paquetage python2.7-dev et apt-get source python2.7-dbg afin que gdb puisse trouver les fichiers source dans l'interpréteur Python.

Avec tout cela en place, j'ai réussi à déboguer la SIGSEGV que je rencontrais dans: https://bugs.python.org/issue3487

0
Per Lundberg