Linux环境抓取程序异常退出(崩溃)的堆栈信息(core dump)

目录

一、文档说明

二、Linux环境下生成core文件

2.1.当前shell窗口临时配置

2.2.永久生效配置

三、堆栈信息(core dump)调试

3.1.通过生成的core文件调试

3.2.通过程序进程名称调试

3.3.通过程序进程PID调试


一、文档说明

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命令调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值