使用pdb设置条件断点
听起来我可能漏掉了一些非常简单的东西,我想在我的Python代码中设置一个断点,使用的是:
if(some condition):
pdb.set_trace()
我的代码错误是在经过很多次循环后出现的……用打印等方法调试很困难。 当条件满足时,我可以打印一些东西,但我想设置一个断点。
--编辑--
实际代码:
import pdb
if (node_num == 16):
print node_num
pdb.set_trace()
3 个回答
要在 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'
我看到你找到了自己的解决办法,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行停下来。
我不太确定你的代码为什么不工作,但你可以在自己的电脑上创建一个新文件,写一个最简单的例子,看看能否实现你想要的功能。
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
。在检查完出错的地方后,可能就可以放弃了。