司开星的博客

调试线上卡死的Python进程

有时线上程序运行过程中出现卡死(阻塞),无法通过断点或log找到问题,需通过其他方式调试。本文基于CentOS 7。

通用调试方法

以下命令不限于调试Python程序。

查看进程号:
ps auxf

查看此进程卡在哪个系统回调:

strace -p *pid*

pid替换为实际进程号。此命令会返回一个系统回调和文件操作符。

检查上一条命令系统回调的文件操作符的含义:

ls -l /proc/*pid*/fd

数字就是文件操作符。

/proc/pid 中还包含其他很多进程信息,有兴趣可自行研究。

列出此进程当前的文件操作:

lsof -p *pid*

查看卡死的Python代码

如果想直接看到进程卡死在哪行代码可以使用gdb。

阿里云默认源无debuginfo, 需添加源地址:

sudo vim /etc/yum.repos.d/CentOS-Debug.repo

1
2
3
4
5
6
7
8
#Debug Info
[debug]
name=CentOS-$releasever - DebugInfo
baseurl=http://debuginfo.centos.org/$releasever/$basearch/
gpgcheck=0
enabled=1
protect=1
priority=1

sudo yum install gdb
sudo yum install yum-utils
sudo debuginfo-install glibc
sudo yum install python-debuginfo

进入gdb环境:

gdb python *pid*

显示当前进程执行位置:

py-list

显示当前执行位置的调用栈:

py-bt

参考资料:

DebuggingWithGdb
用strace查找进程卡死原因
centos7 安装 debuginfo
使用 gdb 调试运行中的 Python 进程
通过/PROC查看LINUX内核态调用栈来定位卡死问题