Wie kann ich mit GDB Python-Stack-Trace-Informationen abrufen?


11

Ich verwende GDB, um einen Segmentierungsfehler in meiner Python-Anwendung unter Kubuntu 12.04 zu debuggen. Angeblich verfügt GDB Version 7 über integrierte Makros zum Extrahieren von Informationen über den Python-Stack (http://docs.python.org/devguide/gdb.html), aber ich habe Probleme, ihn zum Laufen zu bringen. Ich habe python-dbg installiert.

Wenn ich in GDB nach einem Python-Stack-Trace frage, sieht das Ergebnis folgendermaßen aus:

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

Meine GDB-Version ist 7.4-2012.04-0ubuntu2, Python ist 2.7.3-0ubuntu3.

Antworten:


16

Hier ist das Problem: Um auf Debugging-Symbole in GDB zugreifen zu können, müssen Sie eine andere Binärdatei aufrufen: "python-dbg" anstelle von "python" (gefunden in /usr/share/doc/python2.7-dbg/README.debug) ).


1
Überraschend, wie dies nicht in fedoraproject.org/wiki/Features/EasierPythonDebugging oder irgendwo anders erwähnt wird . Danke Luke.
Quimnuss

Das ist nicht wahr. Sie müssen nur Debugging-Symbole erhalten, die mit der von Ihnen verwendeten Python übereinstimmen. Wenn es sich um eine virtuelle Umgebung handelt, kann es zu Fallstricken kommen, da diese Python möglicherweise nicht mit der Python Ihres Systems übereinstimmt. Es gibt eine großartige Beschreibung unter podoliaka.org/2016/04/10/debugging-cpython-gdb
aggieNick02

6

Unter Ubuntu 16.04 gelang es mir, Python-Stack-Trace in Python 3.5 zu erhalten durch:

  1. Installation python3-dbgund python3-dev:

    $ sudo apt install python3-dbg python3-dev

    python3-dbgDas Paket enthält eine kurze Dokumentation zur Verwendung, /usr/share/doc/python3-dbg/README.debugdie ich im nächsten Schritt verwenden werde.

  2. Anhängen des entpackten GDB-Hilfsskripts /usr/share/doc/python3.5/gdbinit.gzan ~/.gdbinit:

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

Jetzt kann gdb Symbole für Python-Binärdateien finden und py-btzeigt Python-Stack-Trace in gdb an:

$ 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)

Mein gdbinit.gz unter Ubuntu 16.04 enthält viele Befehle wie, pystackaber es gibt keine py-bt. Irgendeine Idee, was los ist?
Anton

Warum ist python 3.5, obwohl ich bereits installiert habe python 3.6?
Skytree

0

Vielleicht hilft das jemandem: Die Binärdatei ist python2.7-dbgauf meinem Debian-System benannt und stammt aus dem python2.7-dbgPaket. Ich habe auch das python2.7-devPaket und installiert apt-get source python2.7-dbg, damit gdbdie Quelldateien zum Python-Interpreter gefunden werden können.

Mit all dem gelang es mir, das zu debuggen, auf das SIGSEGVich stieß: https://bugs.python.org/issue34870

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.