首选是如何生成coredump文件,让python进程coredump的时候会生成对应的coredump文件呢?
步骤一:开启core dump文件生成
ulimit -c unlimited
步骤二:设置core dump文件位置
vi /etc/sysctl.conf
修改(添加)如下两个变量
kernel.core_pattern =/var/core/core_%e_%p
kernel.core_uses_pid= 0
这里是改为生成目录在/var/core/,%e代表程序名称,%p是进程ID
如果想直接生成在可执行文件相同目录,前面不要加任何目录,直接
kernel.core_pattern =core_%e_%p
步骤三:让修改生效
sysctl -p/etc/sysctl.conf
获取到coredump文件之后,我们将名字命名为core.file
接下来就是使用gdb工具来进行分析了,来定位到是由于那个代码导致的coredump,步骤如下:
1、安装gdb 可以通过yum等方式安装,如yum install -y gdb*
2、安装python-debuginfo
yum install -y python3-debuginfo
这里安装python-debuginfo主要是使用py-bt等命令用来显示python的堆栈中的详细信息,如果没有找到对应的版本,可以下载pythn源码,从源码中获取在gdb的过程进行加载,使用方法如下:
$ gdb
$ gdb> source /{python3.8CodePath}/Tools/gdb/libpython.py
3、查看具体的python版本号
$ gdb core.file
$ gdb> info proc mappings
因此能够显示看出这个core文件中使用的python版本号(主要是通过看python的路径,再根据python的路径去找到对应的版本)
4、下载并加载符号表
在已经知道了对应python版本之后就去下载对应版本的符号表,一般是python-**.zip1命名
如果环境没有对应的python版本也可以去下载一个对应的版本,然后将符号表解压出来,将python.dbg拷贝到python的bin目录下
cp {py_1}/output/python.dbg {py}/bin/
符号表主要是用于解析C堆栈的,如果没有符号表,bt显示的堆栈可能不全,或者有些部分显示??
5、开始分析
$ gdb -q {py}/bin/python core.file
$ gdb> source /{python3.8CodePath}/Tools/gdb/libpython.py
$ py-bt
这里就能找到对应的代码出问题的地方,然后需要对照代码进行分析