25

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.

Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
shelper
  • 10,053
  • 8
  • 41
  • 67

3 Answers3

28

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"

shelper
  • 10,053
  • 8
  • 41
  • 67
12

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 :)

Paulo Bu
  • 29,294
  • 6
  • 74
  • 73
  • 2
    well, i agree, but that is too invasive to the code, i have to change the code time to time if i want to change the condition – shelper Jun 24 '13 at 16:44
  • 1
    Ok but think about it, I edited my code to leave it in just one line of code. Is just as invasive as `import pdb;ipdb.set_trace()` don't you think. Though I agree would be useful to use `condition` but I can't seem to find any reference about how to use it. – Paulo Bu Jun 24 '13 at 16:57
  • 2
    say, if you already in the pdb, and you could not find any issue for `i==10`, but you want to try `i==50`, if you can not set up conditional breakpoint, you have to exit() pdb, modify the code to `if i==50:` and run it again. that is not user-friendly... anyway, thanks for your suggestion – shelper Jun 24 '13 at 17:31
10

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
Jim Parker
  • 1,095
  • 11
  • 16