使用pdb设置条件断点

26 投票
3 回答
33295 浏览
提问于 2025-04-18 17:05

听起来我可能漏掉了一些非常简单的东西,我想在我的Python代码中设置一个断点,使用的是:

if(some condition):
        pdb.set_trace()

我的代码错误是在经过很多次循环后出现的……用打印等方法调试很困难。 当条件满足时,我可以打印一些东西,但我想设置一个断点。

--编辑--

实际代码:

import pdb
if (node_num == 16):
    print node_num
    pdb.set_trace()

3 个回答

16

要在 pdb 中使用条件断点,你可以这样做:

b(reak) [([文件名:]行号 | 函数) [, 条件]]

https://docs.python.org/3/library/pdb.html#pdbcommand-break

举个例子,我在运行一些测试代码,这些代码会遍历 django 的视图。我只想在我感兴趣的特定视图被调用时暂停:

b C:\Users\powlo\project\tests\TestCase.py:350, view.view_name == 'app.views.export'

58

我看到你找到了自己的解决办法,Sanjay。不过对于那些来到这里寻找如何用pdb设置条件断点的人来说:

不要死板地写条件,比如 if node_num == 16:,可以在交互模式下运行pdb。下面是一个示例代码:

import pdb

for node_num in range(50):
  do_something(node_num)
...

在命令行中,使用 -m pdb 启动脚本的调试模式:

[rick@rolled ~]$ python -m pdb abc.py
> /home/dcadm/abc.py(1)<module>()
-> import pdb
(Pdb) l
  1  -> import pdb
  2
  3     for node_num in range(50) :
  4       foo = 2**node_num
[EOF]
(Pdb) b 4, node_num > 4
Breakpoint 1 at /home/dcadm/abc.py:4
(Pdb) c
> /home/dcadm/abc.py(4)<module>()
-> foo = 2**node_num
(Pdb) node_num 
5
(Pdb)

在pdb的命令行中,输入b 4, node_num > 4,当node_num大于4时,程序会在第4行停下来。

2

我不太确定你的代码为什么不工作,但你可以在自己的电脑上创建一个新文件,写一个最简单的例子,看看能否实现你想要的功能。

import pdb

for node_num in range(50):
    if node_num == 16:
        print(node_num)
        pdb.set_trace()

现在运行它:

16
> /tmp/tmp.py(3)<module>()
-> for node_num in range(50):
(Pdb) p node_num
16

如你所见,这个简单的例子运行得很顺利。接下来就看你怎么把这个方法应用到你的代码上,或者找出你对代码/环境做了什么,导致那个提示没有出现。

另外,如果你有一个函数因为异常而崩溃了,想知道到底是哪一行出了问题,你应该使用 post_mortem。把出问题的代码部分用这个包裹起来:

try:
    problem_function()
except Exception:  # or the specific exception type thrown
    pdb.post_mortem()
    raise

post_mortem 的作用是在异常发生的地方设置一个断点,这样你就可以查看所有的值,然后继续执行代码。不过我在最后加了一个抛出异常的语句,这样异常就会正常继续处理。因为通常情况下,代码不会从崩溃的地方继续执行,而是会在异常处理的地方暂停,这是因为调用了 post_mortem。在检查完出错的地方后,可能就可以放弃了。

撰写回答