QT笔记——生成dump文件

我们经常会遇到崩溃,此时我们需要定位问题再什么地方,这时候我们就会需要用到dump文件

方式一:

#include "Windows.h"
#include "DbgHelp.h"
#pragma comment(lib, "dbghelp.lib")int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers)
{	QString dmpFileName = QString("%1.dmp").arg(QDateTime::currentDateTime().toString("yyyy_MM_dd_hh_mm_ss"));QString dmpFile = QString("%1/%2").arg(QApplication::applicationDirPath()).arg(dmpFileName);//将QString 转为 const char* HANDLE hDumpFile = CreateFileW(dmpFile .toStdWString().c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);if (hDumpFile != INVALID_HANDLE_VALUE){MINIDUMP_EXCEPTION_INFORMATION dumpInfo;dumpInfo.ThreadId = GetCurrentThreadId();dumpInfo.ExceptionPointers = pExceptionPointers;dumpInfo.ClientPointers = TRUE;// 创建Dump文件MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithDataSegs, pExceptionPointers ? &dumpInfo : nullptr, nullptr, nullptr);CloseHandle(hDumpFile);}return EXCEPTION_EXECUTE_HANDLER;
}LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
{// 这里做一些异常的过滤或提示if (IsDebuggerPresent()){return EXCEPTION_CONTINUE_SEARCH;}return GenerateMiniDump(lpExceptionInfo);
}int main()
{SetUnhandledExceptionFilter(ExceptionFilter);return 0;
}

方式二:

#include "Windows.h"
#include "DbgHelp.h"int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers)
{
// 定义函数指针typedef BOOL(WINAPI* MiniDumpWriteDumpT)(HANDLE,DWORD,HANDLE,MINIDUMP_TYPE,PMINIDUMP_EXCEPTION_INFORMATION,PMINIDUMP_USER_STREAM_INFORMATION,PMINIDUMP_CALLBACK_INFORMATION);// 从 "DbgHelp.dll" 库中获取 "MiniDumpWriteDump" 函数MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL;HMODULE hDbgHelp = LoadLibrary(_T("DbgHelp.dll"));if (NULL == hDbgHelp){return EXCEPTION_CONTINUE_EXECUTION;}pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump");if (NULL == pfnMiniDumpWriteDump){FreeLibrary(hDbgHelp);return EXCEPTION_CONTINUE_EXECUTION;}// 创建 dmp 文件件TCHAR szFileName[MAX_PATH] = { 0 };TCHAR* szVersion = _T("DumpFile");SYSTEMTIME stLocalTime;GetLocalTime(&stLocalTime);wsprintf(szFileName, _T("%s-%04d%02d%02d-%02d%02d%02d.dmp"),szVersion, stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond);HANDLE hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE,FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);if (INVALID_HANDLE_VALUE == hDumpFile){FreeLibrary(hDbgHelp);return EXCEPTION_CONTINUE_EXECUTION;}// 写入 dmp 文件MINIDUMP_EXCEPTION_INFORMATION expParam;expParam.ThreadId = GetCurrentThreadId();expParam.ExceptionPointers = pExceptionPointers;expParam.ClientPointers = FALSE;pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &expParam : NULL), NULL, NULL);// 释放文件CloseHandle(hDumpFile);FreeLibrary(hDbgHelp);return EXCEPTION_EXECUTE_HANDLER;
}LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo)
{// 这里做一些异常的过滤或提示if (IsDebuggerPresent()){return EXCEPTION_CONTINUE_SEARCH;}return GenerateMiniDump(lpExceptionInfo);
}int main()
{SetUnhandledExceptionFilter(ExceptionFilter);return 0;
}

这两种都是差不生成 dump文件 区别在于
第一个是直接调用 dbghelp.lib,然后使用c++实行文件名的形式
第二个是 动态调用 dbghelp.lib,使用QT 实现 文件名的形式

参考博客:
dump文件生成二
dump文件生成一

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

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

相关文章

php建造者模式

一,建造者模式,也叫做生成器模式,是创建设计模式的一种,它能将一个复杂的对象的创建过程分离开来,使你能够分步骤的创建对象。建造者模式也允许你使用相同的建造代码创造出不同类型和形式的对象。 建造者模式一般包括四…

sql 参数自动替换

需求&#xff1a;看日志时&#xff0c;有的sql 非常的长&#xff0c;参数比较多&#xff0c;无法直接在sql 客户端工具执行&#xff0c;如果一个一个的把问号占位符替换为参数太麻烦&#xff0c;因此写个html 小工具&#xff0c;批量替换&#xff1a; 代码&#xff1a; <!…

Spring笔记之Spring对IoC的实现

文章目录 IoC控制反转依赖注入set注入注入外部Bean注入内部Bean注入简单类型通过注入方式实现javax.sql.DateSource接口测试简单类型 级联属性赋值&#xff08;了解&#xff09;注入数组注入List集合注入Set集合注入Map集合注入Properties注入null和空字符串不给属性赋值使用 注…

从零开始学python(十四)百万高性能框架scrapy框架

前言 回顾之前讲述了python语法编程 必修入门基础和网络编程&#xff0c;多线程/多进程/协程等方面的内容&#xff0c;后续讲到了数据库编程篇MySQL&#xff0c;Redis&#xff0c;MongoDB篇&#xff0c;和机器学习&#xff0c;全栈开发&#xff0c;数据分析&#xff0c;爬虫数…

Java多线程面试21题

并行和并发有什么区别&#xff1f; 并行是指两个或者多个事件在同一时刻发生&#xff1b;而并发是指两个或多个事件在同一时间间隔发生。 并行是在不同实体上的多个事件&#xff0c;并发是在同一实体上的多个事件。 在一台处理器上“同时”处理多个任务&#xff0c;在多台处理…

软件测试--一些生命周期

目录 1.需求生命周期 2.开发生命周期 3.测试生命周期 4.缺陷声生命周期 1.需求生命周期 需求生命周期是指在软件测试过程中&#xff0c;需求从提出到最终完成的整个过程。它涵盖了需求的识别、分析、定义、验证和管理等阶段。 需求识别&#xff1a;在此阶段&#xff0c;项目…

Django用户登录验证和自定义验证类

一、FBV 用户登录验证 1.1 登录验证并加入 session 用户登录时&#xff0c;使用 authenticate 验证用户名和密码是否正确&#xff0c;正确则返回一个用户对象。 用户名默认的字段名是 username 密码默认的字段名是 password 将已验证的用户添加到当前会话(session)中&#x…

C++多线程环境下的单例类对象创建

使用C无锁编程实现多线程下的单例模式 贺志国 2023.8.1 一、尺寸较小的类单例对象创建 如果待创建的单例类SingletonForMultithread内包含的成员变量较少&#xff0c;整个类占用的内存空间较小&#xff0c;则可以使用如下方法来创建单例对象&#xff08;如果类的尺寸较大&am…

git常用操作

1、git冲突解决 1.1 找到本次提交的change-id&#xff0c;保存下来。 1.2 使用git reset --soft HEAD^回退到commit前状态 1.3 使用git stash保存当前修订 1.4 从主分支拉取最新代码&#xff0c;例如git pull --rebase origin master 1.5 使用git stash pop把修订弄回来 1.6 手…

新SDK平台下载开源全志D1-H/D1s的SDK

获取SDK SDK 使用 Repo 工具管理&#xff0c;拉取 SDK 需要配置安装 Repo 工具。 Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workflow. Repo is…

C语言的转义字符

转义字符也叫转移序列&#xff0c;包含如下&#xff1a; 转移序列 \0oo 和 \xhh 是 ASCII 码的特殊表示。 八进制数示例&#xff1a; 代码&#xff1a; #include<stdio.h> int main(void) {char beep\007;printf("%c\n",beep);return 0; }结果&#xff1a; …

机器视觉初步14:相机标定原理及应用

相机标定是指通过已知的相机参数&#xff0c;解算相机内部参数矩阵和外部参数矩阵。 文章目录 1.为什么要标定&#xff1f;2.工业场景中常见的标定方法2.1. 使用棋盘格标定板&#xff08;Checkerboard Markers&#xff09;2.2 使用相机自标定2.3. 使用三维物体标定2.4.九孔标…

【Linux】—— 进程的创建和退出

序言&#xff1a; 在上期&#xff0c;我们已经对 Linux的进程的相关知识进行了相关的学习。接下来&#xff0c;我们要学习的便是关于进程控制 的基本知识&#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;进程创建 1、fork函数初识 2、写时拷贝 3、f…

Vue中一个新闻类型的弹框Demo

1.设计弹框组件 首先&#xff0c;创建一个名为NewsPopup的弹框组件&#xff0c;用于显示新闻内容。组件的模板包括一个标题和新闻列表。 <template><div class"news-popup"><h2>{{ title }}</h2><ul><li v-for"news in newsL…

Docker中容器数据卷

容器数据卷 一.什么是容器数据卷二.使用数据卷方式一&#xff1a;直接使用命令来挂载 -v 三.具名和匿名挂载 一.什么是容器数据卷 docker理念 将应用和环境打包成一个镜像&#xff01; 数据&#xff1f;如果数据都在容器中&#xff0c;那么我们的容器删除&#xff0c;数据就会…

【Linux操作系统】Ubuntu和center两个Linux发行版本中指令的区别

Ubuntu和center是Linux的两个发行版本&#xff0c;本文将详细介绍两个发行版的使用命令区别&#xff0c;分析两者的优缺点。 文章目录 常见的区别&#xff1a;细节差异&#xff1a;两个发行版本各自的优点和缺点Ubuntu 的优点&#xff1a;Ubuntu 的缺点&#xff1a;CentOS 的优…

Vue中的组件渲染

在Vue中&#xff0c;组件的被渲染意味着将组件的内容转换为真实的DOM元素并添加到页面上。当Vue应用启动时&#xff0c;根组件会被渲染&#xff0c;并递归地渲染其子组件。 当组件被渲染时&#xff0c;Vue会将组件的模板解析成虚拟DOM&#xff08;Virtual DOM&#xff09;的形…

oracle 19c打补丁遭遇OPATCHAUTO-72043OPATCHAUTO-68061

最近&#xff0c;在AIX上的新装oracle 19C数据库基础版本&#xff0c;使用opatchauto打PSU补丁集35037840时遇到了OPATCHAUTO-72043报错&#xff0c;无法正常应用GI补丁。 一、环境描述 操作系统&#xff1a;AIX 数据库版本&#xff1a;oracle rac 19.3.0新装基础版 应用PS…

2023拒绝内卷!两年转行网络安全真实看法!

我目前转行网络安全两年&#xff0c;没啥天分&#xff0c;全靠努力&#xff0c;基本能够得上中级的水平了。看到大家对转行网络安全挺感兴趣&#xff0c;也有挺多争议&#xff0c;想把我的建议和经验告诉大家。 有很多人觉得网络安全已经饱和了&#xff0c;现在选择这个工作&a…

Spring Boot : ORM 框架 JPA 与连接池 Hikari

数据库方面我们选用 Mysql &#xff0c; Spring Boot 提供了直接使用 JDBC 的方式连接数据库&#xff0c;毕竟使用 JDBC 并不是很方便&#xff0c;需要我们自己写更多的代码才能使用&#xff0c;一般而言在 Spring Boot 中我们常用的 ORM 框架有 JPA 和 Mybaties &#xff0c;本…