Pergunta

Eu estou usando Eclipse / PyDev tentando encontrar uma forma de depurar o código que usos subprocess.Popen para criar um processo filho: eu quero ser capaz de depurar o processo filho que é criado. O problema é que não consigo encontrar uma maneira de depuração accross limites de processo, e eu estou supondo que não é realmente possível. Ainda assim, você nunca sabe até que você peça, e assim que eu estou fazendo!

Um pouco de fundo: Eu tenho um processo de construção complexa impulsionado por Waf que invoca o nosso testes de unidade por chamando nariz conforme necessário: Eu quero ligar para estes processa a falhas nos testes de unidade de depuração. Eu sei que eu poderia tentar executar o nariz diretamente, mas o problema é que o ambiente que eu tenho que configurar para os nossos módulos para carregar corretamente é bastante complexo e eu não quero duplicar o código para fazer isso se eu puder evitá-lo.

Estou ciente do remoto depuração modo mas isso é inconveniente muito porque eu tenho que manualmente invocar o depurador do processo remoto. Se alguém sabe uma maneira de fazer o que estou tentando fazer isso seria muito apreciado.

Foi útil?

Solução

Eu não parece PyDev pode fazê-lo (nem pode PyDbg e WinDbg), mas parece que gdb pode: http://wiki.python.org/moin/DebuggingWithGdb .

Outras dicas

Eu encontrei algo de uma solução alternativa que o trabalho poder para você.

Como você, eu encontrei primeiramente a opção de depuração remota de inserir manualmente as chamadas para pydevd.settrace () em pontos de interrupção desejados. Mas eu também notei que breakpoints PyDev subsequentes (ou seja, aquelas criadas clicando na margem esquerda) foram obedecidas. Assim, parece que você só precisa a primeira chamada settrace explícita para estabelecer a sessão de depuração remota para o processo, e depois é só usar os pontos de interrupção do depurador normais.

Além disso, você pode modificar a chamada settrace por isso na verdade não suspender o processo:

import pydevd
pydevd.settrace(suspend=False)

Então, insira o código acima em algum lugar no início da inicialização do subprocesso e você deve ser bom. Ainda um pouco de um truque, mas é definitivamente melhor do que o método manual.

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