方案一、基于Google Breakpad的跨平台Qt崩溃异常捕获调用方案

首先上博客:Windows下Qt生成dump文件并定位bug(基于qBreakpad)

这个地方使用的是一个叫qBreakPad的方案,这个之前在网上有过文档,但是文档太老了,不是很看得懂,这里看到个说的比较明白的,故拿来简单介绍一下:

1.生成静态库lib文件

首先我们拿到这个qBreakpad工程文件,先构建一下,生成一个我们想要的静态库文件,可能会出现一些bug,在上文提到的博客中有相关的一些解决方案。

这里我们需要获得两个静态库文件,一个是debug版本的,一个是release版本的,其实也可以只获得需要的那个,但是我在这里会上传一个demo,里面有两个静态库文件,具体存放方式如图所示

1.

2.

3.include :

  1. 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崩溃异常捕获调用方案的更多相关文章

  1. #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  2. 基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案 郑昀 基于杨海波的设计文档(转)

    郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...

  3. QT中使用google breakpad捕获程序崩溃异常

    今天给大家介绍一个在linux下如何捕获程序崩溃异常的方法 一.google breakpad源码的下载和编译 1.https://github.com/google/breakpad.git,源码地 ...

  4. Google Breakpad 之一,跨平台crash 处理上报系统简介

    Google Breakpad 之一,跨平台crash 处理上报系统简介 http://blog.csdn.net/wpc320/article/details/8290501 Google Brea ...

  5. 【Qt编程】基于Qt的词典开发系列&lt;八&gt;--用户登录及API调用的实现

    在上一篇文章<调用网络API>中,我仅仅讲述了怎样直观的使用API接口以及调用API后返回的结果,本文则从程序实现的角度来实现API的调用.当然本程序的实现也是借助于扇贝网的API接口文档 ...

  6. C++库(Google Breakpad)

    Google Breakpad是什么? 一个开源的多平台崩溃报告系统. Google breakpad是一个非常实用的跨平台的崩溃转储和分析模块,它支持Windows,Linux和Mac和Solari ...

  7. google breakpad for linux(2)

    breakpad 是什么 breakpad 是一个包含了一系列库文件和工具的开源工具包,使用它可以帮助我们在程序崩溃后进行一系列的后续处理,如现场的保存(core dump),及事后分析(重建 cal ...

  8. Google Breakpad · 基础介绍

    Google breakpad是一个跨平台的崩溃转储和分析框架和工具集合. 三个主要组件 ◆ client 以library的形式内置在你的应用中,当崩溃发生时写 minidump文件 ◆ symbo ...

  9. 【Qt编程】基于Qt的词典开发系列<四>--无边框窗口的缩放与拖动

    在现在,绝大多数软件都向着简洁,时尚发展.就拿有道的单词本和我做的单词本来说,绝大多数用户肯定喜欢我所做的单词本(就单单界面,关于颜色搭配和布局问题,大家就不要在意了). 有道的单词本: 我所做的单词 ...

  10. Google BreakPad使用集

    Google Breakpad 学习笔记 - 简书   Qt中使用Google Breakpad捕获程序崩溃异常_Linux编程_Linux公社-Linux系统门户网站 

随机推荐

  1. 【可视化大屏教程】用Python开发智慧城市数据分析大屏!

    目录 一.开发背景 二.讲解代码 2.1 大标题+背景图 2.2 各区县交通事故统计图-系列柱形图 2.3 图书馆建设率-水球图 2.4 当年城市空气质量aqi指数-面积图 2.5 近7年人均生产总值 ...

  2. Podman容器基础(二)

    Podman容器技术基础(二) 目录 Podman容器技术基础(二) 容器的使用 用户操作 用户配置文件 容器卷 容器的使用 运行一个容器 [root@cent1 ~]# podman pull ht ...

  3. SQL语句编写的练习(MySQL)

    SQL语句编写的练习(MySQL) 一.建表 1.学生表(Student) 学号 | 姓名 | 性别 | 出生年月 | 所在班级 create table Student( sno varchar(2 ...

  4. 齐博x1标签之无刷新显示更多

    示范代码如下: <div class="ListMoreInfos"> {qb:tag name="news_list_page_listdata02&quo ...

  5. 了解 Flutter 开发者们的 IDE 使用情况

    作者 / JaYoung Lee, UX Researcher at Google Google 的 Flutter 团队负责构建和维护 Android Studio (基于 IntelliJ-IDE ...

  6. NLP之TextRNN(预测下一个单词)

    TextRNN @ 目录 TextRNN 1.基本概念 1.1 RNN和CNN的区别 1.2 RNN的几种结构 1.3 多对多的RNN 1.4 RNN的多对多结构 1.5 RNN的多对一结构 1.6 ...

  7. 10.异步mysql

    python中操作mysql连接.操作.断开都是网络IO #安装支持异步aiomysql的模块 pip3 install aiomysql async def execute(): # 网络IO操作, ...

  8. 二、Kubernetes 概念介绍

    一.Master ​ Master指的是集群控制节点,在每个Kubernetes集群里都需要有一个Master来负责整个集群的管理和控制,基本上Kubernetes的所有控制命令都发给它,它负责具体的 ...

  9. @RequestBody 注解问题

    /**         * 不管你是get 请求 还是 post 请求  只要你的参数名称叫做abc          * 这里的abc 必须和 postman里面的key 一样          * ...

  10. vue-项目的整体增删改查

    Dept: package com.example.demo.gs; public class Dept { private int id; private String name; private ...