Existe uma maneira de anexar um depurador a um processo multi-threaded Python?

votos
26

Eu estou tentando depurar um impasse em uma aplicação multi-threaded Python depois de ter trancado. Existe uma maneira de anexar um depurador para inspecionar o estado do processo?

Edit: Eu estou tentando isso em Linux, mas seria ótimo se houvesse uma solução multi-plataforma. É Python depois de tudo :)

Publicado 06/09/2008 em 19:14
fonte usuário
Em outras línguas...                            


8 respostas

votos
13

Use Winpdb . É uma plataforma independente depurador gráfico GPL Python com suporte para depuração remota através de uma rede, vários segmentos, modificação namespace, depuração embutido, comunicação criptografada e é até 20 vezes mais rápido do APO.

Características:

  • licença GPL. Winpdb é Software Livre.
  • Compatível com CPython 2.3 a 2.6 e Python 3000
  • Compatível com wxPython de 2.6 a 2.8
  • Independente de plataforma, e testado no Ubuntu Gutsy e Windows XP.
  • Interfaces de usuário: rpdb2 é baseado em console, enquanto winpdb requer wxPython 2.6 ou posterior.

Capturas de tela http://winpdb.org/images/screenshot_winpdb_small.jpg

Respondeu 16/02/2009 em 16:18
fonte usuário

votos
10

Sim, gdb é bom para menor depuração nível.

Você pode alterar tópicos com a linha de comando.

por exemplo

(gdb) thr 2
[Switching to thread 2 (process 6159 thread 0x3f1b)]
(gdb) backtrace
....

Você também pode verificar para fora Python depuradores específicos como Winpdb , ou pydb . Ambos independente de plataforma.

Respondeu 11/09/2008 em 14:19
fonte usuário

votos
6

Você pode anexar um depurador a um processo multi-threaded Python, mas você precisa fazê-lo no nível C. Para fazer sentido do que está acontecendo, você precisa do interpretador Python para ser compilado com símbolos. Se você não tiver um, você precisa baixar fonte de python.org e construí-lo:

./configure --prefix=/usr/local/pydbg
make OPT=-g
sudo make install
sudo ln -s /usr/local/pydbg/bin/python /usr/local/bin/dbgpy

Certifique-se de sua carga de trabalho está sendo executado em que versão do intérprete. Você pode então anexar a ele com GDB a qualquer momento. O pessoal Python incluíram uma amostra ".gdbinit" em seu diretório Diversos, que tem alguns macros úteis. No entanto, é quebrado para depuração multi-threaded (!). É necessário substituir linhas como este

while $pc < Py_Main || $pc > Py_GetArgcArgv

com o seguinte:

while ($pc < Py_Main || $pc > Py_GetArgcArgv) && ($pc < t_bootstrap || $pc > thread_PyThread_start_new_thread)

Caso contrário comandos como pystacknão terminará em outros do que a thread principal threads. Com essas coisas no lugar, você pode fazer coisas como

gdb> attach <PID>
gdb> info threads
gdb> thread <N>
gdb> bt
gdb> pystack
gdb> detach

e ver o que está acontecendo. Mais ou menos.

Você pode analisar o que os objetos estão com a "pyo" macro. Chris tem alguns exemplos em seu blog.

Boa sorte.

(Shoutout para blog de Dan para algumas informações-chave para mim, especialmente a correção de threading!)

Respondeu 15/02/2009 em 13:18
fonte usuário

votos
3

Minha experiência depuração de programas multi-threaded em PyDev (Eclipse no Windows XP) é, tópicos criado usando thread.start_new_thread não poderia ser ligado, mas segmento criado usando threading.Thread poderia ser viciado. Espero que a informação seja útil.

Respondeu 10/11/2008 em 13:58
fonte usuário

votos
3

Se você quer dizer o pydb, não há nenhuma maneira de fazê-lo. Houve algum esforço nesse sentido: ver o svn , mas foi abandonado. Supostamente winpdb o suporta .

Respondeu 12/09/2008 em 15:51
fonte usuário

votos
0

PyCharm IDE permite anexar a um processo de Python em execução desde a versão 4.0.

Aqui é descrito como fazer isso.

Respondeu 30/03/2015 em 19:02
fonte usuário

votos
0

pdbinject permite injetar APO em um processo python já em execução.

O executável pdbinject só funciona sob python2, mas pode injetar em python3 muito bem também.

Respondeu 17/03/2015 em 07:18
fonte usuário

votos
0

O que plataforma você está tentando isso em? A maioria dos depuradores permitem que você anexar a um processo em execução usando o ID do processo. Você pode emitir o ID do processo através de registro ou usando algo como o Gerenciador de Tarefas. Uma vez que é atingido, será possível para inspecionar tópicos individuais e suas pilhas de chamadas.

EDIT: Eu não tenho nenhuma experiência com GNU Debugger (GDB), que é multi-plataforma, no entanto, achamos esta ligação e pode começar no caminho certo. Ele explica como adicionar símbolos de depuração (útil para ler os rastreamentos de pilha) e como instruir gdb para anexar a um processo em execução python.

Respondeu 06/09/2008 em 20:08
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more