利用Google Breakpad分析C++应用崩溃原因

Google Breakpad的介绍略过,这里只介绍Google Breakpad的基本使用。

下载地址:https://github.com/google/breakpad.giticon-default.png?t=N7T8https://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位置后,就可以去修改你的程序了。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Breakpad 是一个开源的崩溃报告库,它可以捕获应用程序的崩溃信息,生成崩溃报告,以便于开发人员进行分析和修复。 要捕获 C++ 标准库的崩溃,需要使用 Breakpad 提供的异常处理机制。在 C++ 中,异常是通过 `try-catch` 语句块来处理的,当程序遇到异常时,会跳转到相应的 `catch` 块中进行处理。Breakpad 利用这个机制,在 `catch` 块中捕获异常并生成崩溃报告。 具体的实现步骤如下: 1. 在应用程序中使用 Breakpad 库,将崩溃信息保存到指定的文件中。 2. 在程序中使用 `try-catch` 语句块捕获异常。 3. 在 `catch` 块中,调用 Breakpad 提供的函数,将崩溃信息写入文件。 以下是一个使用 Breakpad 捕获 C++ 标准库崩溃的示例代码: ```c++ #include <stdexcept> #include "client/linux/handler/exception_handler.h" bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded) { // 将崩溃信息写入文件 return succeeded; } int main() { // 创建 Breakpad 异常处理器 google_breakpad::MinidumpDescriptor descriptor("."); google_breakpad::ExceptionHandler eh(descriptor, NULL, DumpCallback, NULL, true, -1); try { // 在这里写下可能会抛出异常的代码 throw std::runtime_error("C++ 标准库崩溃"); } catch (...) { // 在 catch 块中调用 Breakpad 的 WriteMinidump 函数 eh.WriteMinidump(); } return 0; } ``` 在上面的代码中,`DumpCallback` 函数用于将崩溃信息写入文件,`main` 函数中创建了一个 Breakpad 异常处理器,并在 `try-catch` 语句块中捕获异常。当程序遇到异常时,会跳转到 `catch` 块中,调用 Breakpad 的 `WriteMinidump` 函数将崩溃信息写入文件。 需要注意的是,使用 Breakpad 捕获崩溃信息时,需要在编译时链接 Breakpad 库,并将 Breakpad 的头文件包含在程序中。同时,需要在程序中注册异常处理器,以便于在发生异常时能够捕获崩溃信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值