Core Dump为啥?碰到内存错误,程序down掉的时候,偶尔会碰到,但这是啥意思捏?
Core的意思是内存, Dump的意思是扔出来, 堆出来.
开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号(或者其他形式的core dump)的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump.
例子:
随便写一个崩溃的程序,如下:不妨称之为core.cpp
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
char * pNull = NULL;
cout << " pNull is " << *pNull << endl;
return 0;
}
g++ -g core.cpp -o core_test
参数-g 一定要加,否则gdb没有调试信息。
生成可执行文件core_test之后,运行の
./core_test
这里可以看到出错信息已经core dumped了。
那么该生成的文件被dumped到哪去了呢?查看/proc/sys/kernel/ vim core_pattern 可以查看文件的存放位置。
这里是:/data/coredump/core_%e_%t 即:core+可执行文件名+当前时间转化成秒(自1970年1月1日0时0分0秒)
但是有些情况下,你会发现,无论你写的程序错误多么明显,最多就提示,Segmentation fault,就是没有core dumped 这是什么原因呢?
查看一下,ulimit -a
原来这里core files size 被设置成0了,难怪。呵呵。
我们这里为防止,core file 文件过大,如果ulimit -c size (size设置的过小,会导致文件被截断,这样就无法调试了)
所以,这里我们设置文件大小为unlimited
ulimit -c unlimited
好了,继续运行,./core_test
这次会成功生成core dump文件了。core_core_test_1277898297
这里的1277898297 可以利用shell脚本转化成当前时间:date -d"1970-01-01 UTC $1 seconds" +"%Y-%m-%d %H:%M:%S"
该脚本文件名为idate.sh 则运行: ./idate.sh 1277898297 生成:2010-06-30 19:44:57 跑题了。。。
得到该文件之后,cp到可执行文件的目录下:运行:
gdb core_test core_core_test_1277898297
The End .....................