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

2024-06-08 01:58

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

 

 

 

 

这篇关于Qt程序crash信息的捕捉与跟踪(qt-mingw)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1040921

相关文章

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线