Google Breakpad的介绍略过,这里只介绍Google Breakpad的基本使用。
下载地址:https://github.com/google/breakpad.githttps://github.com/google/breakpad.git
一、下载并编译breakpad
由于Breakpad依赖LSS,所以在编译前需要解决依赖问题。如果缺少这个包,在编译过程中,可能会出现如下错误:
# mkdir test_googlebreakpad
# cd test_googlebreakpad
# git clone https://github.com/google/breakpad.git
# cd breakpad
# git clone https://chromium.googlesource.com/linux-syscall-support src/third_party/lss
# ./configure && make -j4
# cd ../
# touch test_breakpad.cpp
# touch generate_stack_trace.sh
# vim test_breakpad.cpp
二、编写测试程序及脚本文件
测试程序,test_breakpad.cpp内容如下:
#include <iostream>
#include "client/linux/handler/exception_handler.h"
static bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void *ctx, bool successed)
{
const char *filename = "./tmp/dmpfile.txt";
FILE* fp = fopen(filename, "w");
if (fp)
{
if (fwrite(descriptor.path(), strlen(descriptor.path()), 1, fp) <= 0)
{
printf("write descriptor.path() to dmpfile.txt error.\n");
return false;
}
fclose(fp);
}
else
{
printf("%s\n", descriptor.path());
}
return successed;
}
void TestCrash()
{
char *ptr = nullptr;
*ptr = 10;
}
int main(int argc, char *argv[])
{
google_breakpad::MinidumpDescriptor descriptor("./tmp");
google_breakpad::ExceptionHandler eh(descriptor, NULL, DumpCallback, NULL, true, -1);
std::cout << "Start crash test." << std::endl;
TestCrash();
std::cout << "Quit main app." << std::endl;
return 0;
}
generate_stack_trace.sh脚本内容如下:
#!/bin/sh
rm -rf ./tmp ./symbols ./debug.txt
mkdir ./tmp
g++ -g -I ./breakpad/src/ -o test_breakpad test_breakpad.cpp ./breakpad/src/client/linux/libbreakpad_client.a -lpthread
./test_breakpad
./breakpad/src/tools/linux/dump_syms/dump_syms ./test_breakpad > test_breakpad.sym
head -n1 test_breakpad.sym > dirinfo.txt
dir=$(cat ./dirinfo.txt)
dir=${dir#* }
dir=${dir#* }
dir=${dir#* }
dir=${dir% *}
text=$(cat ./tmp/dmpfile.txt)
text=${text##*/}
mkdir -p ./symbols/test_breakpad/${dir}/
mv ./test_breakpad.sym ./symbols/test_breakpad/${dir}/
./breakpad/src/processor/minidump_stackwalk ./tmp/${text} ./symbols/ >> debug.txt
rm -rf ./dirinfo.txt
rm -rf ./tmp ./symbols
三、执行脚本文件
# chmod 777 generate_stack_trace.sh
# ./generate_stack_trace.sh
最终会得到debug.txt文件,发生崩溃时程序的堆栈信息保存在里面。可以打开debug.txt文件,查找程序在哪个位置上发生崩溃。
定位到crash位置后,就可以去修改你的程序了。