Qt程序crash信息的捕捉与跟踪(qt-mingw)

2023-11-02

在用qt编写程序时经常会遇到崩溃问题,如果抓取不到crash堆栈信息就会对崩溃问题束手无策,只能对其进行复现,推断。

 

目录

一般解决crash问题时有如下步骤:

如何执行以上3步骤,下面我详细介绍如何操作;

步骤1:

步骤2:

步骤3:

网友评论:

 

 


一般解决crash问题时有如下步骤:

 

  1. 从软件发行版本能跟获得debug信息,在不同平台下有不同的表现方式,目前只讨论qt-mingw方式,这种方式可以利用修改工程文件配置项编译时讲debug信息加入应用程序当中;当然这会增加发行版应用程序的体积。如果想体积变小可以strip应用程序。
  2. 获得crash堆栈信息
  3. 根据crash堆栈信息和1中的debug信息来查找软件崩溃的位置。


如何执行以上3步骤,下面我详细介绍如何操作;

步骤1:

在工程文件.pro中加入如下代码,生成可执行文件中就会带debug信息:
QMAKE_CXXFLAGS_RELEASE += -g

QMAKE_CFLAGS_RELEASE += -g

QMAKE_LFLAGS_RELEASE = -mthreads -Wl

前两行意识意思为在release版本中增加debug信息;第三行意思为release版本中去掉-s参数,这样就生成对应符号表,可以调试跟踪;

 

步骤2:


(注:目前只讨论windows平台,linux和mac暂不讨论;)

需要调用window平台系统api进行截取crash信息及获得crash堆栈。
首先在main函数中调用系统API SetUnhandledExceptionFilter,该函数有个设置回调函数,软件崩溃时会回调该系统函数,并传回崩溃地址信息等。

如何调用,请看如下代码:

long __stdcall   callback(_EXCEPTION_POINTERS*   excp)
{
    CCrashStack crashStack(excp);
    QString sCrashInfo = crashStack.GetExceptionInfo();
    QString sFileName = "testcrash.log";

    QFile file(sFileName);
    if (file.open(QIODevice::WriteOnly|QIODevice::Truncate))
    {
        file.write(sCrashInfo.toUtf8());
        file.close();
    }

    qDebug()<<"Error:\n"<<sCrashInfo;
    //MessageBox(0,L"Error",L"error",MB_OK);
    QMessageBox msgBox;
    msgBox.setText(QString::fromUtf8("亲,我死了,重新启动下吧!"));
    msgBox.exec();

    return   EXCEPTION_EXECUTE_HANDLER;
}

int main(int argc, char *argv[])
{
    SetUnhandledExceptionFilter(callback);

    QApplication a(argc, argv);
    Dialog w;
    w.show();

    return a.exec();
}

 

注:CCrashStack 是我写的类,目的是调用系统API获取crash堆栈信息;(目前只针对windows平台)

 

步骤3:

通过qt命令行进入 执行命令:
objdump -S xxx.exe >aaa.asm

 

命令执行完成后,根据步骤2中获得的crash堆栈信息在aaa.asm中查找响应地址,即可得到崩溃具体位置。


附件为测试demo,里面有完整代码,各位可下载体验。

Demo下载地址:

http://download.csdn.net/detail/lanhy999/6341987

 

网友评论:

  • SHIXINGYA: EXE太大,asm生成不全,怎么解决? asm生成到465350行就不写了(8个月前#7楼)收起回复

  • SHIXINGYA回复 SHIXINGYA: http://www.qtcn.org/bbs/read-htm-tid-65581.html(8个月前)

  • 振星: 您好,我直接编译您的代码,在release下编译遇到该问题: g++: error: unrecognized command line option '-Wl' 我的环境是Qt 4.8.6,使用mingw编译的。请问我是否还有什么没有地方没有设置正确呢?(3年前#6楼)收起回复

  • 叹逍遥回复 振星: http://stackoverflow.com/questions/22282871/unrecognized-command-line-option-wi http://stackoverflow.com/questions/21305309/g-doesnt-recognize-the-option-wl 我也碰到了,将那三行加入工程后release编译报错,根据第二篇讨论的答案,我去掉-Wl之后编译OK,后面又实验了下-Wl后面加逗号也可以并且两种编译出的exe md5一样,不知道实际编译-Wl参数到底有没有进去,不过感觉后面加逗号应该妥当一点 QMAKE_LFLAGS_RELEASE = -mthreads -Wl, 或者 QMAKE_LFLAGS_RELEASE = -mthreads(1年前)
  • fanweimianA: 命令执行完成后,根据步骤2中获得的crash堆栈信息在aaa.asm中查找响应地址,即可得到崩溃具体位置 能否做个说明,是怎么找到具体位置的,log文件,asm文件我都有了,不知道怎么看,谢谢(4年前#5楼)收起回复举报回复

  • 叹逍遥回复 叹逍遥: 上面两段分别是记录的crash日志和dump出的asm, Exception Addr: 00401E20 说明代码地址00401E20出发生异常,Write Address: 00000000说明异常的时候正在访问0x00000000内存地址,对比asm中00401E20处,正好是博主构造的对空指针进行写入的异常处。剩下的Registers和Call Stack保存了现场的寄存器和堆栈信息。 不过有个问题是这东西release版本带着调试信息发布,很容易被人看出源码,不过自己写的小程序无所谓了 末尾感谢博主的分享!(1年前)
    • 叹逍遥回复 fanweimianA: 虽然时间挺久了,但是自己折腾了好长时间忍不住回复一下: Exception Addr: 00401E20 Module: D:\QT\build-TestCrash-Desktop_Qt_5_8_0_MinGW_32bit-Release\release\TestCrash.exe Exception Code: C0000005 Write Address: 00000000 Instruction: C7 05 00 00 00 00 00 00 00 00 0F 0B 90 90 90 90 Registers: EAX: 00000000 EBX: 00000000 ECX: 0077FE04 EDX: 00000000 ESI: 0077D428 EDI: 0077FE04 ESP: 0077D31C EBP: 0077D408 EIP: 00401E20 EFlags: 00010246 Call Stack: 00401E20 D:\QT\build-TestCrash-Desktop_Qt_5_8_0_MinGW_32bit-Release\release\TestCrash.exe 620C2D1F C:\Qt\5.8\mingw53_32\bin\Qt5Widgets.dll void Dialog::on_btnTestCrash_clicked() { int *p = NULL; *p = 4; 401e20: c7 05 00 00 00 00 00 movl $0x0,0x0 401e27: 00 00 00 401e2a: 0f 0b ud2 401e2c: 90 nop 401e2d: 90 nop 401e2e: 90 nop 401e2f: 90 nop 00401e30 &lt;__ZL7sprintfPcPKcz&gt;: }(1年前)

  • sunlj181: 你好。这个信息时怎么对应的?(4年前#4楼)

  • aiolia0122: 命令执行完成后,根据步骤2中获得的crash堆栈信息在aaa.asm中查找响应地址,即可得到崩溃具体位置 能否做个说明,是怎么找到具体位置的,log文件,asm文件我都有了,不知道怎么看,谢谢(4年前#3楼)

  • 资深码农: 1.mingw 2.mingw下生成的符号和应用程序文件是一起的;通过objdump命令可以产生出符号文件;例如: objdump -s a.exe &gt;a.asm(4年前#2楼)

  • yanan_gd: 你好,问两个问题 1.你给的这个demo的编译环境是什么,mingw还是msvs? 2.步骤1中的生成的符号文件在哪里? 谢谢(4年前#1楼)收起回复

    • 资深码农回复 yanan_gd: 1.mingw 2.mingw下生成的符号和应用程序文件是一起的;通过objdump命令可以产生出符号文件;例如: objdump -s a.exe &gt;a.asm(4年前)

 

--------------------- 
作者:资深码农 
来源:CSDN 
原文:https://blog.csdn.net/lanhy999/article/details/12189375 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt程序crash信息的捕捉与跟踪(qt-mingw) 的相关文章

随机推荐

  • 数据湖与数据仓库区别

    数据湖是近两年中比较新的技术在大数据领域中 对于一个真正的数据湖应该是什么样子 现在对数据湖认知还是处在探索的阶段 像现在代表的开源产品有iceberg hudi Delta Lake 那对于数据湖应该是什么样子 先来看数据湖的作者AWS来
  • Ubuntu 访问共享文件夹

    最近刚刚重装了 Ubuntu 18 04 版本 然后又要来一遍共享文件夹的事情了 摘自 关于ubuntu下访问windows的共享目录 假定您的网络连接已经正确设定好 网络主机的 IP 192 168 0 1 网络主机的使用者名称 myus
  • 论文阅读《LGPMA:Complicated Table Structure Recognition with Local and Global Pyramid Mask Alignment》

    摘要 表格识别是一项很有挑战的任务 以前的方法从不同粒度的元素 行 列 文本区域 开始处理问题 这从某种程度上有损启发式规则 忽略了空细胞分裂等问题 基于表结构特征 我们发现获取文本区域的对齐bounding box可以有效地保持不同单元格
  • Intellij IDEA 导入 eclipse web 项目详细操作

    Eclipse当中的web项目都会有这两个文件 但是idea当中应该是没有的 所以导入会出现兼容问题 但是本篇文章会教大家如何导入 并且导入过后还能使用tomcat运行 文章尽可能以图片的形式进行演示 我的idea使用的版本是2022 3
  • UE4_读写内容到文本文件

    1 新建一个c 文件 类型为BlueprintFunctionLibrary RWTextFile h Fill out your copyright notice in the Description page of Project Se
  • 谷歌云计算技术基础架构,谷歌卷积神经网络

    谷歌开源了TensorFlow 世界就要马上被改变了吗 Google开源了其第二代深度学习技术TensorFlow 被使用在Google搜索 图像识别以及邮箱的深度学习框架 这在相关媒体圈 工程师圈 人工智能公司 人工智能研究团队里有了一些
  • ajax调用java程序,从微信小程序到鸿蒙JS开发-JS调用Java

    除轻量级智能穿戴设备 现鸿蒙支持的手机 汽车 TV 手表 平板等属于富鸿蒙 在JS语言的项目中也有Java模块 并提供了JS跨语言调用Java方法的技术 现需要实现查看商品评论时 统计出长评 中评和短评的比例 这里将评论数据请求来后调用Ja
  • linux下内核态锁与用户态锁详细介绍

    1 内核态下锁 1 1 spinlock t spinlock t成为自旋锁 它用在临界区代码非常少的情况下 自旋锁不会引起调用者睡眠 如果自旋锁已经被别的执行单元保持 调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁 如果释放了该
  • 播放声音

    声音类型 load 上料 switchs 换装 changes 换程 private enum Sound load switchs changes SoundPlayer sp new SoundPlayer
  • 在.NET中杀死Word,Excel等进程

    下面的方法可以直接调用 private void KillProcess string processName System Diagnostics Process myproc new System Diagnostics Process
  • 【Learning RAW-to-sRGB Mappings with Inaccurately Aligned Supervision通过不准确对齐的监督学习 RAW 到 sRGB 的映射】

    摘要 学习 RAW 到 sRGB 映射近年来引起了越来越多的关注 其中训练输入的原始图像以模仿另一台相机捕获的目标 sRGB 图像 然而 严重的颜色不一致使得生成输入原始和目标 sRGB 图像的良好对齐训练对非常具有挑战性 虽然使用不准确对
  • 解决java解析XML文件时的“伪属性名称”问题

    解决java解析XML文件时的 伪属性名称 问题 一定是xml文件写错了格式
  • apk部分手机安装失败_安卓手机安装软件失败的4种常见原因和解决办法

    安卓手机安装软件是普通人都会做的事情 不过这也是有可能会出现问题的 比如安卓手机安装软件失败了 这要怎么解决 安卓手机安装软件失败是一些新手用户可能会遇到的问题 虽然有很多方面的原因 不过大体上分为软件和硬件2种情况 下面就整理一些解决方法
  • Unity初学者对物体移动的总结

    Unity小白笔记文章 请大家多多指教 关于Unity3D控制物体移动的常用方法 首先控制物体移动即控制物体的空间坐标变化 在这里首先我们要知道Input输入事件 一般大家先想到的都是按一个按键去控制物体移动 Unity里也给我们提供了这种
  • Web前端之如何描述自己做过的项目

    在面试时 经过寒暄后 一般面试官会让介绍项目经验 常见的问法是 说下你最近的 或最拿得 出手的 一个项目 根据我们的面试经验 发现有不少候选人对此没准备 说起来磕磕巴巴 甚至有人说出项目经验从时间 段或技术等方面和简历上的不匹配 这样就会造
  • Unity 弓箭射靶游戏实践

    一 实现思路 根据之前的飞碟工厂进行改变 在射出弓箭手上没有弓箭之后重新生成新的弓箭 并将射出的弓箭在一定时间后进行回收 在右下角通过小窗口展示靶子的情况 射中不同的环数给予不同得分 二 主要涉及技术 物理引擎的使用 游戏对象的生产与回收
  • 关于autorelease pool一个较好的理解

    如果你能够真正的理解autorelease 那么你才是理解了Objective c的内存管理 Autorelease实际上只是把对release的调用延迟了 对于每一个Autorelease 系统只是把该Object放入了当前的Autore
  • 第二十三章 模块代码编写基础

    模块的创建 python中的所有 py文件都能做为模块 模块文件名 模块的命名应该遵循一般变量名的命名规则 模块的使用 import语句 import语句直接列出一个或多个需要加载的模块的名称 以逗号分隔 因为它用一个名称引用整个模块 im
  • Docker配置本地镜像与容器的存储位置

    使用find命令找到大于指定大小的文件 find type f size 10G 排除某个目录 find path media xww type f size 10G 修改Docker本地镜像与容器的存储位置的方法 方法一 软链接 默认情况
  • Qt程序crash信息的捕捉与跟踪(qt-mingw)

    在用qt编写程序时经常会遇到崩溃问题 如果抓取不到crash堆栈信息就会对崩溃问题束手无策 只能对其进行复现 推断 目录 一般解决crash问题时有如下步骤 如何执行以上3步骤 下面我详细介绍如何操作 步骤1 步骤2 步骤3 网友评论 一般