什么是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
浙公网安备 33010602011771号