Ответ 1
Я не думаю, что PyDev может это сделать (ни PyDbg, ни WinDbg), но похоже, что gdb может: http://wiki.python.org/moin/DebuggingWithGdb.
Я использую Eclipse/PyDev, пытаясь найти способ отладки кода, который использует subprocess.Popen
для создания дочернего процесса: я хочу иметь возможность отлаживать созданный дочерний процесс. Проблема в том, что я не могу найти способ отлаживать границы процесса, и я предполагаю, что на самом деле это невозможно. Тем не менее, вы никогда не узнаете, пока не спросите, и что я делаю!
Немного фона: у меня сложный процесс сборки, обусловленный Waf, который вызывает наши модульные тесты, вызывая nose по мере необходимости: я хочу подключиться к этим процессам для отладки unit test сбоев. Я знаю, что могу попытаться запустить нос напрямую, но проблема в том, что среда, которую я должен настроить для правильного загрузки наших модулей, довольно сложна, и я не хочу дублировать код, чтобы сделать это, если я могу избежать этого.
Я знаю режим удаленной отладки, но это довольно неудобно, потому что мне приходится вручную вызывать отладчик в удаленном процессе. Если кто-то знает способ сделать то, что я пытаюсь сделать, это будет очень признательно.
Я не думаю, что PyDev может это сделать (ни PyDbg, ни WinDbg), но похоже, что gdb может: http://wiki.python.org/moin/DebuggingWithGdb.
Я нашел кое-что обходное решение, которое может сработать для вас.
Как и вы, я впервые обнаружил, что удаленная опция отладки вручную вставляет вызовы pydevd.settrace() в нужные точки останова. Но я также заметил, что последующие контрольные точки PyDev (т.е. Созданные кликом в левом поле) соблюдались. Похоже, вам просто нужен первый явный вызов setset для установки сеанса удаленной отладки для процесса, а затем просто используйте обычные точки останова отладчика.
Кроме того, вы можете изменить вызов отладки, чтобы он фактически не приостановил процесс:
import pydevd
pydevd.settrace(suspend=False)
Поэтому вставьте вышеуказанный код где-нибудь в начале инициализации подпроцесса, и вы должны быть хорошими. Еще немного взлома, но это определенно лучше, чем ручной метод.