Como faço para despejar todo um processo de Python para mais tarde depuração inspeção?

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Eu tenho um aplicativo de Python em um estado estranho. Eu não quero fazer a depuração ao vivo do processo. Posso despejá-lo em um arquivo e examinar seu estado mais tarde? Eu sei que tenho restaurado corefiles de programas em C em gdb mais tarde, mas eu não sei como examinar um aplicativo Python de forma útil a partir do gdb.

(Esta é uma variação sobre minha pergunta sobre depuração memleaks em um sistema de produção .)

Foi útil?

Solução

Não há builtin forma diferente de abortar (com os.abort (), fazendo com que o coredump se limites de recursos permitirem) - embora certamente você pode construir a sua própria função 'despejo' que despeja a informação relevante sobre os dados que lhe interessam sobre. Não há ferramentas prontas para isso.

Como para lidar com o corefile de um processo de Python, o fonte Python tem um arquivo gdbinit que contém macros úteis. É ainda muito mais doloroso do que alguma forma de entrar no próprio processo (com pdb ou o interpretador interativo), mas isso torna a vida um pouco mais fácil.

Outras dicas

Alguém acima disse que não há nenhuma maneira embutido para executar esta, mas isso não é inteiramente verdade. Por exemplo, você poderia dar uma olhada nas torres de depuração ferramentas. Whene há uma exceção, o manipulador de exceção salva o rastreamento de pilha e imprime um URL no console que pode ser usada para recuperar a sessão de depuração através de HTTP.

Enquanto eles estão, provavelmente, manter essas sessões na memória, eles são apenas objetos python, então não há nada para impedi-lo de decapagem um despejo de pilha e restaurá-lo mais tarde para a inspeção. Isso significaria algumas alterações para o aplicativo, mas deve ser possível ...

Depois de alguma pesquisa, verifica-se o código relevante é realmente provenientes de Paste = "http://svn.pythonpaste.org/Paste/trunk/paste/evalexception/evalcontext.py" rel = "nofollow noreferrer de EvalException módulo . Você deve ser capaz de olhar lá para descobrir o que você precisa.

Esta resposta sugere fazer o seu núcleo programa de despejo e, em seguida, continuar a execução em outra caixa suficientemente semelhantes.

Também é possível escrever algo que iria despejar todos os dados a partir do processo, por exemplo.

  • Pickler que ignora os objetos que ele não pode Pickle (substituí-las por outra coisa) (por exemplo Python: Decapagem um dicionário com alguns itens unpicklable )
  • Método que converte de forma recursiva tudo em coisas serializável (por exemplo este , exceto que ele precisa de um cheque de objetos infinitamente recursão e fazer algo com aquelas, também poderia tentar dir() e getattr() para processar alguns dos objetos desconhecidos, por exemplo, classes de extensão)
  • .

Mas, deixando um processo em execução com bueiro ou postes ou algo parecido certamente parece mais conveniente quando possível.

(também, eu me pergunto se algo mais conveniente foi escrito uma vez que esta pergunta foi feita primeiro)

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