Comment puis-je obtenir des informations de trace de pile python à l'aide de GDB?

11

J'utilise GDB pour déboguer un défaut de segmentation dans mon application python sur Kubuntu 12.04. Soi-disant GDB version 7 a des macros intégrées pour extraire des informations sur la pile python (http://docs.python.org/devguide/gdb.html), mais j'ai du mal à le faire fonctionner. J'ai installé python-dbg.

Lorsque je demande une trace de pile python dans GDB, le résultat ressemble à ceci:

(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 GDB est 7.4-2012.04-0ubuntu2, Python est 2.7.3-0ubuntu3.

Luc
la source

Réponses:

16

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é ceci dans /usr/share/doc/python2.7-dbg/README.debug ).

Luc
la source
1
Étonnant que cela ne soit pas mentionné dans fedoraproject.org/wiki/Features/EasierPythonDebugging ou n'importe où ailleurs que je pourrais trouver. Merci Luke.
quimnuss
Ce n'est pas vrai. Il vous suffit d'obtenir des symboles de débogage qui correspondent au python que vous utilisez. Il peut y avoir des pièges si vous traitez avec un virtualenv car ce python peut ne pas correspondre au python de votre système. Il y a un grand résumé sur podoliaka.org/2016/04/10/debugging-cpython-gdb
aggieNick02
6

Sur Ubuntu 16.04, j'ai réussi à obtenir la trace de la pile Python dans Python 3.5 en:

  1. Installation python3-dbget python3-dev:

    $ sudo apt install python3-dbg python3-dev

    python3-dbgle package est livré avec une courte documentation sur la façon de l'utiliser dans /usr/share/doc/python3-dbg/README.debuglaquelle je l'utiliserai à l'étape suivante.

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

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

Maintenant, gdb pourra trouver des symboles pour le binaire Python et py-btfonctionne pour afficher la trace de la 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)
rutsky
la source
mon gdbinit.gz sur Ubuntu 16.04 contient de nombreuses commandes comme pystackmais il n'y en a pas py-bt. Une idée de ce qui se passe?
Anton
Pourquoi python 3.5même si j'ai déjà installé python 3.6?
skytree
0

Peut-être que cela aide quelqu'un: le binaire est nommé python2.7-dbgsur mon système Debian, provenant du python2.7-dbgpaquet. J'ai également installé le python2.7-devpackage et apt-get source python2.7-dbg, afin de gdbpouvoir trouver les fichiers source de l'interpréteur Python.

Avec tout cela en place, j'ai réussi à déboguer le que SIGSEGVje rencontrais: https://bugs.python.org/issue34870

Per Lundberg
la source