首页 > 其他分享 >QT通过QBreakpad捕捉崩溃

QT通过QBreakpad捕捉崩溃

时间:2023-09-06 21:55:05浏览次数:42  
标签:文件 QT qbreakpadlib debug PWD 捕捉 release QBreakpad include

最近在公司项目上遇到程序运行时崩溃,也不好在log日志中定位。查找了资料发现,谷歌的一个开源项目Breakpad,统一了这三平台win、linux、mac生成dump的方式来捕捉崩溃。

大致研究了一下,主要依赖一个静态库和几个头文件,我这边编译出来放到网盘上大家自行使用。

链接: https://pan.baidu.com/s/19elsFxnKfzdNaX6cURruAw?pwd=JJLM 提取码: JJLM 

用法就是在工程文件pro里引入库:

############ for qBreakpad ############
# qBreakpad中需要使用到network模块
QT += network

# 启用多线程、异常、RTTI、STL支持
CONFIG += thread exceptions rtti stl

# without c++11 & AppKit library compiler can't solve address for symbols
CONFIG += c++11
macx: LIBS += -framework AppKit

# 配置头文件搜索路径和链接库路径
win32:CONFIG(release, debug|release): {
LIBS += -L$$PWD/qbreakpadlib/lib/release/ -lqBreakpad
DEPENDPATH += $$PWD/qbreakpadlib/lib/release
} 
else:win32:CONFIG(debug, debug|release): {
LIBS += -L$$PWD/qbreakpadlib/lib/debug/ -lqBreakpad
DEPENDPATH += $$PWD/qbreakpadlib/lib/debug
}

INCLUDEPATH += $$PWD/qbreakpadlib/include

############ for qBreakpad ############

然后在main.cpp中添加调用代码,如下:

 1 #include "qBreakpadTest.h"
 2 #include <QApplication>
 3 
 4 #include "QBreakpadHandler.h"
 5 
 6 int main(int argc, char *argv[])
 7 {
 8     QApplication a(argc, argv);
 9     
10     QBreakpadInstance.setDumpPath("crashes");    // 设置生成dump文件路径
11     qBreakpadTest w;
12     w.show();
13     return a.exec();
14 }

之后程序如果崩溃会在你设置的路径位置生成一个bmp文件,拿到这个文件与程序的pdb文件就可以定位到具体某一行了,具体操作方法如下:

我这里使用VS 2019,来进行如下的操作。

Vs文件菜单下,选择“打开”->“文件”,如下:(也可以直接选择拖拽dump文件到Vs也是一样)

 找到dump文件,并打开,可以看到转储摘要模块等,但是并不能发现问题何在。如下:

 接下来,点击“设置符号路径”,点击“+”号,添加pdb文件路径,之后,“确定”。如下:

 最后,点击“使用 仅限本机 进行调试”,可以很清楚的,定位到崩溃发生的代码行上。

注意,源码一定不能变化,哪怕只是更改加入了一行或者什么空格,都会导致定位错误或者只能定位大概位置,所以源码一定要和编译出exe时一致。

原文地址:Qt Windows系统使用QBreakpad实战_qbreakpad vs_Fu_Lin_的博客-CSDN博客

 

标签:文件,QT,qbreakpadlib,debug,PWD,捕捉,release,QBreakpad,include
From: https://www.cnblogs.com/jiaxinyoudiansha/p/17683441.html

相关文章

  • Qt3D曲面正反面贴图例程
    主要利用GLSL中的内置变量gl_FrontFacing区分正反面。下面是正面反面效果图:头文件:classQOpenGLShaderProgram;classQOpenGLTexture;//---------------------------------------------------------------------------------------//显示图片//-----------------------......
  • 使用Qt连接SQLite数据库(ODBC方式)|QSqlQuery的常用功能
    SQLite是一种轻量级的嵌入式数据库,而Qt是一个强大的跨平台应用程序开发框架。本文将介绍如何使用Qt以ODBC方式连接SQLite数据库,以及执行简单的数据库操作。准备工作在开始之前,确保您已经进行了以下准备工作:安装Qt:如果尚未安装Qt,您可以从官方网站下载并安装Qt开发环境。安装ODBC驱动......
  • 【原创】基于QT编写的支持IPv4/IPv6双协议栈,TCP/UDP双模式,DLL内存加载的模块化远控木
    本人已经本科毕业一年有余,在平常实习过程中,发现大佬都对我的本科毕设--双协议栈远控木马感兴趣。据我所知,目前流行的C2远控软件中,MSF支持IPv4和IPv6,但是MSF生成的单个木马只是支持其中的一种协议,而不是双协议栈。CobaltStrike目前尚无IPv6的使用案例。其他支持双协议栈的C2软件......
  • 深入了解Mosquitto:MQTT消息的用法和介绍
    MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,在物联网领域得到广泛应用。Mosquitto是一个流行的MQTT消息代理实现,它允许设备和应用之间进行高效的消息通信。本文将介绍Mosquitto的基本用法和特点,并提供代码演示。什么是Mosquitto?Mosquitto是一个开源的MQTT......
  • buildroot 构建根文件系统(5)添加 Qt 库相关环境
    一、开发背景构建最小系统后成功运行后,需要支持Qt库编译的程序在上面运行二、开发需求Qt库编译的程序可以正常运行三、开发环境LinuxUbuntu 4.15.0-65-generic+ buildroot-2023.02.3+i.mx6d(cortex-A9)四、实现步骤1、基于前面章节的文件系统上打......
  • C++系列三:QT-Controls
    目录前言前言最简单控件,示例//QPushButtonQPushButton*button=newQPushButton("点击我",&w);button.setText("Clickme!");QObject::connect(&button,&QPushButton::clicked,[&](){//button被点击时执行的代码qDebug()<<&......
  • QT编译时qmake和cmake的区别
    qMakeQT+=coreguiQT缺省使用了core和gui库变量TARGET描述了目标文件的名称,即生成的应用程序的名字,默认采用工程文件所在的文件夹名字。变量TEMPLATE描述了为建立目标文件而采用何种模板,即生成何种形式的Makefile文件,有以下5种模板:应用程序app,为建立一个Qt应用程......
  • Windows MSVC 编译 libcurl 库,并导入到 QT 中
    前提QT已经配置好,编译器使用MSVC2017编译libcurl库1、下载curl官网下载,windows选择.zip后缀的文件2、nmake编译(VisualStudio中的附带命令)(1)解压并进入文件夹,双击运行buildconf.bat文件(2)开始菜单找到VisualStudio2017->VisualStudioTools->VC文件夹,选择x86......
  • Qt调用 mysql数据库 QSqlQuery::exec()堵塞
    RT,因为某个字段名称写错了,修改字段语句,语句大致如下altertablet_user_settingchangefield1field2varchar(32)default'11'comment'22'每当执行到query.exec()时,直接堵塞不动,刚好我这里使用workbench查看数据库,在workbench调用同样语句,程序就不堵塞了,每次都是这样。最......
  • 记录一个 qt+cmake 项目不生成 ui_xxx.h 文件的问题
    最近做一个Qt的项目的代码迁移到新平台,遇到一个问题。这个项目使用的CMake构建脚本,项目中的某个ui文件怎么都不能生成对应的ui_xxx.h文件,其他的文件都没有问题,使用qmake构建也没有问题。经过排查,问题原因如下:#include"ui_xxx.h"上面#include和后面的头文件之间没有空格......