Как выйти из pdb и позволить программе продолжить работу?

112

Я использую модуль pdb для отладки программы. Я хотел бы понять, как я могу выйти из pdb и позволить программе продолжить работу до завершения. Программа требует больших вычислительных ресурсов для запуска, поэтому я не хочу выходить из нее без попытки выполнения скрипта. continueне работает. Как мне выйти из pdb и продолжить свою программу?

черепаха
источник
2
continueвыходит из циклов, returnвыходит из методов / функций
Стефан
7
@ Стефан: Он говорит о continueкоманде pdb. Не заявление Python.
voithos
1
@turtle: continueследует «Продолжать выполнение, останавливаться только при обнаружении точки останова», согласно документации. У вас есть установленная точка останова?
voithos
1
ах. да я вижу. да, у меня есть точка останова внутри цикла. в любом случае, чтобы обойти это? цикл вызывается тысячи раз, поэтому я не могу продолжать вручную нажимать «Продолжить».
turtle
1
@turtle: У вас есть точка останова, установленная в Pdb, или у вас есть pdb.set_trace()в исходном коде?
voithos

Ответы:

191

continueshould «Продолжить выполнение, останавливаться только при обнаружении точки останова», поэтому у вас где-то установлена ​​точка останова. Чтобы удалить точку останова (если вы вставили ее вручную):

(Pdb) break
Num Type         Disp Enb   Where
1   breakpoint   keep yes   at /path/to/test.py:5
(Pdb) clear 1
Deleted breakpoint 1
(Pdb) continue

Или, если вы используете pdb.set_trace(), вы можете попробовать это (хотя, если вы используете pdb более изящными способами, это может сломать ...)

(Pdb) pdb.set_trace = lambda: None  # This replaces the set_trace() function!
(Pdb) continue
# No more breaks!
Войтос
источник
10
Выше , не выход PDB.
Стив Барнс,
7
Про 15-е слово вопроса!
Стив Барнс
13
@SteveBarnes: Я думаю, ты понимаешь это слишком буквально. OP просто снова и снова попадает в точку останова. Все, что им нужно, - это продолжить свой длительный процесс, не достигая точек останова. Независимо от того, запущен ли Pdb на самом деле или нет.
voithos
35
Хороший совет по настройке set_trace = lambda: None:)
randlet 08
2
На крайний случай ничего не сравнится set_trace = lambda: None. Организация Python должна добавить команду, которая просто позволяет вам выйти из pdb.
ErezO
26

Простой Ctrl- Dвылезет из pdb. Если вы хотите продолжить, а не прерывать работу, просто нажмите, cа не всю continueкоманду

Минь Чиет
источник
7
Что насчет того, когда вы находитесь внутри функции, внутри цикла? Кажется, для меня просто переход к следующему циклу, и я не могу закрыть pdb или даже закрыть python, не закрывая весь терминал?
Марсес 08
@LimokPalantaemon Weird, вы пробовали печатать?exit
Минь Триет
Это не сработает, если вы установили трассировку или если у вас есть точки останова, если вы не продолжите нажимать c.
Alex
неловко, но это спасло меня от слишком долгого застревания -_-
jmcg
7

Ответ от @voithos правильно, так что я просто добавить одну альтернативу в том случае , если вы используете set_trace. Да, pdb.set_trace = lambda: Noneвзлом работает нормально, но не в том случае, если у вас установлены другие точки останова и вы хотите снова включить его позже. Для меня это указывает на то, что, к сожалению, pdbне хватает множества функций (даже таких базовых вещей, как списки отображения), и это другой случай.

Хорошая новость заключается в том, что pdb++это отличная замена pdb, и одна из вещей, которую она решает, - это как раз проблема отключения set_trace. Итак, вы можете просто сделать:

pip install pdbpp

а затем в (Pdb++)командной строке введите:

pdb.disable()

Если вы хотите снова включить его позже, неудивительно, что это сработает:

pdb.enable()

Легко! А еще вы получите много других полезных вкусностей.

Адам Спайерс
источник
4

Если вы действительно хотите выйти из отладчика, вам нужно запустить что-то вроде WinPdb, которое позволяет вам отключиться от процесса, а затем выйти из отладчика (NB, это многоплатформенный).

Если вы хотите продолжить отладку, но больше не останавливаетесь на заданной точке останова, вам необходимо:

  1. Запишите номер точки останова (или номер файла и строки),
  2. Либо cl bp_number или, clear file:line чтобы навсегда удалить точку останова либо disable pb_number отключить ее, но иметь возможность переключить обратно.
  3. Тогда continueи ваша программа будет работать до следующегобудет достигнута другая точка останова.

Подробнее об этом см. В руководстве .

Стив Барнс
источник
0

найдите новый способ выйти из pdb, ничего не устанавливая: - когда программа начнет работать, нажмите ctrl + c, затем переключите окно на другое (любое окно), тогда исходная оболочка с запущенным pdb должна показать что-то вроде: (pdb) ..... - переключитесь обратно на pdb, затем нажмите Enter, теперь все готово, командная оболочка pdb снова появляется

BrainAtom
источник