有时线上程序运行过程中出现卡死(阻塞),无法通过断点或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 | Debug Info |
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内核态调用栈来定位卡死问题