我在Python代码中的某处使用了ipdb.set_trace()
。是否可以使用IPDB命令忽略此断点?
clear
告诉我它清除了所有断点,但是当它偶然发现ipdb.set_trace()
时,IPDB再次停止。
disable 1
告诉我:No breakpoint numbered 1
ignore 1
说:Breakpoint index '1' is not valid
澄清一下:当然我可以简单地从源代码中删除断点。但这需要退出调试器并再次启动它。通常需要大量工作才能到达某个地方并重新启动调试器会使生活变得更加困难。此外,如果存在一个巨大的循环并且您想要在循环中检查对象,最简单的方法是在对象之后直接在循环中放置一个断点。然后,我怎么能跳过循环(以及所有数千次调用set_trace()
)并在循环后使用next
逐步执行代码?
答案 0 :(得分:38)
好吧,你可以利用Python中的任何东西都是一个对象的事实。在调试器中,您可以执行以下操作:
def f(): pass
ipdb.set_trace = f
仍将调用set_trace,但它不会执行任何操作。 当然,它有点永久,但你可以做到
reload ipdb
你会得到原来的行为。
(你为什么要这样做呢?当你不小心把一个断点放在一个经常被调用的函数中时,通常在try / except下调用。一旦你意识到你在这个函数中停止了1000次,你试图ctrl- c,但是被try / except抓住了,你又回到了ipdb。所以,如果你是低级代码,请确保你的set_traces有一些上下文:
if myvar in ['some', 'sentinel', 'values']:
ipdb.set_trace()
等
答案 1 :(得分:13)
从Corley学习后
ipdb.set_trace = lambda: None
适合我。
答案 2 :(得分:1)
基于Corley和GLaDOS答案,您可以使用此技巧为几个循环设置set_trace,而无需覆盖 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)
像魅力一样为我工作。
答案 3 :(得分:-3)
运行该程序还应该告诉您在idb.set_trace()
被命中时确切设置的位置(否则,请尝试where
或bt
命令)。然后,您可以从文件中删除该行,然后重新启动该程序。
否则,如果您感觉更具实验性,可能会发现this很有用。