首先介绍一些概念:
核心文件(core file),也称磁芯倾印(core dump)[1],是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写入一个磁盘文件。这种信息往往用于调试。
1.如何生成dump文件
1 )如何生成 coredump 文件 ?
登陆 LINUX 服务器,任意位置键入
echo "ulimit -c 1024" >> /etc/profile
退出 LINUX 重新登陆 LINUX
键入 ulimit -c
如果显示 1024 那么说明 coredump 已经被开启。
1024 限制产生的 core 文件的大小不能超过 1024kb,可以使用参数unlimited,取消该限制
ulimit -c unlimited
2 ) . core 文件的简单介绍
在一个程序崩溃时,它一般会在指定目录下生成一个 core 文件。 core 文件仅仅是一个内存映象 ( 同时加上调试信息 ) ,主要是用来调试的。
3 ) . 开启或关闭 core 文件的生成
用以下命令来阻止系统生成 core 文件 :
ulimit -c 0
下面的命令可以检查生成 core 文件的选项是否打开 :
ulimit -a
该命令将显示所有的用户定制,其中选项 -a 代表“ all ”。
也可以修改系统文件来调整 core 选项
在 /etc/profile 通常会有这样一句话来禁止产生 core 文件,通常这种设置是合理的 :
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
但是在开发过程中有时为了调试问题,还是需要在特定的用户环境下打开 core 文件产生的设置。
在用户的 ~/.bash_profile 里加上 ulimit -c unlimited 来让特定的用户可以产生 core 文件。
如果 ulimit -c 0 则也是禁止产生 core 文件,而 ulimit -c 1024 则限制产生的 core 文件的大小不能超过 1024kb
2.设置dump生成路径
proc/sys/kernel/core_pattern 可以设置格式化的 core 文件保存位置或文件名 ,比如原来文件内容是 core-%e
可以这样修改 :
echo "/corefile/core-%e-%p-%t" > core_pattern
将会控制所产生的 core 文件会存放到 /corefile 目录下,产生的文件名为 core- 命令名 -pid- 时间戳
以下是参数列表 :
%p - insert pid into filename 添加 pid
%u - insert current uid into filename 添加当前 uid
%g - insert current gid into filename 添加当前 gid
%s - insert signal that caused the coredump into the filename 添加导致产生 core 的信号
%t - insert UNIX time that the coredump occurred into filename 添加 core 文件生成时的 unix 时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名
对于ubuntu centos新的版本系统需要用sysctl命令修改:
其中"./core..." 表示生成在exe文件的当前路径
sudo sysctl -w kernel.core_pattern=./core-%e.%p.%h.%t
3. c/c++代码设置ulimit 方法
#include <sys/resource.h>
#define CORE_FILE_LIMIT (5 * 1024 * 1024) /* 5 MB should be enough */
int reset_limit()
{
rlimit r1,r2;
rlimit tmp={CORE_FILE_LIMIT - 1,CORE_FILE_LIMIT};
getrlimit(RLIMIT_CORE,&r1);
setrlimit(RLIMIT_CORE,&tmp);
getrlimit(RLIMIT_CORE,&r2);
return 0;
}
4.gdb 调试core dump文件
gdb调试常用的命令如下
gdb 程序名(包含路径) core*(core文件名和路径)
关于gdb调试core文件总是一堆问号??的问题
问题描写叙述:已经在编译选项中增加了-g,可是查看core文件时。还是一堆问号,使用的命令为:gdb -c core
原因:gdb 没有正确获取到调试信息
解决方式:因为gdb的一些命令在有些系统下支持不是非常好,比如gdb -c core等 。所以尝试用例如以下两种执行命令行方法,第一种虽然麻烦但可能更靠谱些:
1) gdb exe
(gdb) core-file core
2) gdb -c core