Qt_vc++崩溃日志分析

环境

Clion :2019.3.6

Qt :5.9.6(vc++2015)

编译工具:vs2015 update3

崩溃日志收集

自行百度,会查到很多,一下代码仅供参考(来自https://blog.csdn.net/weixin_45571586/article/details/128697309)

#ifndef OUTPUTDUMP_H   //避免同一个文件只会被包含一次
#define OUTPUTDUMP_H//#pragma once         //避免同一个文件只会被包含一次
#include"ccrashstack.h"
#include <shlobj.h>
#include <QDebug>
#include <DbgHelp.h>
#include <QDateTime>
#pragma comment(lib, "dbghelp.lib")  //使用注释方式引入库dbghelp.lib或编译目录。/*------------------生成dump文件------------------------*/
LONG crashHandler(EXCEPTION_POINTERS *pException)
{QString curDataTime = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");QString dumpName = curDataTime + ".dmp";HANDLE dumpFile = CreateFile((LPCWSTR)QString("./" + dumpName).utf16(),GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if(dumpFile != INVALID_HANDLE_VALUE){MINIDUMP_EXCEPTION_INFORMATION dumpInfo;dumpInfo.ExceptionPointers = pException;dumpInfo.ThreadId = GetCurrentThreadId();dumpInfo.ClientPointers = TRUE;MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),dumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);CloseHandle(dumpFile);}else{qDebug() << "dumpFile not vaild";}return EXCEPTION_EXECUTE_HANDLER;
}//防止CRT(C runtime)函数报错可能捕捉不到
void DisableSetUnhandledExceptionFilter()
{void* addr = (void*)GetProcAddress(LoadLibrary(L"kernel32.dll"), "SetUnhandledExceptionFilter");if(addr){unsigned char code[16];int size = 0;code[size++] = 0x33;code[size++] = 0xC0;code[size++] = 0xC2;code[size++] = 0x04;code[size++] = 0x00;DWORD dwOldFlag, dwTempFlag;VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);}
}#endif // OUTPUTDUMP_H
#ifndef OUTPUTLOG_H
#define OUTPUTLOG_H  //避免同一个文件不会被包含多次 条件编译 满足一定条件下才会被编译//#pragma once       //避免同一个文件不会被包含多次
#include <QDir>
#include <QFile>
#include <QMutex>
#include <QTextStream>
#include <QTime>#include"ccrashstack.h"/*---------------打日志文件----------------------*/
void outputMessage(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{static QMutex mutex;mutex.lock();QString text;switch(type){case QtDebugMsg:text = QString("Debug:");break;case QtWarningMsg:text = QString("Warning:");break;case QtCriticalMsg:text = QString("Critical:");break;case QtFatalMsg:text = QString("Fatal:");}QString context_info = QString("File:(%1) Line:(%2)").arg(QString(context.file)).arg(context.line);QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");QString current_date = QString("(%1)").arg(current_date_time);QString message = QString("%1 \r\n%2 %3 \r\n%4").arg(current_date).arg(text).arg(context_info).arg(msg);//判断文件夹是否存在,不存在新建QString aFile = QDir::currentPath() + "/LogFile";QDir dir(aFile);if(!dir.exists()){dir.mkdir(aFile);//只创建一级子目录,即必须保证上级目录存在}QString current_time = QDateTime::currentDateTime().toString("yyyyMMdd");QFile file(aFile+"/log"+current_time+".txt");file.open(QIODevice::WriteOnly | QIODevice::Append);QTextStream text_stream(&file);text_stream << message << "\r\n \r\n";file.flush();file.close();mutex.unlock();
}
#endif // OUTPUTLOG_H
#include "mainwindow.h"
#include <QApplication>
#include"outputDump.h" //生成dump头文件
#include"outputLog.h"  //生成日志头文件int main(int argc, char *argv[])
{/*-------1、注冊异常捕获函数 生成.dmp文件--------*/SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)crashHandler);DisableSetUnhandledExceptionFilter();QApplication a(argc, argv);/*-------2、注册MessageHandler 生成日志文件--------*/qInstallMessageHandler(outputMessage);MainWindow w;w.show();return a.exec();
}

编译输出PDB文件

在这里插入图片描述

在这里插入图片描述

WinDbg

分析崩溃日志非关键在于,崩溃日志(dmp)文件一定要与pdb文件匹配,否则很难分析到有用信息

在这里插入图片描述

将崩溃日志拖入WinDbg中,设置pdb路径

输入:.ecxr 命令

在这里插入图片描述

输入:kn 命令

在这里插入图片描述

可以看到崩溃时,函数调用栈的信息了,通过上下文分析可以定位到崩溃具体出现的位置。

如果在开发环境中,有时可以定位到源码,非常方便。

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

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

相关文章

蓝桥杯-特殊日期

代码及思路详解 #include <iostream> using namespace std; int func(int n) {int sum0; while(n){sumn%10;n/10;//d得到每一位的数 }return sum; } int main() {int count0;int year,month,days[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};for(year1900;year<999…

2024年腾讯云学生服务器优惠价格、续费和购买流程

腾讯云学生服务器优惠活动「云校园」轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年&#xff0c;轻量应用服务器4核8G配置112元3个月、352.8元6个月、646.8元一年&#xff0c;CVM云服务器2核4G3M公网带宽配置842.4元一年&#xff0c;腾讯云服务器网txyfwq.com分享2…

Windows系统下载安装Plex媒体服务结合内网穿透远程访问本地影音文件

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

SortedMap、NavigableMap、TreeMap介绍和使用

SortedMap、NavigableMap、TreeMap介绍和使用 SortedMap接口&#xff1a;SortedMap是一个接口&#xff0c;继承自Map接口&#xff0c;它定义了对键值对按照键的自然顺序或自定义顺序进行排序的功能。SortedMap中的键值对是按照键的顺序排列的&#xff0c;因此可以根据键的顺序…

【原创教程】汇川PLC气缸手动功能块(入门版)制作流程

1、首先在软件中的功能块鼠标右击,选择新建(如下图所示)。 2、弹出一个对话框 ,给功能块命名 ,然后确定(如下图所示)。 3、功能块(FB)中会多一个气缸手动功能块、双击进入(如下图所示)。 4、然后在功能块(FB)右边上方编辑栏定义手动所需变量(如下图所示)。 5…

C#快速入门基础

本篇文章从最基础的C#编程开始学习&#xff0c;经过非常优秀的面向对象编程思想和方法的学习&#xff0c;为C#编程打下基础。 第 01 章 C#开发环境之VS使用和.NET平台基础 1.1 Visual Studio 开发环境 1.1.1 硬件环境 i5CPUi5CPU&#xff08;建议 4核 4线程或以上 &#xff0…

Python打印输出Linux中最常用的linux命令之示例

一、Linux中的~/.bash_history文件说明&#xff1a; 该文件保存了linux系统中运行过的命令的历史。使用该文件来获取命令的列表&#xff0c;并统计命令的执行次数。统计时&#xff0c;只统计命令的名称&#xff0c;以不同参数调用相同的命令也视为同一命令。 二、示例代码&am…

RUST 每日一省:rust logo收集

rust的logo集合&#xff0c;看看有没有你喜欢的&#xff0c;挑一个吧&#xff1b; GitHub - XuHugo/rust-logo: Collection of logo images for all rust languages 下边只是挑选了几个&#xff0c;更多的还是看github吧。

matplotlib-折线图

日期&#xff1a;2024.03.12 内容&#xff1a;将matplotlib的常用方法做一个记录&#xff0c;方便后续查找。 基本使用 # demo01 from matplotlib import pyplot as plt # 设置图片大小,也就是画布大小 fig plt.figure(figsize(20,8),dpi80)#图片大小&#xff0c;清晰度# 准…

一体式以电折水智能终端:化繁为简,智能八合一

一体式以电折水智能终端通过高度集成化设计&#xff0c;巧妙融合了空气开关、开关电源、隔离变压器、接触器、智能电表、RTU、4G通信模块、定位模块等八大核心功能&#xff0c;不仅展现了经济高效和智能运维的双重优势&#xff0c;更以其超强的安全防护能力确保了使用的高度安全…

【刷题节】美团2024年春招第一场笔试【技术】

1.小美的平衡矩阵 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int[][] nums new int[n][n], sum new int[n][n];char[] chars;for (int i 0; i < n; i) {…

线上会议大厅应该具备哪些功能,线上会议大厅搭建要注意什么

引言&#xff1a; 随着互联网和信息技术的不断发展&#xff0c;线上会议大厅逐渐成为各行各业进行会议和交流的重要工具。但是&#xff0c;真正的线上会议大厅必须具备一定的功能和特性&#xff0c;才能满足用户的需求&#xff0c;提升会议体验。 一&#xff0e;线上会议大厅应…