如何分析python服务生成的coredump文件

首选是如何生成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

这里就能找到对应的代码出问题的地方,然后需要对照代码进行分析

你可能感兴趣的:(后端开发,linux,python,性能优化)