推荐一下google-coredumper [转]

恕俺孤陋寡闻,俺以前还不知道怎么在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

关于xmsg

技术面前人人平等.同时技术也不分高低贵贱.正所谓学无大小,达者为尊.
此条目发表在Skill分类目录,贴了标签。将固定链接加入收藏夹。