听起来我错过了一些非常简单的东西,我试图在我的python代码中使用以下命令设置断点:
if(some condition):
pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)
我的代码中的错误是在大量迭代之后出现的......难以使用print等进行调试.当条件命中时我能够打印东西但是我想设置brk-pt.
- 编辑 -
实际代码:
import pdb
if (node_num == 16):
print node_num
pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)
mcc*_*hiz 20
我看到你找到了解决方案Sanjay.但对于那些到达这里的人来说,寻找一种方法来设置一个带pdb的条件断点:
而不是硬编码条件,例如if node_num == 16:,在交互模式下运行pdb.示例代码:
import pdb
for node_num in range(50):
do_something(node_num)
...
Run Code Online (Sandbox Code Playgroud)
在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)
Run Code Online (Sandbox Code Playgroud)
b 4, node_num > 4当node_num大于4时,pdb shell命令在第4行中断.
要在 pdb 中实际使用条件断点,您可以执行以下操作:
b(reak) [([文件名:]lineno | 函数) [, 条件]]
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'
我不确定为什么你的代码不起作用,但你可以做的是在本地计算机上,为你的最小示例创建一个新文件,看看你是否可以做你想做的事情
import pdb
for node_num in range(50):
if node_num == 16:
print(node_num)
pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)
现在运行它:
16
> /tmp/tmp.py(3)<module>()
-> for node_num in range(50):
(Pdb) p node_num
16
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,在这个简单的示例中,这按预期工作,您需要弄清楚如何使其适应您的代码,和/或弄清楚您对代码/环境做了什么其他操作,导致提示无法显示。
或者,如果您有一个函数在异常中终止,并且您想知道导致它的确切行,则应该使用post_mortem。用这个包裹有问题的代码部分
try:
problem_function()
except Exception: # or the specific exception type thrown
pdb.post_mortem()
raise
Run Code Online (Sandbox Code Playgroud)
post_mortem 要做的就是在异常发生的地方(特别是在该堆栈帧中)转储一个断点,这样就可以检查所有值,然后让您继续执行。不过,我还在末尾加了一个引发,以允许异常正常继续,这是因为执行通常不会从它终止的地方开始,而是由于调用而在该异常处理块处暂停post_mortem。检查出问题所在后,还不如放弃。
| 归档时间: |
|
| 查看次数: |
9501 次 |
| 最近记录: |