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系统门户网站
随机推荐
- kubernetes kubectl 命令自动补全
yum install -y bash-completion source /usr/share/bash-completion/bash_completion source <(kubectl ...
- Jenkins和Gitlab CI/CD自动更新k8s中pod使用的镜像说明
Jenkins 使用Jenkins的话,完成的工作主要有如下步骤: 1.从Gogs或Gitlab仓库上拉取代码 2.使用Maven编译代码,打包成jar文件 3.根据jar文件使用相对应的Docker ...
- GitLab + Jenkins + Harbor 工具链快速落地指南
目录 一.今天想干啥? 二.今天干点啥? 三.今天怎么干? 3.1.常规打法 3.2.不走寻常路 四.开干吧! 4.1.工具链部署 4.2.网络配置 4.3.验证工具链部署结果 4.3.1.GitLa ...
- strut2 标签加载图表。
//===============================================超市订单量走势图========================================= v ...
- 记一次某制造业ERP系统 CPU打爆事故分析
一:背景 1.讲故事 前些天有位朋友微信找到我,说他的程序出现了CPU阶段性爆高,过了一会就下去了,咨询下这个爆高阶段程序内部到底发生了什么? 画个图大概是下面这样,你懂的. 按经验来说,这种情况一般 ...
- 【python】Ubuntu中多条命令的运行
在模型训练时,往往需要消融实验,通常都是在一个程序运行结束后才再次手动运行下一个,不及时在电脑前可能无端浪费时间,因此需要让程序自动一个接一个去执行.受此启发,特了解了Ubuntu中多命令运行的内容. ...
- wampServer配置WWW根目录遇到的坑
直接在官网下载之后开始安装,一切正常 打开使用,一切正常 设置WWW目录.坑了一波 按照的都是百度上的教程,设置httpd.conf 这里配置之后网页访问127.0.0.1 还是localhost都还 ...
- Linux基础_2_bash功能
查看当前shell:echo $SHELL 查看可用shell:cat /etc/shells 命令行编辑 光标跳到行首:Ctrl+a 光标跳到行尾:Ctrl+e 以单词为单位快速跳转光标:Ctr ...
- C语言编译环境中的 调试功能及常见错误提示
文章目录 1 .调试功能 2 . 编译中的常见错误例析 3 .常见错误信息语句索引 1 .调试功能 1.常用健 <F10> : 激活系统菜单 <F6> : 将光标在编辑窗口和. ...
- or、and表达式
or 逻辑表达式 result = a or b 如果a为空则执行or后面的b,如果a不为空,则执行or前面的a 即:赋值运算中,如果or前面为真,就不会去执行or后面的,如果or前面为假才会执行or ...