-
修改core文件大小为无限大
ulimit -c unlimited
检查ulimit -c
输出unlimited
-
控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
sudo sh -c "echo 1 > /proc/sys/kernel/core_uses_pid"
-
控制core文件保存位置和文件名格式
将core文件统一生成到当前目录下
sudo sh -c "echo "./core-%e-%p-%t" > /proc/sys/kernel/core_pattern"
%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文件
测试代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void mem_leak1()
{
char *p = malloc(1);
}
static void mem_leak2()
{
FILE *p = fopen("test.txt", "w+");
}
static void mem_overrun1()
{
char *p = malloc(1);
*(short*)p = 2;
free(p);
}
static void mem_overrun2()
{
char arr[5];
strcpy(arr, "hello");
}
static void mem_double_free()
{
char *p = malloc(1);
free(p);
free(p);
}
static void mem_free_wild_pointer()
{
char *p;
free(p);
}
int main(int argc, char const *argv[])
{
mem_leak1();
mem_leak2();
mem_overrun1();
mem_overrun2();
mem_double_free();
mem_free_wild_pointer();
return 0;
}
编译:
gcc -g test.c
- gdb 调试core文件
gdb a.out
添加core文件
(gdb) core-file core-a.out-2423-1632232792
[New LWP 2423]
Core was generated by `./a.out'.
Program terminated with signal SIGABRT, Aborted.
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
查看堆栈,定位问题发生所在位置
(gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1 0x00007ff605ec8859 in __GI_abort () at abort.c:79
#2 0x00007ff605f333ee in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7ff60605d285 "%s\n")
at ../sysdeps/posix/libc_fatal.c:155
#3 0x00007ff605f3b47c in malloc_printerr (str=str@entry=0x7ff60605f5d0 "free(): double free detected in tcache 2")
at malloc.c:5347
#4 0x00007ff605f3d0ed in _int_free (av=0x7ff60608eb80 <main_arena>, p=0x561dceb21490, have_lock=0) at malloc.c:4201
#5 0x0000561dccea8292 in mem_double_free () at valgrind_test.c:32 问题发生处
#6 0x0000561dccea82f5 in main (argc=1, argv=0x7ffe46acccf8) at valgrind_test.c:47