pdb/ipdb for python break on editable condition
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 set up breakpoints.
So, to realize what I want for conditional debugging, I should do this:
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. 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 documentation and all other explanations are very confusing, I hope my answer here clarifies the difference between the "debug entry point" and "debug breakpoint"
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 :)
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