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

9

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

Quando peço um rastreamento de pilha de python no GDB, o resultado é 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.

    
por Luke 13.08.2012 / 19:29

3 respostas

13

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

    
por Luke 13.08.2012 / 19:48
2

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

  1. Instalando python3-dbg e python3-dev :

    $ sudo apt install python3-dbg python3-dev

    O pacote

    python3-dbg vem com uma breve documentação sobre como usá-lo em /usr/share/doc/python3-dbg/README.debug , que eu usarei na próxima etapa.

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

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

Agora, o gdb poderá encontrar símbolos para o binário do Python e py-bt funcionará 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)
    
por rutsky 11.01.2017 / 18:51
0

Talvez isso ajude alguém: O binário se chama python2.7-dbg no meu sistema Debian, vindo do pacote python2.7-dbg . Eu também instalei o python2.7-dev package e apt-get source python2.7-dbg , para que gdb pudesse encontrar os arquivos de origem para o interpretador Python.

Com tudo isso no lugar, consegui depurar o SIGSEGV que estava encontrando: link

    
por Per Lundberg 03.10.2018 / 08:07

Tags