Como posso obter informações de rastreamento de pilha python usando o GDB?

11

Estou usando o GDB para depurar uma falha de segmentação no meu aplicativo python no Kubuntu 12.04. Supostamente, o GDB versão 7 possui macros internas para extrair informações sobre a pilha python (http://docs.python.org/devguide/gdb.html), mas estou tendo problemas para fazê-la funcionar. Eu instalei o python-dbg.

Quando solicito um rastreamento de pilha python no GDB, o resultado fica assim:

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

Minha versão do GDB é 7.4-2012.04-0ubuntu2, o Python é 2.7.3-0ubuntu3.

Lucas
fonte

Respostas:

16

Aqui está o problema: para ter acesso aos símbolos de depuração no GDB, você deve chamar um binário diferente: "python-dbg" em vez de "python" (encontrado em /usr/share/doc/python2.7-dbg/README.debug )

Lucas
fonte
1
Surpreendente como isso não é mencionado em fedoraproject.org/wiki/Features/EasierPythonDebugging ou em qualquer outro lugar que eu possa encontrar. Obrigado Luke.
quimnuss
Isso não é verdade. Você só precisa obter símbolos de depuração que correspondam ao python que você está usando. Pode haver truques ao lidar com um virtualenv, pois esse python pode não corresponder ao python do seu sistema. Existe um ótimo artigo em podoliaka.org/2016/04/10/debugging-cpython-gdb #
aggieNick02
6

No Ubuntu 16.04, consegui obter o rastreio de pilha Python no Python 3.5:

  1. Instalando python3-dbge python3-dev:

    $ sudo apt install python3-dbg python3-dev

    python3-dbgO pacote vem com uma documentação curta de como usá-lo na /usr/share/doc/python3-dbg/README.debugqual usarei na próxima etapa.

  2. Anexando o script auxiliar do GDB descompactado /usr/share/doc/python3.5/gdbinit.gza ~/.gdbinit:

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

Agora o gdb poderá encontrar símbolos para o binário Python e py-btfunciona para exibir o rastreamento de pilha do Python no 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
fonte
meu gdbinit.gz no Ubuntu 16.04 contém muitos comandos como esse, pystackmas não existe py-bt. Alguma idéia do que está acontecendo?
Anton
Por que python 3.5mesmo que eu já tenha instalado python 3.6?
skytree
0

Talvez isso ajude alguém: o binário é nomeado python2.7-dbgno meu sistema Debian, vindo do python2.7-dbgpacote. Também instalei o python2.7-devpacote e apt-get source python2.7-dbg, para gdbencontrar os arquivos de origem no interpretador Python.

Com tudo isso, eu consegui depurar o que SIGSEGVeu estava executando: https://bugs.python.org/issue34870

Per Lundberg
fonte