Вопрос

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

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

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

Это было полезно?

Решение

Я не думаю, что PyDev может это сделать (как и PyDbg и WinDbg), но, похоже, GDB может:

Другие советы

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

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

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

import pydevd
pydevd.settrace(suspend=False)

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

scroll top