恕俺孤陋寡闻,俺以前还不知道怎么在Linux的C++程序里把coredump保存在指定的文件里。
据说在shell里,用"ulimit -c"可以设置coredump文件大小,大部分的Linux发行版中默认是不开启的(我用的ubuntu就没有开启)。如果你有兴趣,可以去探索一下。
本文只讨论在程序里直接把coredump保存到指定的文件名里 (前些天google到一个叫google-coredumper的库可以干这个事,挺好的,所以这里推荐一下)。
注:安装步骤
在这里下载http://code.google.com/p/google-coredumper/
先安装libcoredumper1_1.2.1-1_i386.deb
再安装libcoredumper-dev_1.2.1-1_i386.deb
ok了
来吧,开始举例了。
1. 假设,你的程序叫A.cpp
====================== A.cpp V1 在下面 ==========================
#include <iostream>
using namespace std;
int main()
{
do_something();
return 0;
}
====================== A.cpp V1 在上面 ============================
2. 又假设你想在扑捉出错的signal,则A.cpp变成下面的样子了。
====================== A.cpp V2 在下面 ==========================
#include <iostream>
#include <setjmp.h>
#include <signal.h>
using namespace std;
namespace
{
::jmp_buf env;
void sig_func(int signo)
{
cerr << "segment falut: caught signal: " << signo << "\n";
::longjmp(env, 1);
}
}
int main()
{
::signal(SIGSEGV, &sig_func);
::signal(SIGTERM, &sig_func);
::signal(SIGINT, &sig_func);
if (::setjmp(env) == 0) {
do_something();
} else {
cerr << " ~>_<~ \n";
}
return 0;
}
====================== A.cpp V2 在上面 ============================
3. 现在,在A.cpp V2的基础上,把coredump输出到"coredump.txt",注意,编译时,要用这个命令 "
g++ A.cpp -lcoredumper -o A
"
====================== A.cpp V3 在下面 ==========================
#include <iostream>
#include <setjmp.h>
#include <signal.h>
#include <google/coredumper.h>
// g++ A.cpp -lcoredumper -o A
using namespace std;
namespace
{
::jmp_buf env;
void sig_func(int signo)
{
cerr << "segment falut: caught signal: " << signo << "\n";
if( WriteCoreDump("coredump.txt") ==0 ) {
cout << "success: WriteCoreDump to coredump.txt\n";
} else {
cout << "failure: WriteCoreDump to coredump.txt\n";
}
::longjmp(env, 1);
}
}
int main()
{
::signal(SIGSEGV, &sig_func);
::signal(SIGTERM, &sig_func);
::signal(SIGINT, &sig_func);
if (::setjmp(env) == 0) {
do_something();
} else {
cerr << " ~>_<~ \n";
}
return 0;
}
====================== A.cpp V3 在上面 ============================
4. 有了coredump.txt之后,能干什么?
举个最简单的例子吧,可以用gdb把出错的call stack打印出来。
> gdb ./A coredump.txt <-- 载入
(gdb) bt <-- 得到call stack