QT+VS 调用基于Google Breakpad的跨平台Qt崩溃异常捕获调用方案
方案一、基于Google Breakpad的跨平台Qt崩溃异常捕获调用方案
首先上博客:Windows下Qt生成dump文件并定位bug(基于qBreakpad)
这个地方使用的是一个叫qBreakPad的方案,这个之前在网上有过文档,但是文档太老了,不是很看得懂,这里看到个说的比较明白的,故拿来简单介绍一下:
1.生成静态库lib文件
首先我们拿到这个qBreakpad工程文件,先构建一下,生成一个我们想要的静态库文件,可能会出现一些bug,在上文提到的博客中有相关的一些解决方案。
这里我们需要获得两个静态库文件,一个是debug版本的,一个是release版本的,其实也可以只获得需要的那个,但是我在这里会上传一个demo,里面有两个静态库文件,具体存放方式如图所示
1.
2.
3.include : 
- lib:

其中debug和release文件夹中只放了一个根据版本的qBreakpad.lib文件
2.添加引用和库
这个就不多说了,在那个vc++里面设置一下就行了,记得这一步还需要在连接器里面添加lib文件的引用,或者直接用pragma,也是可以的
3.写代码
直接在main函数里面,添加这么一行
#include "QBreakpadHandler.h"
QBreakpadInstance.setDumpPath("crashes"); // 设置生成dump文件路径
这样就可以在程序崩溃的时候生成dump文件了

方案二,仅限于windows环境下的崩溃捕捉方案,调用更简单
QDump.h
#pragma once
//注意下面2个头文件引入的顺序
#include <windows.h>
#include <dbghelp.h>
extern char* g_qsDumpName;
class QtDumpGenerate
{
public:
QtDumpGenerate();
void ApplicationCrashHandler(EXCEPTION_POINTERS *pException);
};
// dump处理
// 使用方法: SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
long ApplicationCrashHandler(EXCEPTION_POINTERS *pException);
QDump.cpp:
#include "QDump.h"
#include <QObject>
#include <QDir>
#include <QDateTime>
#include <QDebug>
#include <QCoreApplication>
#pragma comment(lib, "dbghelp.lib")
char* g_qsDumpName = "";
QtDumpGenerate::QtDumpGenerate()
{
}
void QtDumpGenerate::ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
QDateTime current_date_time = QDateTime::currentDateTime();
QString current_date = current_date_time.toString("yyyyMMdd_hhmmss");
QString dmpName = QString::fromLocal8Bit(g_qsDumpName);
QString dmpFileName = QCoreApplication::applicationDirPath() + "/" + dmpName + current_date + ".dmp";
EXCEPTION_RECORD *record = pException->ExceptionRecord;
QString errCode(QString::number(record->ExceptionCode, 16));
QString errAddr(QString::number((uint)record->ExceptionAddress, 16));
QString errFlag(QString::number(record->ExceptionFlags, 16));
QString errPara(QString::number(record->NumberParameters, 16));
qDebug() << "errCode: " << errCode;
qDebug() << "errAddr: " << errAddr;
qDebug() << "errFlag: " << errFlag;
qDebug() << "errPara: " << errPara;
HANDLE hDumpFile = CreateFile((LPCWSTR)QString(dmpFileName).utf16(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDumpFile != INVALID_HANDLE_VALUE) {
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
}
else {
qDebug() << "hDumpFile == null";
}
}
long ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
QtDumpGenerate dmpGenerate;
dmpGenerate.ApplicationCrashHandler(pException);
return EXCEPTION_EXECUTE_HANDLER;
}
main.cpp:
#include "QCrushHandler.h"
#include <QtWidgets/QApplication>
#include "QDump.h"//方案二
#include "QBreakpadHandler.h"//方案一
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//方案二
QString g_qsDumpName = "LgInteractSmartCompus";
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
//方案一
QBreakpadInstance.setDumpPath("crashes"); // 设置生成dump文件路径
QCrushHandler w;
w.show();
return a.exec();
}
QT+VS 调用基于Google Breakpad的跨平台Qt崩溃异常捕获调用方案的更多相关文章
- #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案
郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...
- 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)
郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...
- QT中使用google breakpad捕获程序崩溃异常
今天给大家介绍一个在linux下如何捕获程序崩溃异常的方法 一.google breakpad源码的下载和编译 1.https://github.com/google/breakpad.git,源码地 ...
- Google Breakpad 之一,跨平台crash 处理上报系统简介
Google Breakpad 之一,跨平台crash 处理上报系统简介 http://blog.csdn.net/wpc320/article/details/8290501 Google Brea ...
- 【Qt编程】基于Qt的词典开发系列<八>--用户登录及API调用的实现
在上一篇文章<调用网络API>中,我仅仅讲述了怎样直观的使用API接口以及调用API后返回的结果,本文则从程序实现的角度来实现API的调用.当然本程序的实现也是借助于扇贝网的API接口文档 ...
- C++库(Google Breakpad)
Google Breakpad是什么? 一个开源的多平台崩溃报告系统. Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块,它支持Windows,Linux和Mac和Solari ...
- google breakpad for linux(2)
breakpad 是什么 breakpad 是一个包含了一系列库文件和工具的开源工具包,使用它可以帮助我们在程序崩溃后进行一系列的后续处理,如现场的保存(core dump),及事后分析(重建 cal ...
- Google Breakpad · 基础介绍
Google breakpad是一个跨平台的崩溃转储和分析框架和工具集合. 三个主要组件 ◆ client 以library的形式内置在你的应用中,当崩溃发生时写 minidump文件 ◆ symbo ...
- 【Qt编程】基于Qt的词典开发系列<四>--无边框窗口的缩放与拖动
在现在,绝大多数软件都向着简洁,时尚发展.就拿有道的单词本和我做的单词本来说,绝大多数用户肯定喜欢我所做的单词本(就单单界面,关于颜色搭配和布局问题,大家就不要在意了). 有道的单词本: 我所做的单词 ...
- Google BreakPad使用集
Google Breakpad 学习笔记 - 简书 Qt中使用Google Breakpad捕获程序崩溃异常_Linux编程_Linux公社-Linux系统门户网站
随机推荐
- Nexus OSS 3 搭建并配置使用 Docker & Git LFS 仓库
转载自:https://cloud.tencent.com/developer/article/1010590 1.Nexus OSS 3 介绍 我们知道 Nexus 是一个强大的 Maven 仓库管 ...
- ERP系统都能给企业带来什么好处?
ERP系统但如果用得好,自然可以提高企业内部资源的计划和控制能力,提质增效降成本,提升企业竞争力,加速数字化转型步伐,但不是所有的企业使用ERP都能带来好处的,尤其是对于一些小微企业,带来的可能是灾难 ...
- LeetCode - 数组的旋转总结
1. 数组的旋转总结 数组的旋转指的是将数组的最后若干个数提前到数组前面,数组的翻转指的是将数组的顺序颠倒.旋转可以通过多次翻转实现. 数组的翻转很简单,通过双指针来实现:交换数组的第一个数和最后一个 ...
- C字符串和C++中string的区别
在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别: C字符串 string对象(C++) 所需的头文件名称 ...
- 微信小程序开发优化
一.开发优化一 1.使用Vant Weapp 1.1 什么是Vant Weapp Vant Weapp官网链接 Vant Weapp是有赞前端团队开源的一套小程序UI组件库,助力开发者快速搭建小程序应 ...
- JavaWeb完整案例详细步骤
JavaWeb完整案例详细步骤 废话少说,展示完整案例 代码的业务逻辑图 主要实现功能 基本的CURD.分页查询.条件查询.批量删除 所使用的技术 前端:Vue+Ajax+Elememt-ui 后端: ...
- coding上创建项目、创建代码仓库、将IDEA中的代码提交到coding上的代码仓库、Git的下载、IDEA上配置git
文章目录 一.Git的安装以及子啊IDEA上配置Git(下载好的可以跳过) 二.怎样让IDEA和Git建立关系 三.在coding上创建项目 四.在coding上创建代码仓库 五.Git工作理论 六. ...
- java 入土--集合详解
java 集合 集合是对象的容器,实现了对对象的常用的操作,类似数组功能. 和数组的区别: 数组长度固定,集合长度不固定 数组可以存储基本类型和引用类型,集合只能存储引用类型 使用时需要导入类 Col ...
- Three.js中加载外部fbx格式的模型素材
index.html部分: index.js部分: Scene.js部分:
- 基于LZO的高性能无损数据解压缩IP
LZOAccel-D LZO Data Decompression Core/无损数据解压缩IP Core LZOAccel-D是一个无损数据解压缩引擎的FPGA硬件实现,兼容LZO 2.10标准. ...