前言
不知各位有木有遇到这样的情况,生产环境下的Python进程突然卡死了,所有其他线程都无法调度,如果我们kill掉重启,通常会丧失掉当前报错的上下文信息,失去这些信息,对后续报错定位不太友好,能不能在不关停Python程序的情况下,看看程序发生了什么问题?
首先,你可以尝试一下,此前我提过的py-spy(漫画:如何分析运行中的 Python 程序?),py-spy可以打印出简单的调用信息,但很多时候不够用,这里我们通过gdb来调试Python程序,同时打印c栈和py栈的信息,调试起来,一目了然。
gdb主要用于调试c/c++程序的,因为Python是使用c写的(cpython,当然还有其他语言实现的),对gdb而言,将python当成普通的c程序调试则可。
当我们使用gdb调试python进程时,我们会获得解释器级别的调试信息和内存状态,而不是应用程序级别的(我们使用pdb便是应用程序基本的),这样我们可以看到Python完整的执行流程,包括解释器上函数与变量的信息。
我的服务器是Ubuntu 20.04,所以本文的操作都在Ubuntu 20.04上进行。
安装gdb调试环境
首先,需要安装一下gdb。
sudo apt-get install gdb
光安装gdb,在调试python时&#