严正声明:本文系作者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

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

被折叠的 条评论
为什么被折叠?



