Jak mogę uzyskać informacje o śledzeniu stosu Pythona za pomocą GDB?

11

Używam GDB do debugowania błędu segmentacji w mojej aplikacji Python na Kubuntu 12.04. Podobno GDB w wersji 7 ma wbudowane makra do wyodrębniania informacji o stosie pytona (http://docs.python.org/devguide/gdb.html), ale mam problem z uruchomieniem go. Zainstalowałem python-dbg.

Kiedy pytam o śledzenie stosu pytona w GDB, wynik wygląda następująco:

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

Moja wersja GDB to 7.4-2012.04-0ubuntu2, Python to 2.7.3-0ubuntu3.

Łukasz
źródło

Odpowiedzi:

16

Oto problem: aby uzyskać dostęp do symboli debugowania w GDB, musisz wywołać inny plik binarny: „python-dbg” zamiast „python” (znaleziono to w /usr/share/doc/python2.7-dbg/README.debug ).

Łukasz
źródło
1
Zaskakujące, jak nie wspomniano o tym w fedoraproject.org/wiki/Features/EasierPythonDebugging lub gdziekolwiek indziej, gdzie mogłem znaleźć. Dzięki, Luke.
quimnuss
To nie jest prawda. Musisz tylko uzyskać symbole debugowania pasujące do używanego pytona. Jeśli masz do czynienia z virtualenv, mogą wystąpić problemy, ponieważ ten python może nie odpowiadać pythonowi twojego systemu. Na stronie podoliaka.org/2016/04/10/debugging-cpython-gdb
aggieNick02
6

Na Ubuntu 16.04 udało mi się pobrać śledzenie stosu Python w Python 3.5 przez:

  1. Instalowanie python3-dbgi python3-dev:

    $ sudo apt install python3-dbg python3-dev

    python3-dbgpakiet zawiera krótką dokumentację, jak go używać, z /usr/share/doc/python3-dbg/README.debugktórej skorzystam w następnym kroku.

  2. Dołączanie rozpakowanego skryptu pomocniczego GDB /usr/share/doc/python3.5/gdbinit.gzdo ~/.gdbinit:

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

Teraz gdb będzie w stanie znaleźć symbole dla pliku binarnego Pythona i py-btdziała w celu wyświetlania śladu stosu Pythona w 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
źródło
mój gdbinit.gz na Ubuntu 16.04 zawiera wiele poleceń takich jak, pystackale nie ma py-bt. Masz pomysł, co się dzieje?
Anton
Dlaczego python 3.5mimo tego, że już zainstalowałem python 3.6?
skytree
0

Może to komuś pomaga: plik binarny nazywa się python2.7-dbgw moim systemie Debian, pochodzącym z python2.7-dbgpakietu. Zainstalowałem również python2.7-devpakiet apt-get source python2.7-dbg, aby gdbmożna było znaleźć pliki źródłowe interpretera Pythona.

Po tym wszystkim udało mi się debugować, na którym się SIGSEGVuruchamiałem: https://bugs.python.org/issue34870

Per Lundberg
źródło