是否可以删除使用 ipdb.set_trace() 设置的断点



我在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()的确切位置(否则,请尝试wherebt命令)。然后,您可以从文件中删除该行,并重新启动程序。

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

相关内容

  • 没有找到相关文章

最新更新