如何从Python进程崩溃转储中获取Python层调用栈与变量信息
问题解答
可以实现和纯C守护进程场景同等粒度的问题定位,同时能获取崩溃前最后调用的Python函数名称和对应上下文变量值,具体操作步骤如下:
前置准备
首先需要安装对应版本Python的调试符号包:
- Debian/Ubuntu 系列:安装
python3-dbg(Python2对应python-dbg) - RHEL/CentOS 系列:安装
python3-debuginfo
如果是自行编译的Python,编译时需要添加--with-pydebug参数生成调试符号。
核心分析步骤
- 用gdb加载core dump:
gdb python python-dump.core - 执行Python专属栈回溯命令:
- 要获取Python调用栈:执行
py-bt,会输出从CherryPy请求入口到触发ctypes调用的所有Python函数名称、所在文件、行号,和常规Python异常栈格式一致 - 要获取上下文变量:执行
py-bt-full,会在栈信息基础上附带每个栈帧的Python局部变量、入参值,也可以在定位到对应栈帧后用py-print 变量名打印指定变量的实际值
- 要获取Python调用栈:执行
- 关联C栈和Python栈:执行默认
bt命令获取完整C调用栈,配合py-bt的输出即可一一对应,既可以拿到C层的函数调用、入参信息,也可以拿到上层Python调用的全链路信息。
常见异常处理
如果gdb没有自动识别Python专属命令,可以手动加载调试扩展脚本:source /usr/share/gdb/auto-load/usr/bin/python3.x-gdb.py,把路径替换为你系统中对应Python版本的gdb扩展脚本实际路径即可。
需要保证分析用的Python版本和生成core dump时的服务运行Python版本完全一致,否则会出现符号不匹配无法解析的问题。
内容的提问来源于stack exchange,提问作者lucifer
相关产品推荐
相关产品推荐

