Google Breakpad 捕获程序崩溃报告代码简解

 

Google Breakpad 捕获程序崩溃报告代码简解

标签: BreakpadGoogle捕获崩溃报告dmp生成dmp文件
  389人阅读  评论(0)  收藏  举报
  分类:

目录(?)[+]

一、简述

在上一篇 Qt 使用 Google Breakpad 捕获程序崩溃报告(dump文件) 中,我们用实例来演示了如何使用Google Breakpad 来捕获程序崩溃报告,主要引用三个lib文件以及一些头文件。实际写的代码很简单,下面简单介绍一下捕捉程序异常对象。

二、代码简解

#include "breakpadtest.h"
#include <QtWidgets/QApplication>
#include "client/windows/handler/exception_handler.h"
#include <QDebug>

// 程序崩溃回调函数;
bool callback(const wchar_t *dump_path, const wchar_t *id,
    void *context, EXCEPTION_POINTERS *exinfo,
    MDRawAssertionInfo *assertion,
    bool succeeded)
{
    if (succeeded) 
    {
        qDebug() << "Create dump file success";
    }
    else
    {
        qDebug() << "Create dump file failed";
    }
    return succeeded;
}

int main(int argc, char *argv[])
{
    // 创建捕捉程序异常对象;
    google_breakpad::ExceptionHandler eh(
        L".", NULL, callback, NULL,
        google_breakpad::ExceptionHandler::HANDLER_ALL);

    QApplication a(argc, argv);
    BreakPadTest w;
    w.show();
    return a.exec();
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

我们使用google_breakpad::ExceptionHandler 创建了一个捕捉异常的对象,我们先看一下构造方法。在exception_handler.h 文件中。

这里写图片描述

const wstring& dump_path : 第一个参数指定了dmp文件生成的路径,在给定值时请确保路径存在,如果不存在,不会生成dmp文件。


FilterCallback filter : 程序崩溃后的回调函数,在生成dmp文件之前调用,并且FilterCallback 的返回值决定了Breakpad是否会生成dmp文件,返回true则继续处理异常,并写入dump文件,返回false,则停止处理,并且不会写入dump文件。下面为FilterCallback 回调函数的参数形式以及介绍。

这里写图片描述


MinidumpCallback callback : 程序崩溃后的回调函数,在生成dmp文件之后调用。其返回值表示当前是否已处理异常。返回true,说明当前已经处理完异常,不会再让其他处理者再对此异常进行处理、返回false,说明异常未处理,并且允许其他处理者进行处理。下面为MinidumpCallback 回调函数的参数形式以及介绍。

这里写图片描述


void* callback_context : 设备上下文,作为回调函数的参数,在回调函数中使用。


int handler_types : 捕捉异常的类型,通过HandlerType 来区分 当前处理程序应该捕获何种类型的异常。

注释中讲到了 HANDLER_NONE 不会捕获任何异常,但是如果手动调用 WriteMinidump 处理程序仍然会被触发,而HANDLER_ALL会捕捉所以的异常。

这里写图片描述


其实我们看到 ExceptionHandler 类还有其他两个构造函数,如下图,而这两个构造函数与上面相比多了三个参数,而区别是上面那个是进程内生成dmp文件,而下面两个构造函数用于进程外生成dmp文件。 
这里写图片描述

这里写图片描述

关于代码我们就简单介绍到这里,想要深入了解的小伙伴可以尝试查看Google Breakpad的源码。相关资料已经上传,小伙伴们可以通过下方链接下载查看。


相关文件下载

google_breakpad 源码

Google Breakpad 使用实例

GoogleBreakpad捕获崩溃文件需要的文件,包括lib库文件及头文件

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 块中调用 BreakpadWriteMinidump 函数 eh.WriteMinidump(); } return 0; } ``` 在上面的代码中,`DumpCallback` 函数用于将崩溃信息写入文件,`main` 函数中创建了一个 Breakpad 异常处理器,并在 `try-catch` 语句块中捕获异常。当程序遇到异常时,会跳转到 `catch` 块中,调用 Breakpad 的 `WriteMinidump` 函数将崩溃信息写入文件。 需要注意的是,使用 Breakpad 捕获崩溃信息时,需要在编译时链接 Breakpad 库,并将 Breakpad 的头文件包含在程序中。同时,需要在程序中注册异常处理器,以便于在发生异常时能够捕获崩溃信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值