听起来我错过了极其简单的事情,我正在尝试使用以下代码在我的Python代码中设置断点:
if(some condition):
pdb.set_trace()
在大量迭代后,我的代码出现了错误…难以使用print等方法进行调试。当条件触发时,我能够打印内容,但我想设置断点。
--编辑--
实际代码:
import pdb
if (node_num == 16):
print node_num
pdb.set_trace()
我看到你找到了解决方案,Sanjay。但对于那些来到这里寻找使用pdb设置条件断点的方法的人:
不要像硬编码条件一样,例如if node_num == 16:
,而是在交互模式下运行pdb。示例代码:
import pdb
for node_num in range(50):
do_something(node_num)
...
在shell中使用-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)
当node_num大于4时,b 4, node_num > 4
命令会在第4行中断。
b(reak) [([文件名:]行号 | 函数名) [, 条件]]
https://docs.python.org/zh-cn/3/library/pdb.html#pdbcommand-break
例如我正在运行一些测试代码来迭代django视图。我只想在到达我感兴趣的特定视图时暂停执行:b C:\Users\powlo\project\tests\TestCase.py:350, view.view_name == 'app.views.export'
我不确定为什么你的代码不能正常工作,但是你可以在本地机器上创建一个新文件,以查看是否可以实现你想要做的事情。
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的作用是在异常发生的那个堆栈帧上设置一个断点,这样可以检查所有的值,然后让您继续执行。但是我还在结尾处放置了一个raise,以允许异常像正常情况一样继续执行,这意味着程序不会从异常发生的地方重新开始执行,而只是暂停在异常处理块中,因为有了post_mortem调用。在检查出问题后就可以放弃了。
sys.setrecursionlimit(10000)
这就是我不能设置断点的原因...我最初以为这与我的编译器有关,但当我重新验证了编译器等内容后,我发现这就是问题所在。
我从来没有想过我应该搜索一下最大递归深度。 - sanjay
if count > limit:
,然后执行流将进入该块,触发set_trace
并且执行将会在那里暂停。 - metatoasterimport pdb;pdb.set_trace()
。 - metatoasterpdb.set_trace()
都包含进去? - metatoaster