¿Cómo puedo obtener información de seguimiento de la pila de Python usando GDB?

11

Estoy usando GDB para depurar un error de segmentación en mi aplicación python en Kubuntu 12.04. Supuestamente, la versión 7 de GDB tiene macros incorporadas para extraer información sobre la pila de Python (http://docs.python.org/devguide/gdb.html), pero estoy teniendo problemas para que funcione. He instalado python-dbg.

Cuando solicito un seguimiento de la pila de Python en GDB, el resultado se ve así:

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

Mi versión GDB es 7.4-2012.04-0ubuntu2, Python es 2.7.3-0ubuntu3.

Luke
fuente

Respuestas:

16

Aquí está el problema: para tener acceso a los símbolos de depuración en GDB, debe invocar un binario diferente: "python-dbg" en lugar de "python" (se encuentra en /usr/share/doc/python2.7-dbg/README.debug )

Luke
fuente
1
Sorprendentemente cómo esto no se menciona en fedoraproject.org/wiki/Features/EasierPythonDebugging o en cualquier otro lugar que pueda encontrar. Gracias Luke
Quimnuss
Esto no es verdad Solo tiene que obtener símbolos de depuración que coincidan con la pitón que está utilizando. Puede haber problemas si se trata de un virtualenv, ya que esa pitón puede no coincidir con la pitón de su sistema. Hay una gran crítica en podoliaka.org/2016/04/10/debugging-cpython-gdb
aggieNick02
6

En Ubuntu 16.04 logré obtener el seguimiento de la pila de Python en Python 3.5 al:

  1. Instalación python3-dbgy python3-dev:

    $ sudo apt install python3-dbg python3-dev

    python3-dbgEl paquete viene con una breve documentación sobre cómo usarlo, /usr/share/doc/python3-dbg/README.debugque utilizaré en el siguiente paso.

  2. Agregar un script auxiliar GDB desempaquetado /usr/share/doc/python3.5/gdbinit.gza ~/.gdbinit:

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

Ahora gdb podrá encontrar símbolos para el binario de Python y py-btfunciona para mostrar el seguimiento de la pila de Python en 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
fuente
my gdbinit.gz en Ubuntu 16.04 contiene muchos comandos como pystackpero no hay py-bt. ¿Tienes idea de lo que está pasando?
Anton
¿Por qué python 3.5a pesar de que ya he instalado python 3.6?
skytree
0

Tal vez esto ayude a alguien: el binario se nombra python2.7-dbgen mi sistema Debian, proveniente del python2.7-dbgpaquete. También instalé el python2.7-devpaquete y apt-get source python2.7-dbg, para que gdbpudiera encontrar los archivos de origen para el intérprete de Python.

Con todo esto en su lugar, logré depurar el problema con el que SIGSEGVme encontraba: https://bugs.python.org/issue34870

Por Lundberg
fuente