我一直在玩验尸调试,但遇到了一些问题。考虑以下名为example.py
的python脚本:
k = 0
print 1. / k
print 'continue ...'
我可以用以下方式运行:
> python -m pdb example.py
然后单步执行第2行print 1. / k
,然后设置k = 1
,然后继续使用pdb命令c
。
现在,如果我使用事后调试来执行此操作,则无法继续执行程序。我跑:
> python -i example.py
然后在我进入shell之后我做了一个:
import pdb
pdb.pm()
然后我可以像以前一样更改k
的值,但我无法继续执行任何程序。 Pdb只是退出。
我无法在任何地方发现它明确指出你无法在验尸中单步执行程序。情况似乎如此。那么我想了解验尸调试的价值。是错误发生时检查代码状态的唯一值吗?
答案 0 :(得分:9)
抛出异常时会调用验尸。
此时,堆栈不再“活动”,您无法再单步执行代码。毕竟,刚刚抛出异常,表明代码路径不再继续。如果您使用表达式result
,那么您期望result = 1. / k
会是什么?
在患者死亡(死后,拉丁语)之后,使用文字后死亡来看死因是什么。 pdb验尸也不例外。您可以看到该计划在死亡时的状态,但您无法为死者重新制作动画。
换句话说,Post Mortem的目的是通过详细检查程序状态在失败时的状态来理解程序失败的原因
。该术语尚未在pdb手册中明确记录,可能是因为术语“Post Mortem”被认为是常用的。 Wikipedia article on debugging提到了它,而Python并不是提供该技术的唯一语言; Windows debuggers也提供此功能,R也提供此功能。