QT--崩溃原因分析

本文为学习记录,若有错误,请联系作者,谦虚受教。

文章目录

  • 前言
  • 一、目的
  • 二、实现步骤
    • 1 add2line.exe
    • 2 分析文件
    • 3 crash文件
  • 三、相关代码
    • 1 pro文件
    • 2.ccrashstack.h
    • 3.ccrashstack.cpp
    • 4.main.cpp
  • 总结


前言

你从来来去自由,若你不想要了跑开便是。


一、目的

发布的客户版本里分析崩溃原因,便于解决问题。

二、实现步骤

1 add2line.exe

在自己QT安装的目录下,例如:D:\Qt\Qt5.12.3\Tools\mingw730_32\bin,找到adde2line.exe。
在这里插入图片描述
将add2line.exe复制到自己发布的版本中。
在这里插入图片描述

2 分析文件

在代码里添加一个类和发布版本所在文件夹里添加addr2line.exe,后续程序崩溃后,会在工程文件中,代码生成一个MyApp文件夹,里面包含一个crash文件
在这里插入图片描述
在这里插入图片描述

3 crash文件

打开crash文件,找到自己addr。
在这里插入图片描述
打开QT的cmd,进入自己发布版本的路径。例如
1、cd D:\TEST\1QTTEST\Thermopile_HM\32X32\Client\V1.0.1Client\release
2、addr2line.exe -f -e 软件文件名 crash崩溃地址 (提示:中间要空格)
3、提示错误信息
在这里插入图片描述

三、相关代码

1 pro文件

在pro文件添加以下代码:

QMAKE_CFLAGS_RELEASE += -g
QMAKE_CXXFLAGS_RELEASE += -g
QMAKE_CFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE -= -O2
QMAKE_LFLAGS_RELEASE = -mthreads -W

2.ccrashstack.h

#ifndef CCRASHSTACK_H
#define CCRASHSTACK_H
#include <windows.h>
#include <QString>class ccrashstack
{
private:PEXCEPTION_POINTERS m_pException;
private:QString GetModuleByRetAddr(PBYTE Ret_Addr, PBYTE & Module_Addr);QString GetCallStack(PEXCEPTION_POINTERS pException);QString GetVersionStr();bool GetHardwareInaformation(QString &graphics_card, QString &sound_deivce);
public:ccrashstack(PEXCEPTION_POINTERS pException);QString GetExceptionInfo();
};#endif // CCRASHSTACK_H

3.ccrashstack.cpp

#include "ccrashstack.h"
#include <tlhelp32.h>
#include <stdio.h>#define _WIN32_DCOM
#include <comdef.h>
#include <Wbemidl.h>//#include<base/constants.h>
#include "qdebug.h"ccrashstack::ccrashstack(PEXCEPTION_POINTERS pException)
{m_pException = pException;
}QString ccrashstack::GetModuleByRetAddr(PBYTE Ret_Addr, PBYTE & Module_Addr)
{MODULEENTRY32   M = {sizeof(M)};HANDLE  hSnapshot;wchar_t Module_Name[MAX_PATH] = {0};hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0);if ((hSnapshot != INVALID_HANDLE_VALUE) &&Module32First(hSnapshot, &M)){do{if (DWORD(Ret_Addr - M.modBaseAddr) < M.modBaseSize){lstrcpyn(Module_Name, M.szExePath, MAX_PATH);Module_Addr = M.modBaseAddr;break;}} while (Module32Next(hSnapshot, &M));}CloseHandle(hSnapshot);QString sRet = QString::fromWCharArray(Module_Name);return sRet;
}QString ccrashstack::GetCallStack(PEXCEPTION_POINTERS pException)
{PBYTE   Module_Addr_1;char bufer[256]={0};QString sRet;typedef struct STACK{STACK * Ebp;PBYTE   Ret_Addr;DWORD   Param[0];} STACK, * PSTACK;STACK   Stack = {0, 0};PSTACK  Ebp;if (pException)     //fake frame for exception address{Stack.Ebp = (PSTACK)pException->ContextRecord->Ebp;Stack.Ret_Addr = (PBYTE)pException->ExceptionRecord->ExceptionAddress;Ebp = &Stack;}else{Ebp = (PSTACK)&pException - 1;  //frame addr of Get_Call_Stack()// Skip frame of Get_Call_Stack().if (!IsBadReadPtr(Ebp, sizeof(PSTACK)))Ebp = Ebp->Ebp;     //caller ebp}// Break trace on wrong stack frame.for (; !IsBadReadPtr(Ebp, sizeof(PSTACK)) && !IsBadCodePtr(FARPROC(Ebp->Ret_Addr));Ebp = Ebp->Ebp){// If module with Ebp->Ret_Addr found.memset(bufer,0, sizeof(0));sprintf(bufer, "\n%08X  ", (unsigned int)Ebp->Ret_Addr);sRet.append(bufer);QString moduleName = this->GetModuleByRetAddr(Ebp->Ret_Addr, Module_Addr_1) ;if (moduleName.length() > 0){sRet.append(moduleName);}}return sRet;
} //Get_Call_StackQString ccrashstack::GetVersionStr()
{OSVERSIONINFOEX V = {sizeof(OSVERSIONINFOEX)};  //EX for NT 5.0 and laterif (!GetVersionEx((POSVERSIONINFO)&V)){ZeroMemory(&V, sizeof(V));V.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);GetVersionEx((POSVERSIONINFO)&V);}if (V.dwPlatformId != VER_PLATFORM_WIN32_NT)V.dwBuildNumber = LOWORD(V.dwBuildNumber);  //for 9x HIWORD(dwBuildNumber) = 0x04xxQString sRet;sRet.append(QString("Windows:  %1.%2.%3, SP %4.%5, Product Type %6\n").arg(V.dwMajorVersion).arg(V.dwMinorVersion).arg(V.dwBuildNumber).arg(V.wServicePackMajor).arg(V.wServicePackMinor).arg(V.wProductType));//        QString graphics_module = "GraphicsCard: ";
//        QString sound_module = "SoundDevice: ";
//        GetHardwareInaformation(graphics_module, sound_module);
//        sRet.append(graphics_module);
//        sRet.append(sound_module);return sRet;
}QString ccrashstack::GetExceptionInfo()
{WCHAR       Module_Name[MAX_PATH];PBYTE       Module_Addr;QString sRet;char buffer[512]={0};QString sTmp = GetVersionStr();sRet.append(sTmp);sRet.append("Process:  ");GetModuleFileName(NULL, Module_Name, MAX_PATH);sRet.append(QString::fromWCharArray(Module_Name));sRet.append("\n");// If exception occurred.if (m_pException){EXCEPTION_RECORD &  E = *m_pException->ExceptionRecord;CONTEXT &           C = *m_pException->ContextRecord;memset(buffer, 0, sizeof(buffer));sprintf(buffer, "Exception Addr:  %08X  ", (int)E.ExceptionAddress);sRet.append(buffer);// If module with E.ExceptionAddress found - save its path and date.QString module = GetModuleByRetAddr((PBYTE)E.ExceptionAddress, Module_Addr);if (module.length() > 0){sRet.append(" Module: ");sRet.append(module);}memset(buffer, 0, sizeof(buffer));sprintf(buffer, "\nException Code:  %08X\n", (int)E.ExceptionCode);sRet.append(buffer);if (E.ExceptionCode == EXCEPTION_ACCESS_VIOLATION){// Access violation type - Write/Read.memset(buffer, 0, sizeof(buffer));sprintf(buffer,"%s Address:  %08X\n",(E.ExceptionInformation[0]) ? "Write" : "Read", (int)E.ExceptionInformation[1]);sRet.append(buffer);}sRet.append("Instruction: ");for (int i = 0; i < 16; i++){memset(buffer, 0, sizeof(buffer));sprintf(buffer, " %02X",  PBYTE(E.ExceptionAddress)[i]);sRet.append(buffer);}sRet.append("\nRegisters: ");memset(buffer, 0, sizeof(buffer));sprintf(buffer, "\nEAX: %08X  EBX: %08X  ECX: %08X  EDX: %08X",  (unsigned int)C.Eax,(unsigned int) C.Ebx, (unsigned int)C.Ecx, (unsigned int)C.Edx);sRet.append(buffer);memset(buffer, 0, sizeof(buffer));sprintf(buffer, "\nESI: %08X  EDI: %08X  ESP: %08X  EBP: %08X", (unsigned int)C.Esi, (unsigned int)C.Edi, (unsigned int)C.Esp, (unsigned int)C.Ebp);sRet.append(buffer);memset(buffer, 0, sizeof(buffer));sprintf(buffer, "\nEIP: %08X  EFlags: %08X", (unsigned int)C.Eip,(unsigned int) C.EFlags);sRet.append(buffer);} //if (pException)sRet.append("\nCall Stack:");QString sCallstack = this->GetCallStack(m_pException);sRet.append(sCallstack);return sRet;
}

4.main.cpp

int main(int argc, char *argv[])
{QApplication a(argc, argv);SetUnhandledExceptionFilter(callback);MainWindow w;w.show();return a.exec();
}

总结

善于总结,多进一步。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型时代,如何重塑AI人才的培养?知名高校专家为您解答

当下&#xff0c;随着人工智能技术的快速发展&#xff0c;大模型已经成为了人工智能发展的新方向&#xff0c;同时也对新时代AI人才的需求和培养带来了新的思考与挑战&#xff0c;需要结合当下社会对复合型AI人才的需求进行新思考&#xff0c;创新AI人才培养模式&#xff0c;以…

【ARM64 常见汇编指令学习 15 -- ARM 标志位的学习】

文章目录 ARM 标志位介绍Zero Condition flag(零标志位)零标志位判断实例 上篇文章&#xff1a;ARM64 常见汇编指令学习 14 – ARM 汇编 .balign,.balignw,.balign 伪指令学习 下篇文章&#xff1a;ARM64 常见汇编指令学习 16 – ARM64 SMC 指令 ARM 标志位介绍 在ARM架构中&am…

深度对话|如何设计合适的网络经济激励措施

近日&#xff0c;我们与Mysten Labs的首席经济学家Alonso de Gortari进行了对话&#xff0c;讨论了如何在网络运营商和参与者之间找到激励措施的平衡&#xff0c;以及Sui的经济如何不断发展。 是什么让您选择将自己的经济学背景应用于区块链和Web3领域&#xff1f; 起初&…

YOLO相关原理(文件结构、视频检测等)

超参数进化(hyperparameter evolution) 超参数进化是一种使用了genetic algorithm&#xff08;GA&#xff09;遗传算法进行超参数优化的一种方法。 YOLOv5的文件结构 images文件夹内的文件和labels中的文件存在一一对应关系 激活函数&#xff1a;非线性处理单元 activation f…

爬虫014_文件操作_打开关闭_读写_序列化_反序列化---python工作笔记033

报错,没有指定路径,没有指定路径无法创建文件 这样可以在当前目录下创建一个可写的文件 可以看到找到刚才生成的文件,看看内容

探讨uniapp的navigator 页面跳转问题

navigator 页面跳转。该组件类似HTML中的<a>组件&#xff0c;但只能跳转本地页面。目标页面必须在pages.json中注册。 "tabBar": {"color": "#7A7E83","selectedColor": "#3cc51f","borderStyle": "bl…

SpringMVC的架构有什么优势?——控制器(三)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

走进知识图谱(二)【世界知识图谱篇】知识表示的经典模型与平移模型及基于复杂关系建模的知识表示学习

上篇文章提到&#xff0c;该系列文章将主要围绕世界知识图谱和语言知识图谱这两大类知识图谱进行展开&#xff0c;并且提到知识图谱的主要研究包括了知识表示学习、知识自动获取和知识的推理与应用三大部分。今天主要介绍世界知识图谱的知识表示学习&#xff0c;其中包括经典的…

uniapp 左右滑动切换页面并切换tab

实现效果如图 要实现底部内部的左右滑动切换带动上方tab栏的切换&#xff0c;并且下方内容要实现纵向滚动 &#xff0c;所以需要swiper&#xff0c;swiper-item,scroll-view组合使用 tab栏部分 <view class"tabs"><view class"tab_item" v-for&…

完成图像反差处理

bmp图像的前54字节为图像头&#xff0c;第19个字节开始4字节为图像宽&#xff0c;第23字节开始4字节为图像高&#xff0c;图像大小为&#xff1a;972*720*3542099574&#xff0c;为宽*高*像素点头&#xff0c;如下&#xff1a; 图像的反差处理

⌈算法进阶⌋图论::并查集——快速理解到熟练运用

目录 一、原理 1. 初始化Init 2. 查询 find 3. 合并 union 二、代码模板 三、练习 1、 990.等式方程的可满足性&#x1f7e2; 2、 1061. 按字典序排列最小的等效字符串&#x1f7e2; 3、721.账户合并 &#x1f7e1; 4、 839.相似字符串组&#x1f7e1; 5、 2812.找出最安全…

智能优化算法:猎豹优化算法-附代码

智能优化算法&#xff1a;猎豹优化算法 文章目录 智能优化算法&#xff1a;猎豹优化算法1.猎豹优化算法1.1 初始化1.2 搜索策略1.3坐等策略1.4攻击策略 2.实验结果3.参考文献4.Matlab5.python 摘要&#xff1a;CO算法是Mohammad AminAkbari等人于2022年受自然界猎豹狩猎启发而提…

JUL 日志 - 最简单易用的Java日志框架

在正式的生产环境下是不能使用 System.out 进行日志记录的 因为 System.out 不能提供时间、线程、执行过程 等信息&#xff0c;如果要手动打印输出则会非常麻烦 而日志就帮我们把这些事给干了 接下来我们学一个最简单的日志框架 JUL JUL全称Java util Logging是java原生的日志框…

支付整体架构

5.4 支付的技术架构 架构即未来&#xff0c;只有建立在技术架构设计良好的体系上&#xff0c;支付机构才能有美好的未来。如果支付的技术体系在架构上存在问题&#xff0c;那么就没有办法实现高可用性、高安全性、高效率和水平可扩展性。 总结多年来在海内外支付机构主持和参与…

Nginx负载均衡以及keepalived高可用实验

Vip 10.1.122 Keepalived-master 10.1.1.132Keepalied-backup 10.1.1.133Realserver_1 10.1.1.136Realserver_2 10.1.1.137 四台机器上安装nginx&#xff0c;编译安装的话需要另外安装pcre包支持&#xff0c;安装在/usr/local/nginx Keepalived-master 和backu…

Vue+SpringBoot后台管理系统:Vue3+TypeScript项目搭建(一)

写在开始:一个搬砖程序员的随缘记录文章目录 一、Node安装二、Vue CLI安装三、相关的版本四、创建Vue3TypeScript项目五、Vue项目初始化六、项目启动 一、Node安装 查看Note版本 node -v查看npm版本 npm -v然后将npm升级至最新版本 npm -g install npm将npm下载源换至http:…

项目中使用git vscode GitHubDesktopSetup-x64

一、使用git bash 1.使用git bash拉取gitee项目 1.在本地新建一个文件夹&#xff08;这个文件夹是用来存放从gitee上拉下来的项目的&#xff09; 2.在这个文件夹右键选择 git bash here 3.输入命令 git init (创建/初始化一个新的仓库) 4.输入命令 git remote add origin …

生成式人工智能模型:提升营销分析用户体验

使用生成式人工智能来改善分析体验&#xff0c;使业务用户能够询问有关我们数据平台中可用数据的任何信息。 在本文中&#xff0c;我们将解释如何使用新的生成式人工智能模型 ( LLM ) 来改善业务用户在我们的分析平台上的体验。假设我们为零售销售经理提供 Web 应用程序或移动应…

【问题解决】Git命令行常见error及其解决方法

以下是我一段时间没有使用xshell&#xff0c;然后用git命令行遇到的一些系列错误和他们的解决方法 遇到了这个报错&#xff1a; fatal: Not a git repository (or any of the parent directories): .git 我查阅一些博客和资料&#xff0c;可以解决的方式&#xff1a; git in…

迅镭激光PL12050重载型激光切管机中标国内知名企业美的集团!

近日&#xff0c;迅镭激光重型激光切管机中标国内知名企业——美的集团! 成立于2002年的菱王电梯&#xff0c;是美的集团暖通与楼宇事业部旗下的专业电梯品牌 &#xff0c;业务覆盖电(扶)梯的研发、设计、制造、销售、安装和维保&#xff0c;自主研发的8m/s超高速电梯和8吨超重…