内存相关调试(2)core文件调试

  1. 修改core文件大小为无限大
    ulimit -c unlimited
    检查 ulimit -c 输出 unlimited

  2. 控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
    sudo sh -c "echo 1 > /proc/sys/kernel/core_uses_pid"

  3. 控制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 添加命令名
  1. 生成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

  1. 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值