什么是coredump?在linux的应用程序经常运行时出现捕获到什么信号,然后程序退出等错误,linux系统会将此时的内存内容写入到一个文件,供应用程序开发人员定位错误。什么事情会触发产生coredump呢,在linux系统里,源就是信号。实测表明,以下几类信号可以产生coredump文件:
1. SIGQUIT
2. SIGILL 非法值等,如CPU不支持浮点运算,却是用了浮点操作
3. SIGABRT/SIGIOT 退出函数,
4.SIGFPE
5.SIGSEGV 段错误,非法越界访问
6.SIGBUS 非法错误,如数据对齐问题
7. SIGSYS
8.SIGTRAP
9. SIGXCPU 进程超过最大运行时间
10.SIGXFSZ 进程里操作的文件尺寸过大。
---如何产生coredump文件
首先需要允许系统产生coredump文件,是用ulimit –c ulimited,表示coredump文件为无限大,默认系统是不产生coredump文件的,如下
sdoning@ubuntu:~$ ulimit -c
0
sdoning@ubuntu:~$ ulimit -c unlimited
sdoning@ubuntu:~$ ulimit -c
unlimited
---coredump文件产生在哪儿
默认是在当前目录下(PWD)的名称为core的文件,但是用户可以更改coredump的路径以及名称,执行以下命令:
echo "/home/sdoning/corefile/core.%e.%p.%s.%t" > /proc/sys/kernel/core_pattern,若在执行时遇到问题可以参看http://www.kaixinwenda.com/article-caspiansea-7664754.html
一些有用设置:
/proc/sys/kernel/core_uses_pid可以控制产生的core文件的文件名中是否添加pid作为扩展
sudo sh –c “echo 1 > /proc/sys/fs/suid_dumpable”
sudo sh –c “echo 1 > /proc/sys/kernel/core_uses_pid”
---额外操作

在编译时需要加-g选项,使用gdb
---一个实例

#include <stdlib.h>
#include <stdio.h>
void coreFunc()
{
	char* b = NULL;
	*b = 'c';
	printf("%c",*b);
}
int main()
{
	coreFunc();
	return 0;
}

执行时出现
sdoning@ubuntu:~/practice$ ./a.out
Segmentation fault (core dumped)绿色部分代表产生了core文件,同时发现在当前目录下内容如下:
sdoning@ubuntu:~/practice$ ll core*
-rw------- 1 sdoning sdoning 200704 2013-05-25 22:46 core.4762
-rw------- 1 sdoning sdoning    144 2013-05-25 14:18 coredump.cpp
---core.4762是个什么文件?
coredump文件也是一个elf文件,但是没有所谓的段,仅仅只有头和VMAS,coredump文件都特别大,但是文件的内容本身是特别小的,是个稀疏文件,压缩之后文件将非常小。
---定位错误
定位错误主要是使用gdb的命令来定位即可,如
sdoning@ubuntu:~/practice$ gdb a.out core.4762
...
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x080483f4 in coreFunc () at coredump.cpp:6
6               *b = 'c';
(gdb) bt
#0  0x080483f4 in coreFunc () at coredump.cpp:6
#1  0x08048415 in main () at coredump.cpp:11
(gdb) bt
#0  0x080483f4 in coreFunc () at coredump.cpp:6
#1  0x08048415 in main () at coredump.cpp:11
(gdb) info reg
eax            0x0      0
ecx            0xbfaf0474       -1079049100
edx            0xbfaf0404       -1079049212
ebx            0xde6ff4 14577652
esp            0xbfaf03a0       0xbfaf03a0
ebp            0xbfaf03c8       0xbfaf03c8
esi            0x0      0
edi            0x0      0
eip            0x80483f4        0x80483f4 <coreFunc()+16>
eflags         0x10286  [ PF SF IF RF ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb)
因为该程序比较简单,所以产生错误的那一行基本就比较简单的定位了。
摘录一段如何使你的应用程序可调试性更好的建议:
Keep debug symbol, try your best to keep it
Avoid macro definition
Use const or enum for variables
Use inline for functions
Write debug functions
Keep logging

posted on 2013-05-26 07:50  答案是肯定的  阅读(2445)  评论(0)    收藏  举报