【调试工具】coredump 使用示例

简介

coredump是指当程序出错而异常中断时,OS会把程序工作的当前状态存储成一个coredunmp文件,一般用于进程崩溃的场景。


一、开启 coredump

c 复制代码
1. 检查系统 coredump 是否开启
    # ulimit -c
        	---> 返回 0,则未启用。
2. 临时开启    
   # ulimit -c 1024 // 设置成 1024 byte    
   或者
   # ulimit -c unlimited  // 设置成无限大
3. 永久开启
方式一:
   a. 打开 /etc/profile 文件,增加如下内容并使其生效    
   # ulimit -S -c unlimited > /dev/null 2>&1    
   注意:如果该文件有 ulimit -S -c 0 > /dev/null 2>&1 一行,需要先将该行注释掉。
   b. 设置完成后通过执行 source /etc/profile 生效。    
方式二:
   a. 打开 /etc/security/limits.conf 文件,找到【* soft core 0】行,将其修改为如下内容:
    这个方法可以针对指定用户或用户组打开core dump,如设置成【* soft core 10485760】,即core dump文件大小是10G 。

二、编写测试用例

代码如下(示例):

c 复制代码
filename: test.c
#include <stdio.h>
int square(int a, int b)
{    
  int ret;    
  int *p = NULL; //此处是会导致coredump处    
  *p = 666;    
  return ret;
}

int doCalc(int num1, int num2)
{    
  int ret = square(num1, num2);   
   
  return ret;
}

int main()
{    
  int param1 = 1;    
  int param2 = 2;    
  int result = doCalc(param1, param2);  
  printf( "result is %d\n", result);
}

三、编译并确认

代码如下(示例):

c 复制代码
# gcc -c -g test.c -o main // 编译时加入debug调试信息

如何确认已经开启了debug,执行以下命令:

c 复制代码
objdump -h main | grep debug //会打印出debug相关字符

四、配置并生成core文件

core 文件生成的位置默认是可执行文件所在的位置,名称默认为core,其位置和名称是可以设置的,我的设置为:

c 复制代码
# mkdir /home/corefile
# echo "/home/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern // 设置core文件的生成路径

core 文件会生成在 /home/corefile/ 目录下。 顺便记录下% 后字母表示的意义。

c 复制代码
%% 单个%字符
%p 所dump进程的进程ID
%u 所dump进程的实际用户ID
%g 所dump进程的实际组ID
%s 导致本次core dump的信号
%t core dump的时间 (由1970年1月1日计起的秒数)
%h 主机名
%e 程序文件名

执行 main ,生成 core 文件。

五、GDB在线调试

c 复制代码
# cp main /home/corefile/  // 需要将可执行文件和core文件放在一个目录下
# gdb main core-main-5588_1636892983    
  --->     	
  ...    	
    Program terminated with signal SIGSEGV,       Segmentation fault.    	
    #0  0x000000000040053c in square (a=1, b=2) at test.c:7    	
    7               *p = 666;  // 可见在test.c中的第7行,出现了问题。
# (gdb) backtrace // 输入backtrace    
   --->    	 
    #0  0x000000000040053c in square (a=1, b=2) at test.c:7   // 可见在test.c中的第7行,出现了问题。   	 
    #1  0x0000000000400564 in doCalc (num1=1, num2=2) at test.c:14    	 
    #2  0x0000000000400591 in main () at test.c:22

可见,进程退出时,执行的最后一个函数是 square 函数,并且在第 7 行出现了问题。

相关推荐
小糖学代码7 小时前
LLM系列:1.python入门:3.布尔型对象
linux·开发语言·python
shizhan_cloud7 小时前
Shell 函数的知识与实践
linux·运维
Deng8723473487 小时前
代码语法检查工具
linux·服务器·windows
霍夫曼9 小时前
UTC时间与本地时间转换问题
java·linux·服务器·前端·javascript
月熊10 小时前
在root无法通过登录界面进去时,通过原本的普通用户qiujian如何把它修改为自己指定的用户名
linux·运维·服务器
大江东去浪淘尽千古风流人物11 小时前
【DSP】向量化操作的误差来源分析及其经典解决方案
linux·运维·人工智能·算法·vr·dsp开发·mr
赖small强11 小时前
【Linux驱动开发】NOR Flash 技术原理与 Linux 系统应用全解析
linux·驱动开发·nor flash·芯片内执行
IT运维爱好者13 小时前
【Linux】LVM理论介绍、实战操作
linux·磁盘扩容·lvm
LEEE@FPGA13 小时前
ZYNQ MPSOC linux hello world
linux·运维·服务器
郝学胜-神的一滴13 小时前
Linux定时器编程:深入理解setitimer函数
linux·服务器·开发语言·c++·程序人生