Pdb/ipdb для python break на редактируемом состоянии
Скажем, у меня есть код следующего кода:
for i in range(100):
print i
В общем, я могу добавить одну строку в код как:
for i in range(100):
import ipdb;ipdb.set_trace()
print i
Однако теперь я хочу отлаживать его при условии i == 10
, и я не хочу беспокоиться, набрав c
10 раз в ipdb, как мне это сделать?
В документации я нашел condition bpnumber [condition]
, но откуда я могу узнать bpnumber
, если нет списка индекса bpnumber
. В документации также указано b(reak) ([file:]lineno | function) [, condition]
. Например, предположим, что номер строки print i
равен xx
. Я ввел следующее в оболочку ipdb: b xx, i == 10
, но ничего не ожидалось.
Ответы
Ответ 1
ладно, я сам сделал некоторые исследования, вот мое новое понимание pdb. когда вы вводите import ipdb;ipdb.set_trace()
, вы фактически добавляете точку входа ipdb в строку, а не точку останова.
после ввода ipdb вы можете установить точки останова
поэтому, чтобы понять, что я хочу для условной отладки, я должен добавить следующее
import ipdb;ipdb.set_trace()
for i in range(100):
print i
то после того, как я войду в ipdb, я могу ввести b xx, i == 10
, а затем c
или r
для запуска кода, тогда код остановится, когда условие будет выполнено. когда я ввожу l
, bpnumber отображается для строки как:
xx-1 for i in range(100):
bpnumber> xx print i
xx+1 ...
Я должен сказать, что документ и все другие объяснения настолько запутывают, я хочу, чтобы мой ответ здесь пояснил разницу между "точкой отладки" и "точкой отладки"
Ответ 2
Там быстро грязный способ:
for i in range(100):
if i == 10: import ipdb;ipdb.set_trace()
print i
Он работает и не должен заниматься вашим умом другими командами:)
Ответ 3
Я думаю, вы искали более прямое решение, которое не включало бы добавление строк в код, и просто включали команды отладчика.
Ваш оригинальный пример
b xx, i == 10
не работает, поскольку вы устанавливаете точку останова в месте вашего кода, вы вставили команду ipdb.set_trace(). Добавив в отладчик выражение "b xx, я == 10", на самом деле у вас есть 2 точки останова (1 условный и 1 безусловный), определенные в одном и том же месте (при условии, что xx является строкой, это команда set_trace()).
В качестве альтернативы, как только вы определили точки останова в своем коде, используя команду "b", которая, по-видимому, работает для вас. Вы можете добавить условие к точке останова на
condition bpnumber boolean-expression
например
condition 1 i == 10
Примечание: bpnumber - это номер, назначенный точке останова, а не строка в вашем коде. Чтобы просмотреть список точек останова, просто введите "b" без аргументов.
Кроме того, если вы хотите войти в режим отладки без использования ipdb.set_trace(), вы просто запустите свой код с включенным модулем pdb/ipbd
python -m pdb foo.py