Python中的事后调试允许单步执行还是继续执行?

Python中的事后调试允许单步执行还是继续执行?,python,debugging,pdb,Python,Debugging,Pdb,我一直在玩验尸调试,我有一些问题。请考虑下面的Python脚本,称为“代码>示例.Py < /C> >: k = 0 print 1. / k print 'continue ...' 我可以通过以下方式运行此功能: > python -m pdb example.py 然后转到第2行print 1./k然后设置k=1,然后继续使用pdb命令c 现在,如果我在事后调试中这样做,我将无法继续执行程序。我与: > python -i example.py 在我被扔进壳里之后,我做了

我一直在玩验尸调试,我有一些问题。请考虑下面的Python脚本,称为“代码>示例.Py < /C> >:

k = 0
print 1. / k
print 'continue ...'
我可以通过以下方式运行此功能:

> python -m pdb example.py
然后转到第2行
print 1./k
然后设置
k=1
,然后继续使用pdb命令
c

现在,如果我在事后调试中这样做,我将无法继续执行程序。我与:

> python -i example.py
在我被扔进壳里之后,我做了一个:

import pdb
pdb.pm()
然后,我可以像以前一样更改
k
的值,但无法继续执行任何程序。Pdb只是简单地退出


我找不到任何地方,它明确指出,你不能通过一个程序在验尸。似乎是这样。因此,我想了解事后调试的价值。是否是发生错误时检查代码状态的唯一值?

引发异常时将调用事后检查

此时,堆栈不再处于“活动”状态,您无法再单步执行代码。毕竟,刚刚抛出了一个异常,表明代码路径无法继续。如果表达式为
result=1,您希望
result
是什么k
例如

字面上的尸检是用来观察病人死后(拉丁文的尸检)的死因。pdb验尸也不例外。您可以查看程序在死亡时的状态,但无法重新设置死者的动画

换句话说,验尸的目的是通过详细检查程序失败时的状态来理解程序失败的原因

pdb手册中没有明确记录该术语,可能是因为“验尸”一词被认为是常用的。作者顺便提到了它,Python并不是唯一提供这种技术的语言;也提供该功能,其他功能也是如此

如果你希望通过追踪“重新制作”尸体,要知道有巨大的障碍需要克服。虽然异常的回溯确实包括对堆栈中每个帧的全局和本地命名空间的引用,但活动堆栈包含更多回溯中未包含的状态,即无法重新构造的状态。这包括(特别是当产生闭包的父函数本身不是回溯的一部分时),或处理
try

对于那些不抱希望的人,我要说的是:这个计划已经通过了!这个节目已经没有了!它已经不存在了t过期了,去见“is maker!”这是个僵硬的家伙!失去生命,它安息了!如果你没有把它钉在回溯上,你就不会把雏菊推上去了!它的评估循环簿记现在是“历史”它掉在树枝上了!它踢出了水桶,它从它的凡人的线圈中拖着脚,跑下窗帘,加入了流血的无形合唱团!!这是一个退役计划


(向约翰·克莱斯和迈克尔·佩林致歉)。

你应该为那条巨蟒的恶作剧投上一票!(当然,在技术上准确和有洞察力也是很好的,你已经做到了。)