Как я могу получить информацию трассировки стека Python, используя GDB?

11

Я использую GDB для отладки ошибки сегментации в моем приложении на Python на Kubuntu 12.04. Предположительно, в GDB версии 7 есть встроенные макросы для извлечения информации о стеке python (http://docs.python.org/devguide/gdb.html), но у меня возникают проблемы с его работой. Я установил Python-DBG.

Когда я запрашиваю трассировку стека Python в GDB, результат выглядит так:

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

Моя версия GDB 7.4-2012.04-0ubuntu2, Python 2.7.3-0ubuntu3.

Люк
источник

Ответы:

16

Вот проблема: чтобы иметь доступ к символам отладки в GDB, вы должны вызвать другой двоичный файл: «python-dbg» вместо «python» (это можно найти в /usr/share/doc/python2.7-dbg/README.debug ).

Люк
источник
1
Удивление, как это не упоминается в fedoraproject.org/wiki/Features/EasierPythonDebugging или в любом другом месте, которое я мог найти. Спасибо Люк.
Quimnuss
Это не правда Вам просто нужно получить отладочные символы, которые соответствуют используемому вами питону. При работе с virtualenv возможны ошибки, так как этот питон может не соответствовать питону вашей системы. На podoliaka.org/2016/04/10/debugging-cpython-gdb
aggieNick02
6

В Ubuntu 16.04 мне удалось получить трассировку стека Python в Python 3.5:

  1. Установка python3-dbgи python3-dev:

    $ sudo apt install python3-dbg python3-dev

    python3-dbgПакет поставляется с краткой документацией, как использовать его, в /usr/share/doc/python3-dbg/README.debugкотором я буду использовать на следующем шаге.

  2. Добавление распакованного вспомогательного сценария GDB /usr/share/doc/python3.5/gdbinit.gzв ~/.gdbinit:

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

Теперь GDB сможет находить символы для двоичного файла Python и py-btработает для отображения трассировки стека Python в 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)
Рутский
источник
Мой gdbinit.gz на Ubuntu 16.04 содержит много команд, таких как, pystackно нет py-bt. Есть идеи, что происходит?
Антон
Почему python 3.5даже если я уже установлен python 3.6?
Skytree
0

Может быть, это кому-то поможет: бинарный файл назван python2.7-dbgв моей системе Debian из python2.7-dbgпакета. Я также установил python2.7-devпакет и apt-get source python2.7-dbg, чтобы он gdbмог найти исходные файлы для интерпретатора Python.

Имея все это на месте, мне удалось отладить то, с чем SIGSEGVя столкнулся: https://bugs.python.org/issue34870

Пер Лундберг
источник