问题
Say I have code the following code:
for i in range(100):
print i
In general I can add one line to the code as:
for i in range(100):
import ipdb;ipdb.set_trace()
print i
However, now I want to debug it at condition of i == 10
, and I don't want to bother by typing c
for 10 times in ipdb, how should I do?
In the documentation I found condition bpnumber [condition]
, but how could I know the bpnumber
if there is no list of bpnumber
index. The documentation also says b(reak) ([file:]lineno | function) [, condition]
. For example, assume the line number of print i
is xx
. I entered the following in ipdb shell: b xx, i == 10
but nothing as expected happened.
回答1:
alright, i did some exploration myself, here is my new understanding of pdb. when you input import ipdb;ipdb.set_trace()
you actually add an entry point of ipdb to the line, not really a breakpoint.
after you enter ipdb, you can then setup breakpoints
so, to realize what i want for conditional debugging, i should add as follows
import ipdb;ipdb.set_trace()
for i in range(100):
print i
then after i enter ipdb, i can input b xx, i == 10
, and then c
or r
to run the code, then the code will stop when the condition is met. when I input l
, the bpnumber is shown for the line as :
xx-1 for i in range(100):
bpnumber> xx print i
xx+1 ...
i have to say, the document and all other explanations are so confusing, i wish my answer here clarifies the difference between the "debug entry point" and "debug breakpoint"
回答2:
There's a quick dirty way like this:
for i in range(100):
if i == 10: import ipdb;ipdb.set_trace()
print i
It works and don't have to busy your mind with any other commands :)
回答3:
I think you were looking for a more direct solution that did not involve adding lines to the code, and just involved debugger commands.
Your original example of
b xx, i == 10
doesn't work, because you are setting a breakpoint at the place in your code you inserted the ipdb.set_trace() command. By adding the statement 'b xx, i == 10' in the debugger, you actually have 2 break points (1 conditional and 1 unconditional) defined at the same location (assuming xx is the line were the set_trace() command is).
Alternatively, once you have defined breakpoints in your code using the 'b' command, which apparently works for you. You can add a condition to the breakpoint by
condition bpnumber boolean-expression
for example
condition 1 i == 10
Note: the bpnumber is the number assigned to the breakpoint, not the line in your code. To see a list of breakpoints, just type 'b' with no arguments.
Also, if you want to enter debug mode without using ipdb.set_trace(), you simply run your code with the pdb/ipbd module enabled
python -m pdb foo.py
来源:https://stackoverflow.com/questions/17280575/pdb-ipdb-for-python-break-on-editable-condition