2009-10-26 13 views
10

Ich benutze Eclipse/PyDev versuchen, eine Möglichkeit zum Debuggen von Code zu finden, die subprocess.Popen verwendet, um einen untergeordneten Prozess zu erstellen: Ich möchte in der Lage sein, den untergeordneten Prozess zu debuggen, der erstellt wird. Das Problem ist, dass ich keinen Weg finden kann, über Prozessgrenzen hinweg zu debuggen, und ich vermute, dass es tatsächlich nicht möglich ist. Aber du weißt nie, bis du fragst, und so mache ich es!Gibt es eine Möglichkeit, einen Subprozess mit Pydev zu debuggen?

Ein wenig Hintergrund: Ich habe eine komplexe Build-Prozess von Waf angetrieben, die durch den Aufruf, um nose unsere Unit-Tests ruft je nach Bedarf: Ich möchte Debug-Unit-Test-Ausfälle in diesen Prozessen verknüpfen. Ich weiß, dass ich versuchen könnte, nose direkt zu starten, aber das Problem ist, dass die Umgebung, die ich konfigurieren muss, damit unsere Module korrekt geladen werden, ziemlich komplex ist und ich den Code nicht kopieren möchte, wenn ich es vermeiden kann.

Ich kenne den remote debugging Modus, aber das ist ziemlich unbequem, weil ich den Debugger im Remote-Prozess manuell aufrufen muss. Wenn jemand einen Weg kennt, um zu tun, was ich versuche zu tun, würde es sehr geschätzt werden.

+0

Diese Frage und ihre Antworten sind ziemlich alt, aber ich würde vorschlagen, dass Sie die Antwort von pimlottc anstelle der derzeit akzeptierten Antwort von Raphael annehmen. Raphaels Antwort mag korrekt gewesen sein, als sie gegeben wurde, aber pimlottcs Antwort ist jetzt absolut richtig und sehr nützlich. – skrrgwasme

Antwort

4

Ich scheine nicht PyDev kann es tun (weder PyDbg und WinDbg), aber es sieht aus wie gdb kann: http://wiki.python.org/moin/DebuggingWithGdb.

+0

Kann es der Verzweigung in den Unterprozess folgen oder schlagen Sie nur vor, sich manuell an den Unterprozess anzuhängen? Interessant zu lernen, dass GDB Python Stacks untersuchen kann: Ich wusste das nicht :) – jkp

+0

Ich schlage nur vor, den Prozess manuell anzuhängen. –

+1

Die Einschränkung, manuell anhängen zu müssen, ist übrigens ein Ergebnis der Funktionsweise von Unix-Systemen und nicht spezifisch für eine bestimmte Sprache oder einen bestimmten Debugger. –

3

Ich habe etwas von einer Problemumgehung gefunden, die für Sie arbeiten könnte.

Wie Sie, ich zuerst die Remote-Debugging-Option zum manuellen Einfügen von Aufrufen von pydevd.settrace() an gewünschten Haltepunkten gefunden. Aber ich bemerkte auch, dass nachfolgende PyDev-Haltepunkte (d. H. Die, die durch Klicken in den linken Rand erzeugt wurden) befolgt wurden. Es scheint also, dass Sie nur den ersten expliziten settrace-Aufruf benötigen, um die Remote-Debugging-Sitzung für den Prozess einzurichten, und danach einfach die normalen Debugger-Haltepunkte verwenden.

Darüber hinaus können Sie den settrace Anruf ändern, so dass es nicht tatsächlich den Prozess auszusetzen:

import pydevd 
pydevd.settrace(suspend=False) 

So den obigen Code irgendwo früh in der Initialisierung der subprocess einfügen und Sie sollten gut sein. Immer noch ein bisschen ein Hack, aber es ist definitiv besser als die manuelle Methode.

+1

Es gibt auch ein zusätzliches Flag für settrace, das auf Unterthreads angewendet wird, aber das scheint für mich nicht zuverlässig zu funktionieren: pydevd.settrace (suspend = False, trace_only_current_thread = False) – pimlottc

+0

Ab PyDev 1.6.4 funktioniert die Verfolgung von Unterthreads gut für mich. Der Aufruf pydev.settrace (...) wird im Hauptthread platziert. –

Verwandte Themen