????????事后调试(post-mortem debugging)指的是程序运行发生异常而进入的调试模式。
? ? ? ? 当执行一个python脚本触发异常时,我们可以通过该方式进行问题的快速定位。使用如下命令执行需要调试的python脚本: python -m pdb script.py,该执行方式使用了python的标准模块pdb,pdb是python用来调试程序的模块。使用该方式执行脚本,脚本会从第一行开始就进入调试模式,然后直接输入c回车,程序就会一直执行,直到程序遇到异常;当程序遇到异常后,python便会立即进入所谓的事后调试模式(post-mortem debugging mode),并且程序会停止在触发异常的那一行,在该位置,我们便可以交互地进行调试了,包括变量的查看、代码的执行等,从而可以快速的定位到问题。这样做的好处在于,省得我们要回到脚本相应的位置手动的设置断点,特别是在没有IDE的情况下,比如在命令行执行脚本的时候,以及后续对断点代码的删除。
? ? ? ? 进入事后调试模式后,输入c或者n都会结束事后调试模式,并且重启程序,从程序第一行开始重新进入调试模式,但是依然会记住事后调试模式的状态,比如如果你在事后调试模式中通过b命令设置的断点。因此,事后调试模式有点像为了定位问题进行埋点(断点设置),然后再重新进入调试模式,并且c到断点处进行详细定位,因为这时可以通过n逐行运行代码,而不是直接退出事后调试模式。
? ? ? ? 通常配合事后调试模式的pdb命令有获取当前程序所追踪的最新帧、切换当前帧、设置断点等,对应地,我们可以通过w(where)命令获取当前帧以及上下文,箭头所指就是对应的帧;通过u(up)和d(down)来切换当前帧,并且移动当前帧所在的脚本文件;通过b(break) lineno命令在指定的行设置断点,因为b lineno中的lineno指的是当前帧所在的脚本文件对应的行数,所以需要进行帧的切换,以在我们想要的文件中设置断点,此外也可以b funcname方式在相应的函数第一行设置断点,当然该函数也应该在当前帧所在的脚本文件内才行。上述一般在事后调试模式中进行,然后通过c或n结束事后调试,自动重启程序,再进入普通调试模式进行详细问题的定位。
|