在Docker内使用GDB调试Apollo项目的核心转储(Core Dump)文件

本文详细介绍如何在Ubuntu 16.04系统中启用核心转储功能,并使用GDB调试器进行调试,同时提供了Apollo项目中核心转储文件的调试方法。

严正声明:本文系作者davidhopper原创,未经许可,不得转载!

在Linux系统中,若程序异常终止,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为叫做Core Dump(中文一般译为“核心转储”)。实际上,除内存信息之外,核心转储还会记录程序的一些关键运行状态,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息等。核心转储对于程序员调试程序非常有益,因为有些程序错误是很难重现的,例如指针异常,而核心转储文件可以重现程序出错时的情景。

一、Ubuntu 16.04系统中打开核心转储功能

Ubuntu 16.04系统默认关闭了核心转储功能,需重新设置打开。

1. 检查核心转储是否打开

按快捷键“Ctrl+Alt+T”打开命令终端,输入命令:

ulimit -c

若输出的结果为 0,则说明默认是关闭核心转储功能的,即当程序异常终止时,不会生成核心转储文件。

2. 在当前命令终端中打开核心转储

使用命令:

ulimit -c unlimited

可开启当前命令终端的核心转储功能,并且不限制核心转储文件大小; 若需限制文件大小,将 unlimited 修改为你所需文件的大小,注意单位为KB。

3. 永久打开核心转储

若想永久打开核心转储功能,则使用命令:

sudo vi /etc/security/limits.conf

修改配置文件(我这里是使用vi编辑器修改,你可以换成自己熟悉的编辑器,但建议修改配置文件还是采用vi较好,因为它是所有Unix/Linux系统标配的编辑器,并且简单的操作并不困难),增加如下所示的一行内容:

#Each line describes a limit for a user in the form:
#
#<domain>   <type>   <item>   <value>
    *          soft     core   unlimited

4. 配置核心转储文件名是否添加PID

默认的核心转储文件名称为 core。通过修改 /proc/sys/kernel/core_uses_pid 文件可以让生成的core 文件名是否自动加上 pid 号。使用命令:

sudo vi /proc/sys/kernel/core_uses_pid

/proc/sys/kernel/core_uses_pid 文件里的“0”修改为“1”,然后保存退出,这样生成的 core 文件名将会变成 core.pid,其中 pid 表示该进程的 PID

说明:使用vim编辑器修改/proc/sys/kernel目录下的文件,可能会出现如下错误,导致无法保存:

"/proc/sys/kernel/core_uses_pid"
WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?y
"/proc/sys/kernel/core_uses_pid" E667: Fsync failed
Press ENTER or type command to continue

解决办法如下:
不使用Vim编辑,直接通过命令行写入:

echo "1" | sudo dd 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值