使用 gdb 调试 Python 进程
有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump。例如现在遇到一个mod_wsgi的进程僵死了,不接受请求,想看看究竟是运行到哪行Python代码呢?这时就需要祭出gdb这个神器了。
准备
1. 确认你的gdb版本是>=7,gdb从版本7开始支持对Python的debug。 (ref)
2.确认gdb连接的Python是所要debug的Python,否则请重新编译gdb。
方法:
$ gdb
(gdb) python
>import sys
>print sys.version
>end
2.4.3 (#1, Sep 21 2011, 19:55:41)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)]
在一些追求稳定的发行版(例如CentOS),Python的版本会较低,这时都会自己编译一个Python使用。而从源里安装的gdb会连接源里Python的版本。例如在CentOS 5.4,源里的Python是2.4.3,从源安装的gdb也会连接到Python 2.4.3。
编译时注意,要把自己编译的Python路径加到PATH环境变量里,这样gdb configure的时候才会找到新版Python并连接。
3.下载libpython.py
如何Debug
假设要debug的进程号为1000
$ gdb -p 1000
使用此命令即可使gdb附加到进程。
载入libpython脚本
如果你的gdb是redhat或fedora等厂商修改过的,会有--python选项,使用此选项即可指定gdb启动时载入的Python扩展脚本(此脚本是扩展gdb的,不是我们需要debug的脚本)。
$ gdb --python /path/to/libpython.py -p 1000
如果安装的是GNU的gdb,就需要打开gdb后手动载入libpython.py脚本
(gdb) python
>import sys
>sys.path.insert(0, '/path/to/libpython.py')
>import libpython
>end
(gdb)
这时就可以使用py-bt命令打印当前线程的Python traceback了
libpython还提供很多命令,例如py-print打印变量,py-locals打印所有本地变量等等,详细可打开libpython.py查看。
一点经验
- 在gdb可以使用generate-core-file命令生成一个coredump文件。之后可以用gdb –core来打开coredump文件进行debug。避免一直attach住进程,可以快速重启恢复服务
- gdb-heap是gdb的一个扩展。可以打印Python的内存使用情况
参考资料
# 来源:不沉之月
最新招聘
- [北京] python工程师 - 创新工场
- [北京] 高级产品工程师(3年以上Python实际工作经验) - 问天(北京)信息技术有限公司
- [北京] 招聘Python高级工程师 - 创业公司
- [武汉] Perl软件工程师(高新急聘) - 赛诺(武汉)技术有限公司
- [武汉] 云存储软件研发工程师(高新急聘) - 赛诺(武汉)技术有限公司