QtCreator+windows崩溃定位分析

2023-05-16

文章目录

  • 一、Qt程序Release版本记录崩溃信息,并定位问题代码
    • 1. Release版本程序中生成pdb调试信息文件
    • 2. 添加代码将程序崩溃时的堆栈保存为crash.dmp文件
    • 3.使用 WinDbg 分析crash.dmp文件
  • 二、跨平台生成dump的开源项目
  • 三、参考资料

一、Qt程序Release版本记录崩溃信息,并定位问题代码

pdb文件,后缀*.pdb,是程序的符号文件。
dump文件,后缀*.dmp,是程序崩溃时的内存转储文件;

windows平台下微软有成熟的分析工具,比如VS和windbg。

1. Release版本程序中生成pdb调试信息文件

在.pro文件中加入如下语句:

QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /DEBUG

或者在项目 —> 构建步骤 中,将Generate separate debug info勾选。
在这里插入图片描述

2. 添加代码将程序崩溃时的堆栈保存为crash.dmp文件

在.pro文件中加入如下语句:

LIBS += -lDbgHelp
#include <Windows.h>
#include <DbgHelp.h>
#include <QApplication>
#include <QMessageBox>

// 保存程序异常崩溃的信息
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
    //创建 Dump 文件
    HANDLE hDumpFile = CreateFile(L"crash.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hDumpFile != INVALID_HANDLE_VALUE)
    {
        //Dump 信息
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ExceptionPointers = pException;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ClientPointers = TRUE;

        // 写入 dump 文件内容
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
    }

    //弹出一个错误对话框
    QMessageBox msgBox;
    msgBox.setText("application crash!");
    msgBox.exec();

    return EXCEPTION_EXECUTE_HANDLER;
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //注册异常捕获函数
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);

    // set printf and fprintf out immediately
    setvbuf(stdout, NULL, _IONBF, 0);
    setvbuf(stderr, NULL, _IONBF, 0);

    OctNisus w;
    w.show();
    return a.exec();
}

github地址

3.使用 WinDbg 分析crash.dmp文件

如果主程序有多层嵌套,例如主程序下还有动态库,那么下一次需将动态库的.pdb和动态库的源码打开,再打开同一个crash.dmp进行更深成次的定位。

1.打开WinDbg(x64)(windbg.exe);
2.File —> Symbol File Path,设置.pdb文件对应文件夹;
3.File —> Source File Path,设置源代码对应文件夹;
4.File —> Open Crash Dump,打开crash.dmp文件。
5.输入!analyze –v命令,这个命令是最简单也是最实用的的调试命令。

在这里插入图片描述另外如果是Qt+MinGW, 还可以使用addr2line.exe。

二、跨平台生成dump的开源项目

在不同的平台下,生成dump文件的方式都不同。谷歌的开源项目叫Breakpad,统一了这三平台win、linux、mac生成dump的方式,通过它就可以跨平台。

Github地址:https://github.com/google/breakpad

另一个开源项目叫qBreakpad,使用Qt对Breakpad进一步封装,使用更简单。

Github地址:https://github.com/buzzySmile/qBreakpad

三、参考资料

  • Qt程序Release版本记录崩溃信息,并定位问题代码
  • windows上bug崩溃定位分析(Qt或者VS)
  • 12.5-使用Qt实现跨平台C++崩溃捕获,看这一篇就足够了(Breakpad)
  • (Windbg调试二)Windows下c++程序崩溃问题定位
  • Windows 平台定位C语言工程内存泄漏
  • Qt dump崩溃调试简单整理
  • Windows下Qt生成dump文件并定位bug(基于qBreakpad)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QtCreator+windows崩溃定位分析 的相关文章

随机推荐

  • 【模型压缩】实例分析量化原理

    1 从定点模型训练来分析量化原理 xff1a 定点模型训练是一个迁移训练的过程 xff1a 在浮点网络的相应位置插入定点化处理节点 xff08 相 当于激活函数 xff09 xff0c 然后在这个经过定点化的计算图上重新训练神经网络 以全连
  • 【3D视觉】深度摄像头与3D重建

    1 xff0c Kinect 是微软在2010年6月14日对XBOX360体感周边外设正式发布的名字 大家在上图可以看到 xff0c Kinect两端有两个3D深度摄像头 xff0c 左边那个发射红外线 xff0c 右边那个是一个红外线感应
  • 【3D视觉】realsense D435三维重建

    1 xff0c 硬件 xff1a realsense D435 驱动及SDK开发包安装 GitHub IntelRealSense librealsense Intel RealSense SDK 下载最新驱动 安装后打开 Intel Re
  • ssh: connect to host 10.112.1.5 port 10083: Connection refused

    ssh connect to host 10 112 1 5 port 10083 Connection refused 1 查看已知端口占用情况 我们想知道10083端口的使用情况 xff0c 或者说被谁占用了 xff0c 命令如下 xf
  • Unity之将Texture保存成png

    using UnityEngine using System Collections using System IO public class SaveToPng MonoBehaviour public Shader outShader
  • 基于容器训练OpenPCdet

    基于容器训练OpenPCdet 1 先拉取一个运行的镜像 docker pull djiajun1206 pcdet pytorch1 6 2 基于镜像创建一个容器 nvidia docker run it name pcdet privi
  • 【CUDA入门笔记】概述

    1 xff0c CUDA架构 xff08 1 xff09 一个GPU包含多个多核处理器 xff1b xff08 2 xff09 一个多核处理器包含多个线程处理器 xff08 3 xff09 线程处理器是最基本的计算单元 xff0c 有自己的
  • 【CUDA入门笔记】CUDA内核与线程配置

    1 CUDA核函数 在GPU上调用的函数成为CUDA核函数 Kernel function xff0c 核函数会被GPU上的多个线程执行 每个线程都会执行核函数里的代码 xff0c 当然由于线程编号的不同 xff0c 执行的代码路径可能会有
  • 【CUDA入门笔记】GPU存储结构模型(1)

    GPU存储结构模型 1 CPU可以读写GPU设备中的Global Memory Constant Memory以及Texture Memory内存储的内容 xff1b 主机代码可以把数据传输到设备上 xff0c 也可以从设备中读取数据 xf
  • 【CUDA入门笔记】GPU存储结构模型(2)

    GPU存储结构模型 1 CPU可以读写GPU设备中的Global Memory Constant Memory以及Texture Memory内存储的内容 xff1b 主机代码可以把数据传输到设备上 xff0c 也可以从设备中读取数据 xf
  • 基于多二维码识别的无人机运动真值获取

    基于多二维码识别的三维运动真值获取 1 背景介绍2 原理2 1 二维码基础2 2图像预处理2 3 定位标轮廓提取2 4 多二维码鲁棒识别 3 运行结果3 1对单张图片进行多二维码识别3 2 获取一系列静止图片的轨迹3 3 相机做圆周运动的轨
  • c++实现简单http服务器

    http基于tcp协议的应用层协议 xff0c 说白了就是写死的自定义协议 xff0c 代码实现了简单的get请求 xff0c 打开服务后 xff0c 可以通过网站访问本地资源 xff0c 适合新手学习的简单代码 xff0c 有助于理解ge
  • 基于NRF24L01的CAN数据透传

    闲谈 xff1a 闲来无聊 xff0c 恰好公司又经常用CAN数据的传输 xff0c 自己觉得要是用无线传送多好 xff0c 然后 xff0c 就是一个奇想 xff0c 就想做一个无线数据的透传 xff0c 恰好身边又有NRF24L01 那
  • 倾斜补偿的电子罗盘(1):地磁场,磁传感器,倾斜补偿

    倾斜补偿的电子罗盘 1 xff1a 地磁场 xff0c 磁传感器 xff0c 倾斜补偿 地磁场和磁传感器 地磁场可以用于获取方位信息 以北半球为例 xff0c 地磁场方向不是与地面水平 xff0c 而是与水平方向有一定的倾角 xff08 指
  • vscode常用插件

    vscode常用插件 1 Markdown All In One 在所有拓展插件中 xff0c 这个插件基础功能最全 xff0c 快捷键多 xff0c 方便使用 2 Markdown Toc 这个插件是用来生成目录 xff0c 这个插件我用
  • typescript中使用字典Dictionary

    key为string value为number var map key string number 61 34 t 34 3 34 o 34 5 34 g 34 10 for let k in map egret log map k
  • Qt Design Studio社区版安装与使用

    Qt Design Studio社区版免费下载 由于登录官网不能下载 xff0c 找到镜像网站进行下载 xff1a 基于msvc 2019 64位 xff1a http iso mirrors ustc edu cn qtproject o
  • vscode用conda配置Python虚拟环境

    1 到官网下载Anaconda2 下载vscode中Python插件3 以管理员身份运行vscode4 利用conda创建python虚拟环境5 在vscode中配置Setting json添加Python路径6 最后检验运行Python项
  • 阿里云搭建ftp服务器+FileZilla客户端查看文件

    文章目录 1 阿里云搭建ftp服务器1 1 安装ftp服务器1 2 设置阿里云ECS的安全组 2 FileZilla客户端查看文件 1 阿里云搭建ftp服务器 1 1 安装ftp服务器 1 安装vsftp xff0c sudo span c
  • QtCreator+windows崩溃定位分析

    文章目录 一 Qt程序Release版本记录崩溃信息 xff0c 并定位问题代码1 Release版本程序中生成pdb调试信息文件2 添加代码将程序崩溃时的堆栈保存为crash dmp文件3 使用 WinDbg 分析crash dmp文件