Есть ли способ отладки подпроцесса с помощью pydev? - PullRequest
10 голосов
/ 26 октября 2009

Я использую Eclipse / PyDev, пытаясь найти способ отладки кода, который использует subprocess.Popen для создания дочернего процесса: я хочу иметь возможность отлаживать созданный дочерний процесс. Проблема в том, что я не могу найти способ отладки через границы процесса, и я предполагаю, что это на самом деле невозможно. Тем не менее, вы никогда не узнаете, пока не спросите, и я так делаю!

Немного предыстории: у меня есть сложный процесс сборки, управляемый Waf , который вызывает наши модульные тесты, вызывая nose по мере необходимости: я хочу подключить эти процессы сбои в тестовом модуле. Я знаю, что мог бы попытаться запустить нос напрямую, но проблема в том, что среда, которую я должен настроить для правильной загрузки наших модулей, довольно сложна, и я не хочу дублировать код, чтобы сделать это, если я могу избежать этого.

Мне известен режим удаленной отладки , но это довольно неудобно, поскольку мне приходится вручную вызывать отладчик в удаленном процессе. Если кто-нибудь знает способ сделать то, что я пытаюсь сделать, он будет очень признателен.

Ответы [ 2 ]

4 голосов
/ 27 октября 2009

Мне кажется, что PyDev не может это сделать (как и PyDbg и WinDbg), но, похоже, GDB может: http://wiki.python.org/moin/DebuggingWithGdb.

3 голосов
/ 08 октября 2010

Я нашел что-то вроде обходного пути, которое могло бы сработать для вас.

Как и вы, я впервые обнаружил возможность удаленной отладки вручную вставлять вызовы pydevd.settrace () в желаемых точках останова. Но я также заметил, что последующие точки останова PyDev (то есть те, которые были созданы щелчком на левом поле) были выполнены. Поэтому кажется, что вам просто нужен первый явный вызов settrace, чтобы установить сеанс удаленной отладки для процесса, а затем просто использовать обычные точки останова отладчика.

Кроме того, вы можете изменить вызов settrace, чтобы он фактически не приостанавливал процесс:

import pydevd
pydevd.settrace(suspend=False)

Поэтому вставьте приведенный выше код где-то в начале инициализации подпроцесса, и все будет хорошо. Все еще немного хак, но это определенно лучше, чем ручной метод.

...