2009-10-26 24 views
10

Estoy usando Eclipse/PyDev tratando de encontrar una forma de depurar código que usa subprocess.Popen para crear un proceso secundario: quiero poder depurar el proceso hijo que se crea. El problema es que no puedo encontrar una manera de depurar los límites del proceso, y supongo que en realidad no es posible. Aún así, nunca se sabe hasta que lo pregunte, ¡y eso estoy haciendo!¿Hay alguna manera de depurar un subproceso utilizando pydev?

Un poco de historia: Tengo un complejo proceso de compilación impulsado por Waf que invoca nuestras pruebas unitarias llamando al nose según se requiera: Quiero conectarme a estos procesos para depurar las fallas de prueba de la unidad. Sé que podría tratar de ejecutar la nariz directamente, pero el problema es que el entorno que tengo que configurar para que nuestros módulos se carguen correctamente es bastante complejo y no quiero duplicar el código para hacerlo si puedo evitarlo.

Conozco el modo remote debugging, pero eso es bastante incómodo porque tengo que invocar manualmente el depurador en el proceso remoto. Si alguien sabe una manera de hacer lo que estoy tratando de hacer, sería muy apreciado.

+0

Esta pregunta y sus respuestas son bastante antiguas, pero me gustaría sugerir que acepte la respuesta de pimlottc en lugar de la respuesta actualmente aceptada de Raphael. La respuesta de Raphael pudo haber sido correcta cuando se dio, pero la respuesta de pimlottc es absolutamente correcta y muy útil ahora. – skrrgwasme

Respuesta

4

No parece que PyDev pueda hacerlo (ni PyDbg ni WinDbg), pero parece que gdb puede: http://wiki.python.org/moin/DebuggingWithGdb.

+0

¿Puede seguir la horquilla en el subproceso o simplemente sugiere sumarse al subproceso manualmente? Es interesante saber que GDB puede inspeccionar las pilas de python: no sabía eso :) – jkp

+0

Solo sugiero adjuntar el proceso manualmente. –

+1

La limitación de tener que adjuntar manualmente, dicho sea de paso, es en realidad un resultado de cómo funcionan los sistemas Unix, y no es específico de un lenguaje o depurador en particular. –

3

He encontrado una solución alternativa que podría funcionar para usted.

Al igual que usted, primero encontré la opción de depuración remota de insertar llamadas manualmente a pydevd.settrace() en los puntos de interrupción deseados. Pero también noté que los puntos de corte posteriores de PyDev (es decir, los creados al hacer clic en el margen izquierdo) fueron obedecidos. Por lo tanto, parece que solo necesita la primera llamada settrace explícita para establecer la sesión de depuración remota para el proceso, y luego simplemente use los puntos de interrupción normales del depurador.

Por otra parte, se puede modificar la llamada settrace por lo que en realidad no suspender el proceso:

import pydevd 
pydevd.settrace(suspend=False) 

Así que insertar el código anterior en algún lugar temprano en la inicialización del subproceso y que debe estar bien. Todavía es un truco, pero definitivamente es mejor que el método manual.

+1

También hay un indicador adicional para que settrace se aplique a los subprocesos, pero no pareció funcionar de manera confiable para mí: pydevd.settrace (suspend = False, trace_only_current_thread = False) – pimlottc

+0

A partir de PyDev 1.6.4, el subproceso de rastreo funciona bien por mí. La llamada pydev.settrace (...) se coloca en el hilo principal. –

Cuestiones relacionadas