28

ipdb.set_trace()在 Python 代码中的某个地方使用过。是否可以使用 IPDB 命令忽略此断点?

clear告诉我它清除了所有断点,但是当 IPDB 偶然发现带有ipdb.set_trace().

disable 1告诉我:No breakpoint numbered 1 ignore 1说:Breakpoint index '1' is not valid

澄清一下:当然,我可以简单地从我的源代码中删除断点。但这需要退出调试器并重新启动它。通常需要做很多工作才能到达某个地方,重新启动调试器会使生活变得更加困难。此外,如果有一个巨大的循环并且您想要检查循环中的对象,最简单的方法是在循环中直接在对象之后放置一个断点。然后我怎么能跳过循环(以及所有成千上万的调用set_trace())并在循环之后使用代码单步执行next

4

4 回答 4

48

好吧,您可以利用 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()

等等

于 2013-09-30T18:52:26.307 回答
24

向科利学习后

ipdb.set_trace = lambda: None

为我工作。

于 2017-01-31T20:09:38.790 回答
4

根据 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)

像魅力一样为我工作。

于 2019-03-15T01:11:37.243 回答
-3

运行程序还应该准确地告诉您在idb.set_trace()被击中时将其设置在哪里(否则,请尝试whereorbt命令)。然后,您可以从文件中删除该行,然后重新启动程序。

否则,如果您觉得更具实验性,您可能会发现这很有用。

于 2013-09-30T18:02:19.533 回答