Подтвердить что ты не робот

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, но ничего не ожидалось.

4b9b3361

Ответ 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