core文件的生成和路径设置
在程序崩溃时,内核会生成一个core文件,即程序最后崩溃时的内存映像,和程序调试信息。之后可以通过gdb,打开core文件察看程序崩溃时的堆栈信息,可以找出程序出错的代码所在文件和函数。
1.core文件的生成开关和大小限制:
1)使用 ulimit -a 命令,可以察看core文件的生成开关和大小限制所有信息(输出内容中 core file size,若为0表示不生成core文件)
2)使用 ulimit -c 命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。
3)使用 ulimit -c filesize 命令,可以限制core文件的大小(filesize的单位为kbyte)。
如:ulimit -c 2048.
注意:若用 ulimit -c unlimited (本地调试推荐用该命令),则表示core文件的大小不受限制。
2.core文件的名称和生成路径
若未设置过core文件生成路径和名称,默认生成在可执行文件运行命令的同一路径下,命名为core。新的core文件生成将覆盖原来的core文件。
通过编辑 proc/sys/kernel/core_pattern,设置文件路径和文件名,可用如下命令:
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 添加命令名
示例一:在指定路径下生成core文件(ubuntu14.04)
- 在/etc/sysctl.conf文件结尾加上
kernel.core_pattern=/路径/core-%e-%p-%t
然后执行生效:
sudo sysctl -p /etc/sysctl.conf
- 查看是否生效
- 在设置生成core文件的路径下为core文件指定空间:
ulimit -c unlimited
示例二:在指定路径下生成core文件(Xshell)
- 在/proc/sys/kernel/core_pattern文件中写入
echo "/生成core文件的路径/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
如:
echo "/home/General/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
- 在生成core文件的路径下执行
ulimit -c 数字 //表示core文件最大占“数字”字节的空间
或
ulimit -c unlimited //core文件大小无限制
- 发生段错误后的效果
注意:如果按照此方法无法生成core文件,可能是内核不支持
可生成段错误的代码
#include <stdio.h>
int func( int *p)
{
*p = 0;
}
int main()
{
func(NULL);
return 0;
}