在写 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 文件呢?
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

本文介绍如何通过coredump文件定位并解决Linux程序中的段错误问题,详细解释了coredump文件的作用及生成方法,并列举了可能导致core文件产生的信号。
2万+

被折叠的 条评论
为什么被折叠?



