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

Я использую 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.

4 ответа

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

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

Иногда невозможно получить отладочную информацию; например, если вы используете conda Python, эти пакеты не поставляются с отладочной информацией. Оказывается, py-spy (https://github.com/benfred/py-spy) имеет более надежную реализацию дампа обратной трассировки Python, которая не зависит от наличия точных доступных символов отладки. Однако, поскольку он также использует ptrace, вам придется сначала отключить gdb. Вот как это сделать:

  • Сделайте свое дело в gdb, дойдя до точки останова, для которой вы хотите получить обратную трассировку Python.
  • Заставьте gdb пройти через SIGSTOP с помощью handle SIGSTOP noprint nostop pass
  • Приостановить процесс с помощью signal SIGSTOP
  • Отключить gdb с помощью detach. Обратите внимание на PID
  • Бежать py-spy dump --pid $PIDв другом терминале. Это дает вам обратную связь.
  • Вы можете продолжать работать с gdb с помощью attach $PID. Обратите внимание, что вы можете продолжить процесс, даже если он SIGSTOP, и он будет работать как обычно, и будет по-прежнему приостановлен, если вы снова отсоединитесь.

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

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

Другие вопросы по тегам