我在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
单步执行代码?
好吧,你可以利用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()
等。
向科利学习后
ipdb.set_trace = lambda: None
为我工作。
基于 Corley 和 GLaDOS 的答案,您可以使用此技巧在不覆盖 ipdb.set_trace() 的情况下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)
对我有用,就像一个魅力。
运行程序还应该告诉您在被击中时设置idb.set_trace()
的确切位置(否则,请尝试where
或bt
命令)。然后,您可以从文件中删除该行,并重新启动程序。
否则,如果您觉得更具实验性,您可能会发现这很有用。