【调试工具】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 小时前
Linux 简单日志程序
linux·运维·算法
huoxingwen8 小时前
Ubuntu 22.04 上 VMware Workstation 点击虚拟机窗口就消失的解决历程
linux·运维·ubuntu
姚青&8 小时前
Linux 常用命令之基本命令
linux·运维·服务器
一路往蓝-Anbo8 小时前
【第05期】数据的微观世界 (五) —— 浮点数 vs 定点数:MCU的数学课
linux·stm32·单片机·嵌入式硬件·物联网
G_H_S_3_8 小时前
【网络运维】企业级监控平台Zabbix:部署与实践指南
linux·运维·网络·zabbix
小周学学学8 小时前
Vcenter Auto Deploy安装与使用
linux·运维·服务器
微爱帮监所写信寄信9 小时前
微爱帮监狱写信寄信工具服务器【Linux篇章】再续:TCP协议——用技术隐喻重构网络世界的底层逻辑
linux·服务器·开发语言·网络·网络协议·小程序·监狱寄信
VekiSon9 小时前
Linux网络编程——IO多路复用
linux·运维·网络
旖旎夜光9 小时前
Linux(3)(上)
linux·学习
zhuzewennamoamtf10 小时前
Linux Regmap API寄存器映射抽象化
linux·运维·服务器