Як я можу отримати інформацію про сліди стека python за допомогою GDB?


11

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

Коли я запитую про сліду стека пітона в 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, оскільки цей пітон може не відповідати python вашої системи. Є великий запис на 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.