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

在用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 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 

 

 

  • 2
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Qt是一个跨平台的C++应用程序开发框架。"qt-opensource-windows-x86-mingw530"是Qt在Windows操作系统下的一个版本,使用Mingw530编译器。下载这个版本主要有以下几个步骤: 1. 打开Qt官方网站(qt.io)的下载页面。 2. 在下载页面中,找到并点击进入“Qt 开源”部分。 3. 在“Qt 开源”页面中,找到并点击“下载 Qt”按钮。 4. 在下载页面中,选择Windows操作系统,并在架构选择栏中选择x86。 5. 在编译器选择栏中,选择Mingw530编译器。 6. 选择好操作系统、架构和编译器后,点击“下载”按钮。 7. 下载完成后,双击下载的安装程序,按照提示进行安装。 8. 安装完成后,可以在Windows系统中找到已安装的Qt版本,并开始使用。 下载Qt的目的是为了能够在Windows操作系统下使用Qt进行C++应用程序的开发。Qt提供了丰富的功能和工具,可以简化开发过程,提高开发效率。通过下载和安装"qt-opensource-windows-x86-mingw530"版本,您可以在Windows系统中使用Mingw530编译器来编译和运行Qt应用程序。这个版本的Qt是开源的,意味着您可以自由地使用和修改它。无论是开发图形界面还是网络应用,Qt都具备强大的功能和良好的跨平台性能,是一个非常优秀的开发框架。 ### 回答2: qt-opensource-windows-x86-mingw530 是一个开源的 Qt 框架,适用于 Windows 操作系统。它基于 MinGW 编译器版本 5.3.0,提供了一个开发环境,用于构建跨平台的应用程序。 首先,要下载 qt-opensource-windows-x86-mingw530,可以打开 Qt 官方网站。在下载页面上,找到与你的操作系统相对应的版本。点击下载按钮后,会跳转到加载包的页面。根据你的网络速度,下载可能需要一些时间。 下载完毕后,可以双击安装程序运行。安装程序将会提供一些自定义选项,如选择安装路径和组件。根据你的需要进行选择,并点击下一步继续安装。然后等待安装程序完成安装过程。 安装完成后,你可以在指定的安装路径中找到 Qt 框架的文件。可以在安装目录中找到示例项目和文档,帮助你快速上手。另外,Qt Creator 是一个集成开发环境,也会在安装过程中一并安装。 当安装完成后,你可以开始使用 Qt 开发环境。启动 Qt Creator,并创建一个新项目。选择适当的项目模板,并按照向导填写项目信息。然后可以开始编写代码和设计用户界面。 总的来说,下载和安装 qt-opensource-windows-x86-mingw530 是比较简单的。只需要前往 Qt 官方网站,选择合适的版本进行下载并按照安装程序的指示进行安装即可。接下来,你可以使用 Qt Creator 创建和开发各种跨平台的应用程序。 ### 回答3: 要下载qt-opensource-windows-x86-mingw530,首先需要访问Qt官方网站。然后,在网站的下载页面找到适用于Windows操作系统的Qt版本。选择"open source"(开源)版本,因为它是免费提供的。接下来,找到合适的Windows x86(32位)版本并点击下载按钮。 在下载页面中,你可能需要选择适用于MinGW530的版本。MinGW是一个允许在Windows上使用GCC编译器的开发工具集。在选择合适的版本后,点击下载按钮开始下载。 下载的文件通常是一个压缩文件,你需要解压缩它。找到下载文件,并使用解压缩工具(如WinRAR或7-Zip)将其解压缩到任意目录中。 解压缩后,你可以进入Qt的安装目录并找到Qt的执行文件(如qmake.exe)。双击运行该文件,它将指导你完成Qt的安装过程。 安装完成后,你就可以开始使用Qt进行开发了。打开Qt Creator(Qt的集成开发环境)并开始新的项目,或者打开已有的项目。在项目设置中,确保你选择了正确的编译器(MinGW530)。 总的来说,下载和安装qt-opensource-windows-x86-mingw530需要访问Qt官方网站、选择合适的版本、下载、解压缩并安装Qt。完成这些步骤后,你就可以开始使用Qt进行Windows x86平台上的开发了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值