Is it possible to remove a break point set with ipdb.set_trace()?
Asked Answered
B

4

31

I used ipdb.set_trace() somewhere in my Python code. Is it possible to ignore this break point using a IPDB command?

clear tells me that it cleared all break points, but IPDB stops again when it stumbles upon the line with ipdb.set_trace().

disable 1 tells me: No breakpoint numbered 1 ignore 1 says: Breakpoint index '1' is not valid

To clarify: Of course I could simply remove the break point from my source code. But this would require to quit the debugger and to start it again. Often it needs a lot of work to get somewhere and restarting the debugger makes life more difficult. Also if there is a huge loop and you want inspect objects in the loop, the easiest is to place a break point in the loop directly after the object. How could I then skip the loop (and all thousands of calls set_trace()) and step through the code after the loop using next?

Bevis answered 30/9, 2013 at 16:9 Comment(2)
breakpoints are only for debugging, It is a good idea to keep track of where you have set it. You are better off doing a grep or a search to figure out where it is.Kakalina
@Kakalina Yes, of course. I think you misunderstood my question a bit. I tried to clarify how I'd like to use the debugger.Bevis
S
49

Well, you CAN take advantage of the fact that anything in Python is an object. While in the debugger, you can do something like this:

def f(): pass
ipdb.set_trace = f

set_trace will still be called, but it won't do anything. Of course, it's somewhat permanent, but you can just do

reload ipdb

and you'll get the original behaviour back.

(why would you do this? when you accidentally put a breakpoint in an often-called function that is usually called under a try/except. Once you realize you're stopping 1000 times in this function, you try to ctrl-c, but that gets caught by the try/except and you're back in ipdb again. So, if you're in low-level code, make sure your set_traces have some context:

if myvar in ['some', 'sentinel', 'values']:
    ipdb.set_trace()

etc.

Shutz answered 30/9, 2013 at 18:52 Comment(3)
+1 for the great suggestion of simply overwriting set_trace(). Anyhow, this does not enable to delete a specific break point.Bevis
it should be possible to extend this concept to eliminate just a single breakpoint, by using the inspect module to determine the current file/line, and either return (doing nothing) or call the original ipdb.set_trace(). i don't have a recipe but i have had use of this a couple times so this is inspiring me to put one together...Shutz
This happens to me quite a bit when working with test suites. If you're stuck and just want your shell prompt back, a simple del ipdb.set_trace works like a charm.Armament
C
28

After learning from Corley

ipdb.set_trace = lambda: None

Works for me.

Cocaine answered 31/1, 2017 at 20:9 Comment(0)
F
4

Based on Corley and GLaDOS answers, you can use this trick to set_trace for several loops without overwriting the ipdb.set_trace()

import ipdb
dbg1 = ipdb.set_trace  # BREAKPOINT
for i in range(10):
    my_var2 = 10 / 3
    dbg1()  # BREAKPOINT
    dbg1 = lambda: None
    print(my_var2)


dbg2 = ipdb.set_trace  # BREAKPOINT
for i in range(10):
    my_var2 = 20 / 3
    dbg2()  # BREAKPOINT
    dbg2 = lambda: None
    print(my_var2)

Works for me like a charm.

Fusty answered 15/3, 2019 at 1:11 Comment(1)
This is the best one so far on here, you can set multiple break points and they do not interfere with each other.Justinajustine
S
-4

Running the program should also tell you exactly where you've set your idb.set_trace() when it's being hit (otherwise, try the where or bt commands). You can then remove that line from the file, and restart the program.

Otherwise, you might find this useful, if you feel more experimental.

Schwejda answered 30/9, 2013 at 18:2 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.