目录
一、文档说明
Linux环境下程序进程发生异常(崩溃)而挂掉,通常很难查找原因,但是一般Linux内核给我们提供的核心文件,记录了进程在崩溃时候的信息。通常存在以下三种调试程序异常退出(崩溃)的应用场景:
场景1:通过配置Linux环境程序进程发生异常(崩溃)退出时生成core文件,使用gdb命令对程序异常退出生成的core文件进行堆栈信息的调试。(适用于所有场景,推荐使用)
场景2:通过程序进程名称,直接使用gdb命令进行调试。(适用于命令行方式直接调试程序的场景)
场景3:通过程序进程的PID值,直接使用gdb命令进行调试。(适用于通过服务接口调用到程序进程,进行调试程序的场景)
二、Linux环境下生成core文件
2.1.当前shell窗口临时配置
# 查看生成core文件的开关是否开启
sudo ulimit -a
我们可以看到,第一行core文件大小为0,表示没有开启。
# 使用命令ulimit -c [kbytes]可以设置系统允许生成的core文件大小,生成core文件大小说明如下所示:
ulimit -c 0 —>不产生core文件
ulimit -c 100设置core —>文件最大为100k
ulimit -c unlimited —>不限制core文件大小
# 执行生成core文件大小(不限制大小)命令,然后查看core文件大小
#生成不限制大小的core文件
sudo ulimit -c unlimited
#查看配置的core文件大小
sudo ulimit -a
这样程序进程崩溃就可以生成core文件了,但是这种方法只能在当前shell中生效。(不建议使用)
2.2.永久生效配置
# 进入编辑模式,在profile文件中加入ulimit -c unlimited
sudo vim /etc/profile
# 使用source命令使配置文件文件马上生效
sudo source /etc/profile
# 进入编辑模式,在sysctl.conf配置文件中指定生成文件的路径和名字,在配置文件中添加如下两行内容:
sudo vim /etc/sysctl.conf
kernel.core_pattern=/swdata/core/core_%e_%p
kernel.core_uses_pid=0
# 在/swdata/下创建core目录,用sysctl -p /etc/sysctl.conf(如果此命令执行后不生效,则需要重启服务器后生效)使修改的配置马上生效
sudo mkdir -p /swdata/core
sudo sysctl -p /etc/sysctl.conf
备注:core_pattern的命名参数如下
%c 转储文件的大小上限
%e 所dump的文件名
%g 所dump的进程的实际组ID
%h 主机名
%p 所dump的进程PID
%s 导致本次coredump的信号
%t 转储时刻(由1970年1月1日起计的秒数)
%u 所dump进程的实际用户ID
# 验证core文件配置是否成功,执行验证core文件生成命令,可以看到/swdata/core下生成了一个core文件,说明已经设置成功。
sudo kill -s SIGSEGV $$
sudo ls /swdata/core
配置完成,接下来进程出问题就可以用core文件调试了。
三、堆栈信息(core dump)调试
3.1.通过生成的core文件调试
# 调用自己的程序发生崩溃时,同样会在/swdata/core/目录下生成一个core文件,命名格式为:core_[processName]_[processPid]
# 使用file命令可以查询到此core崩溃文件生成的对应程序
sudo file core_apiprocess_13275
# 使用gdb命令可以对崩溃堆栈文件,进行堆栈信息排查(若是服务器没有gdb命令,则需要首先安装gdb命令)
# 执行gdb [core崩溃文件生成的对应程序] [core文件],等待gdb命令运行停止后执行bt
sudo gdb /data/apiservice/app/api/x64-linux/apiprocess core_apiprocess_13275
#过程中需要等待gdb命令运行完成后输入bt
bt
等待崩溃堆栈信息输出完成后,即可查看程序崩溃的堆栈信息。
输入quit命令即可退出gdb命令调试。
3.2.通过程序进程名称调试
# 调用需要调试崩堆栈信息的程序(本次调试使用的apiToDocument程序)
# 使用gdb [process]进行调试,等待gdb命令运行停止后执行r [运行内容]
# 调用程序使其发生崩溃,此时gdb会有输出,等待gdb命令运行停止后执行bt
3.3.通过程序进程PID调试
# 查询需要调试崩溃堆栈信息程序的PID(本次调试使用的apiprocess程序)
sudo ps -e|grep apiprocess
# 使用gdb --pid=[pid值]进行调试,等待gdb命令运行停止后执行c
# 调用自己的程序使其发生崩溃,此时gdb会有输出,等待gdb命令运行停止后执行bt
等待崩溃堆栈信息输出完成后,即可查看程序崩溃的堆栈信息,输入quit命令即可退出gdb命令调试。