core文件是linux系统下一种记录软件异常的机制,在进程运行崩溃时,系统会将coredump信息写入core文件。
这样就方便我们定位软件问题。
1. 设置core文件大小
使用ulimit -c
可以查看当前core文件的大小
默认情况下,core文件的大小为0,系统不会为崩溃进程写core文件;
使用命令ulimit -c ulimited
将core文件的大小设置为无限。
ulimit -c filesize
//filesize 的单位为kb
//ulimit -c 100 就是单个core文件最大100k,多余的就不写了
注意:
这种配置办法只是暂时的,只在当前shell有效,对新的shell就不生效了,更不要说重启计算机之后了。
永久修改办法:
终端输入:
sudo gedit /etc/security/limits.conf
找到下图画圈的那一行,去掉注释,把<value>改成unlimited
,然后重启计算机即可。
2. 设置core文件路径和名称
这个没啥好说的,就是设置一下core文件的生成路径和名字格式
修改/proc/sys/kernel/core_pattern
文件
sysctl -w kernel.core_pattern=/corefile/core.%e.%p.%t
可以自己设置core文件的命名格式
- %p ---------进程号
- %e ---------导致core生成的命令名
- %s ---------导致core文件产生的信号,比如SIGSEGV
- %e ---------可执行文件名(无路径前缀)
- %E ---------可执行文件的路径名
- %t ----------转储时间,表示为自1970年1月1日00:00:00 +0000(UTC)以来的秒数
- %H --------主机名
这种设置办法也是暂时的,计算机重启之后就恢复默认了;我尝试直接修改/proc/sys/kernel/core_pattern
文件,但是说我莫得权限
那我干脆把命令放在/etc/profile
里好了
3. 使用core文件
测试程序
void fun(){
int *p = nullptr;
*p = 3;
}
int main()
{
fun();
}
编译debug版本,终端运行,出错,找到core文件,拷过来
gdb -q ./test3 ./core.test3.6972
这里有点不懂的地方,我用qt编译出来运行调试core文件,会明确指出*p = 3
这儿出错了;
但是用gcc编译,只会告诉在哪个函数,可能是我gcc和gdb用的不熟练…