Existe uma maneira de anexar um depurador a um processo Python multithread?

StackOverflow https://stackoverflow.com/questions/47701

  •  09-06-2019
  •  | 
  •  

Pergunta

Estou tentando depurar um impasse em um aplicativo Python multithread após ele ter sido bloqueado.Existe uma maneira de anexar um depurador para inspecionar o estado do processo?

Editar:Estou tentando fazer isso no Linux, mas seria ótimo se houvesse uma solução multiplataforma.Afinal, é Python :)

Foi útil?

Solução

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

Você pode mudar de tópico com o fio comando.

por exemplo

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

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

Outras dicas

Usar Winpdb.É um plataforma independente depurador gráfico GPL Python com suporte para depuração remota em uma rede, vários threads, modificação de namespace, depuração incorporada, comunicação criptografada e é até 20 vezes mais rápido que o pdb.

Características:

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

Screenshot
(fonte: winpdb.org)

Você pode anexar um depurador a um processo Python multithread, mas precisa fazer isso no nível C.Para entender o que está acontecendo, você precisa que o interpretador Python seja compilado com símbolos.Se você não tiver um, você precisa baixar o código-fonte em python.org e construí-lo você mesmo:

./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 que sua carga de trabalho esteja sendo executada nessa versão do interpretador.Você pode então anexar a ele com o GDB a qualquer momento.O pessoal do Python incluiu um exemplo ".gdbinit" em seu diretório Misc, que contém algumas macros úteis.No entanto, está quebrado para depuração multithread (!).Você precisa substituir linhas como esta

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 pystack não terminará em threads diferentes do thread principal.Com essas coisas instaladas, você pode fazer coisas como

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

e veja o que está acontecendo.Tipo de.

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

Boa sorte.

(Grito para blog do Dan para obter algumas informações importantes para mim, principalmente a correção do threading!)

Se você quer dizer o pydb, não há como fazer isso.Houve algum esforço nesse sentido:veja o commit do svn, mas foi abandonado.Supostamente winpdb suporta isso.

Minha experiência na depuração de programas multithread no PyDev (Eclipse no Windows XP) é que os threads criados usando thread.start_new_thread não puderam ser conectados, mas os threads criados usando threading.Thread podem ser conectados.Espero que a informação seja útil.

Em qual plataforma você está tentando fazer isso?A maioria dos depuradores permite que você se conecte a um processo em execução usando o ID do processo.Você pode gerar o ID do processo por meio de registro ou usando algo como o Gerenciador de Tarefas.Uma vez alcançado isso, será possível inspecionar threads individuais e suas pilhas de chamadas.

EDITAR:Não tenho nenhuma experiência com GNU Debugger (GDB), que é multiplataforma, mas achei isso link e isso pode colocá-lo no caminho certo.Ele explica como adicionar símbolos de depuração (úteis para ler rastreamentos de pilha) e como instruir o gdb para anexar a um processo python em execução.

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

O executável pdbinject funciona apenas em python2, mas também pode ser injetado em python3.

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

Aqui é descrito como fazer isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top