core dump文件及应用

本文介绍如何通过coredump文件定位并解决Linux程序中的段错误问题,详细解释了coredump文件的作用及生成方法,并列举了可能导致core文件产生的信号。
在写 Linux 程序时,经常会遇到“段错误”(segmentation fault) 这样的问题。如果程序比较大,那么如果用 gdb 调试可能显得比较吃力。这时可以用 core dump 文件来进行分析。


那什么是 core dump 文件呢?
core dump 文件就是在程序发生错误时,由操作系统把程序错误时的相应内容 dump 出来,然后存储在一个文件中,这个文件就是当时的内存映像,也就是 core dump 文件。


造成“段错误”产生的原因经常是因为指针的乱用。比如下面这个测试程序:


#include <stdio.h>
int main()
{
char *p = "hello world";
*(p+1) = 'X';
printf ("%s\n", p);
return (0);
}


在上面的程序中,hello world 字符串在编译时就会被分配到 .rodata 区域,相当于属于 const 类型,是不能进行修改的。然后在程序里,却用指针进行了更改,那么这个程序在运行起来,就会产生段错误:
Segmentation fault (core dumped)
一般的,系统默认是不会产生core dump文件的,而上面,在括号里提示 core dumped ,则表示已经产生了 core dumped 文件。使能产生 core dumped 文件的方法是:
ulimit -S -c unlimited > /dev/null 2>&1
使用 gdb 与 core dumped 来定位错误
当运行程序出错后,会产生 core dumped 文件,此时可用 gdb 和 core dumped 配合来定位程序的错误,使用方法是:
gdb 可执行文件 core_dumped文件
可以在与程序同一个目录下观察到生成的 core dumped 文件:core.22421。这里 core.22421中的 22421是当时程序运行的 pid 值。 
能够产生 core 文件的信号
当程序接收到以下信号时会产生 core 文件:
SIGABRT :异常终止(abort)时发出的信号
说明:
调用abort函数时产生此信号。进程异常终止。
SIGBUS :硬件发生故障时发出的信号
说明:
指示一个实现定义的硬件故障。
SIGFPE :算术异常时发出的信号
说明:
此信号表示一个算术运算异常,例如除以0,浮点溢出等。
SIGILL :遇到非法硬件指令时发出的信号
说明:
此信号指示进程已执行一条非法硬件指令。4.3BSD由abort函数产生此信号。现在 abort() 函数用来生成 SIGABRT 信号。
SIGIOT :硬件故障时发出的信号
说明:
IOT这个名字来自于PDP-11对于 输入/输出 TRAP(input/output TRAP)指令的缩写。系统V的早期版本,由abort函数产生此信号。SIGABRT现在被用于此。
SIGQUIT :终端退出时发出的信号
说明:
当用户在终端上按退出键(一般采用Ctrl-\)时,产生此信号,并送至前台进程组中的所有进程。此信号不仅终止前台进程组(如SIGINT所做的那样),同时产生一个core文件。
SIGSEGV :无效存储访问发出的信号
说明:
进程进行了一次无效的存储访问。字SEGV表示“段违例(segmentation violation)”。
SIGSYS :无效的系统调用时发出的信号
说明:
进行了一个无效的系统调用。由于某种未知原因,进程执行了一条系统调用指令,但其指示系统调用类型的参数却是无效的。
SIGTRAP :硬件故障时发出的信号
说明:
此信号名来自于 PDP-11 的TRAP指令。
SIGXCPU :超过CPU限制(setrlimit)时发出的信号
说明:
SVR4 和 4.3+BSD 支持资源限制的概念。如果进程超过了其软 CPU 时间限制,则产生此信号。XCPU 是 "exceeded CPU time“ 的缩写。
SIGXFSZ :超过文件长度限制(setrlimit)时发出的信号
说明:
如果进程超过了其软文件长度限制时发出此信号。


更多:http://www.groad.net/bbs/read.php?tid-1472.html
### 如何生成和分析 Core Dump 文件 #### 配置 `ulimit` 以启用 Core Dump 文件生成 在 Linux 系统中,默认情况下可能未启用核心转储功能。为了允许生成 Core Dump 文件,可以通过调整 `ulimit` 参数实现。具体操作如下: 运行以下命令以查看当前系统的 Core Dump 大小限制: ```bash ulimit -c ``` 如果返回值为 `0`,则表示禁用了 Core Dump 功能。要启用该功能,需设置其大小无限制(或其他适当值)。例如: ```bash ulimit -c unlimited ``` 这一步骤确保当程序崩溃时能够生成完整的 Core Dump 文件[^1]。 #### 设置 Core Pattern 定义文件路径 Core Dump存储位置及其命名方式由 `/proc/sys/kernel/core_pattern` 控制。编辑此配置项可以让系统自定义 Core Dump 文件的位置与名称格式。常见的占位符包括 `%e` 表示可执行文件名、`%p` 进程 ID 和其他选项如时间戳 `%t` 等[^4]。 修改方法如下所示: ```bash echo "/tmp/core-%e.%p" | sudo tee /proc/sys/kernel/core_pattern ``` 上述例子会将所有的 Core Dumps 存放在临时目录下,并附加应用程序的名字及 PID 来区分不同实例产生的数据[^3]。 #### 使用 GDB 调试 Core Dump 文件 一旦捕获到了一个有效的 Core Dump 文件之后,就可以利用 GNU Debugger (GDB) 对其展开深入研究了。基本流程涉及加载目标二进制镜像连同对应的 Core 数据一起载入调试器环境之中。 启动 GDB 并指定需要审查的目标应用以及关联的核心记录作为输入参数之一即可开始工作流: ```bash gdb ./application_binary_path core_dump_file_name ``` 进入交互界面后尝试一些基础指令来探索现场状态,比如打印栈回溯信息(`bt`)或者检查特定变量的内容等等[^2]: ```plaintext (gdb) bt full # 显示整个调用堆栈详情 (gdb) frame N # 切换至第N层帧上下文中 (gdb) print var # 输出某个局部或全局量var的具体数值表现形式 ``` 通过以上步骤便能有效地定位问题所在并采取相应措施加以修正。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值