Qt 使用 Google Breakpad 捕获程序崩溃报告(dump文件)

22 篇文章 3 订阅

一、简述

在上一篇文章 Google Breakpad 在 windows下捕获程序崩溃报告中,简单介绍了Google Breakpad,同时讲解了如何如何获取Google Breakpad源码、环境的配置,以及自带demo的测试过程,今天就讲述一下如何使用Google Breakpad来帮我们自己的程序在崩溃的时候获取dump文件。下面我用Qt的程序为例,其他项目建立过程都基本类似,而且Google Breakpad跟我们用什么开发没什么多大关系,主要是了解如何去用Google Breakpad来帮助我们捕获崩溃文件。

二、如何使用Google Breakpad

**开发环境 : win8 + VS2013 **

(1)、首先我们建立一个Qt项目。

这里写图片描述

(2)、修改BreakTest工程属性。

修改exe生成目录

这里写图片描述


添加静态库文件

这里写图片描述


附加库目录,我们添加了lib库文件,但是未指定库文件目录,这里使用相对路径,防止程序在路径改变后找不到库文件。

这里写图片描述


附加包含目录

这里写图片描述

当前配置应选择Release模式,同时需要设置Release模式下可调试,方可生成在生成exe时生成.pdb调试信息文件,通过以下两个步骤实现

在这里插入图片描述

在这里插入图片描述


下面是GoogleBreakpad捕获崩溃文件需要的lib文件及头文件在我建立工程下的文件位置(确保文件位置正确,否则编译不会通过)

这里写图片描述

这里使用到的库文件从GoogleBreakpad源码中common、crash_generation_client、exception_handler三个工程生成的.lib文件,有兴趣的小伙伴可以自己附加这几个工程到项目中然后生成我们需要的lib文件。
如果想简单点可以直接从下面链接中下载,然后解压到我们需要使用的工程中。

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

这里写图片描述

其中我将common、crash_generation_client、exception_handler这三个工程分别进行了动态编译和静态编译,本例的工程中用到的为动态编译的lib文件。(至于动态编译和静态编译不懂的小伙伴可以自行百度一下)
这里写图片描述

(三)、添加代码

main.cpp
#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();
}

为BreakPadTest中添加一个按钮,下面为按钮点击的槽函数,从代码中可以看到按钮点击后将导致程序崩溃。
void BreakPadTest::onButtonClicked()
{
	int *i = NULL;
	*i = 0;
}

(四)、生成解决方案,在程序生成目录,点击exe运行程序

这里写图片描述

点击下面的按钮,我们发现程序崩溃闪退,同时我们发现exe所在目录成功生成了 dmp文件。

这里写图片描述 这里写图片描述

(五)、根据dmp文件,恢复程序崩溃时的状态。

用VS打开dmp文件,我们会看到程序崩溃时的一些信息。

这里写图片描述

点击右方的"使用 仅限本机 进行调试”按钮,我们可以看到程序崩溃的堆栈信息以及错误具体发生在具体哪一行代码。

这里写图片描述

从上面我们定位到了程序的崩溃位置,也发现了错误所在,下面就是修改bug了。

####有时候我们并不能根据程序崩溃的位置用肉眼直接发现问题所在,这就要根据堆栈信息查看具体是哪里出现了问题。


这一篇中用图文的方式详细地介绍了如何为一个工程添加Google Breakpad来帮我们生成dmp文件来定位程序崩溃的原因。我将会在下一篇中详细讲解一下上文中使用的代码,虽然我们不需要了解Google Breakpad所有的源码,但至少上文中涉及的代码要有一点了解。


本文代码实例下载

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是Qt程序崩溃异常捕获的方法: 1.使用qInstallMessageHandler()函数来自定义消息处理程序,以便在程序崩溃时获取相关信息。以下是一个示例代码: ```cpp void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) { QByteArray localMsg = msg.toLocal8Bit(); switch (type) { case QtDebugMsg: fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtInfoMsg: fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtWarningMsg: fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtCriticalMsg: fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtFatalMsg: fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); abort(); } } int main(int argc, char *argv[]) { qInstallMessageHandler(myMessageOutput); QApplication a(argc, argv); // ... return a.exec(); } ``` 2.使用Qt的调试器来捕获异常。在Qt Creator中,可以通过以下步骤来使用调试器: - 在Qt Creator中打开项目并设置断点。 - 单击“调试”按钮以启动调试器。 - 在调试器中运行程序并观察变量和堆栈。 - 如果程序崩溃,调试器将停止并显示崩溃信息。 3.使用第三方库来捕获异常,例如Google BreakpadGoogle Breakpad是一个开源库,可用于在Windows、Linux和Mac OS X上捕获程序崩溃信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值