windows生成dump文件

windows下程序有时突然崩溃了,偶发性的崩溃很难找。于是就需要保存崩溃时的dump信息了。

下面是关于如何生成dmp文件的代码。

头文件

#pragma once
#include <windows.h>
#include <DbgHelp.h>
#include <stdlib.h>
#include <string>
#pragma comment(lib, "dbghelp.lib")namespace FrameworkMiniDump
{std::wstring GetTimeNowString();std::string WStringToString(const std::wstring& str);std::wstring StringToWString(const std::string& str);std::string getexepath();inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName);inline BOOL CALLBACK MiniDumpCallback(PVOID                            pParam,const PMINIDUMP_CALLBACK_INPUT   pInput,PMINIDUMP_CALLBACK_OUTPUT        pOutput);inline void CreateMiniDump(PEXCEPTION_POINTERS pep, LPCTSTR strFileName);LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo);void DisableSetUnhandledExceptionFilter();// 此函数一旦成功调用,之后对 SetUnhandledExceptionFilter 的调用将无效void InitMinDump();
}

 

源文件:

#include "MiniDump.h"
#include <iostream>
#include <ctime>
#include <string>namespace FrameworkMiniDump
{std::wstring GetTimeNowString(){time_t rawtime;struct tm * timeinfo;wchar_t buffer[80];time(&rawtime);timeinfo = localtime(&rawtime);//wcsftime(buffer, sizeof(buffer), L"%d-%m-%Y %H:%M:%S", timeinfo);wcsftime(buffer, sizeof(buffer), L"%d-%m-%Y-%H-%M-%S", timeinfo);std::wstring str(buffer);return str;}std::wstring StringToWString(const std::string& str){
#if defined(WIN32)size_t sz = str.length();int nd = MultiByteToWideChar(CP_ACP, 0, &str[0], sz, NULL, 0);std::wstring ret(nd, 0);int w = MultiByteToWideChar(CP_ACP, 0, &str[0], sz, &ret[0], nd);if (str.length() != sz) {throw std::exception("StringToWString Err");}return ret;
#elseconst char* p = str.c_str();size_t len = str.length();size_t sz = len * sizeof(wchar_t);wchar_t* tp = new wchar_t[sz];size_t w = mbstowcs(tp, p, sz);if (w != len) {delete[] tp;throw std::exception("StringToWString Err");}std::wstring ret(tp);delete[] tp;return ret;
#endif}std::string WStringToString(const std::wstring& str){size_t sz = str.length();
#if defined(WIN32)int nd = WideCharToMultiByte(CP_ACP, 0, &str[0], sz, NULL, 0, NULL, NULL);std::string ret(nd, 0);int w = WideCharToMultiByte(CP_ACP, 0, &str[0], sz, &ret[0], nd, NULL, NULL);/*if (ret.length() != sz) {throw std::exception("WStringToString Err");}*/return ret;
#elseconst wchar_t* p = str.c_str();char* tp = new char[sz];size_t w = wcstombs(tp, p, sz);if (w != sz) {delete[] tp;throw std::exception("WStringToString Err");}std::string ret(tp);delete[] tp;return ret;
#endif}std::string getexepath(){wchar_t result[MAX_PATH];std::wstring wstr = std::wstring(result, GetModuleFileName(NULL, result, MAX_PATH));return WStringToString(wstr);}inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName){if (pModuleName == 0){return FALSE;}WCHAR szFileName[_MAX_FNAME] = L"";_wsplitpath(pModuleName, NULL, NULL, szFileName, NULL);if (_wcsicmp(szFileName, std::wstring(L"ntdll").c_str()) == 0)return TRUE;return FALSE;}inline BOOL CALLBACK MiniDumpCallback(PVOID                            pParam,const PMINIDUMP_CALLBACK_INPUT   pInput,PMINIDUMP_CALLBACK_OUTPUT        pOutput){if (pInput == 0 || pOutput == 0)return FALSE;switch (pInput->CallbackType){case ModuleCallback:if (pOutput->ModuleWriteFlags & ModuleWriteDataSeg)if (!IsDataSectionNeeded(pInput->Module.FullPath))pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);case IncludeModuleCallback:case IncludeThreadCallback:case ThreadCallback:case ThreadExCallback:return TRUE;default:;}return FALSE;}inline void CreateMiniDump(PEXCEPTION_POINTERS pep, LPCTSTR strFileName){HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE,FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)){MINIDUMP_EXCEPTION_INFORMATION mdei;mdei.ThreadId = GetCurrentThreadId();mdei.ExceptionPointers = pep;mdei.ClientPointers = NULL;MINIDUMP_CALLBACK_INFORMATION mci;mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;mci.CallbackParam = 0;::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hFile, MiniDumpNormal, (pep != 0) ? &mdei : 0, NULL, &mci);CloseHandle(hFile);}}LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo){std::string exename = "Dmp";std::wstring wexename = StringToWString(exename);;std::wstring filename = wexename + L"-" + GetTimeNowString() + L".dmp";CreateMiniDump(pExceptionInfo, filename.c_str());return EXCEPTION_EXECUTE_HANDLER;}// 此函数一旦成功调用,之后对 SetUnhandledExceptionFilter 的调用将无效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);}}void InitMinDump(){//注册异常处理函数
        SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);//使SetUnhandledExceptionFilter
        DisableSetUnhandledExceptionFilter();}
}

 

使用:

int main()
{......FrameworkMiniDump::InitMinDump(); ......  
}

调用一下InitMinDump就可以了,这里面会注册一个回调,崩溃时会保存的dmp文件。

注意:需要在debug模式。保存下来的dmp文件,需要结合pdb文件和源代码才能定位到哪里崩溃了。具体的我也不懂。

 

转载于:https://www.cnblogs.com/xcywt/p/10291219.html

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

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

相关文章

Linux系统信息与系统资源

目录系统信息系统标识unamesysinfo 函数gethostname 函数sysconf()函数时间、日期GMT 时间UTC 时间UTC 时间格式时区实时时钟RTC获取时间time/gettimeofday时间转换函数设置时间settimeofday总结进程时间times 函数clock 函数产生随机数休眠(延时)秒级休眠: sleep微秒级休眠: u…

关于Qomo OpenProject的进度(2006.01.04)

目前项目仍在初起阶段。许多事情是我一个人来做的&#xff0c;因此时间上实在不够用。我目前的主要工作是撰写项目的相关文档和整理项目中的可公开代码。我需要从原有的WEUI项目中剥离出一些非商业的代码出来。——尽管这个工作不复杂&#xff0c;但涉及到原公司的授权问题。由…

Java Web会话管理

一.Cookie会话 cookie技术会话数据会保存在浏览器客户端 cookie技术核心: 1.构造cookie对象 2.设置cookie&#xff1a;有效访问时间(setMaxAge)&#xff0c;有效访问路径(setPath)&#xff0c;设置cookie的值(setValue) 3.发送cookie到客户端保存&#xff1a;response.addCooki…

简单的一个用javascript做的'省市区'三级联动效果

2019独角兽企业重金招聘Python工程师标准>>> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head><title>javascript简单三级联动效果</title…

共享两个做项目最常用功能操作的封装类

(转载http://www.seaskyer.net/Index/Catalog12/223.html&#xff09;共享两个做项目最常用功能操作的封装类一&#xff0e; 显示消息对话框类 做项目时总免不了要弹出对话框&#xff0c;或提示用户&#xff0c;或做用户确认。像WinForm下的MessageBox一样很方便&#xff0c;但…

线程与线程同步

目录线程概述线程概念并发和并行线程ID创建线程终止线程回收线程取消线程取消一个线程取消状态以及类型取消点线程可取消性的检测分离线程注册线程清理处理函数线程属性线程栈属性分离状态属性线程安全线程栈可重入函数线程安全函数一次性初始化线程特有数据线程局部存储更多细…

《程序是怎样跑起来的》第一章有感

在看完《程序是怎样跑起来的》第一章后&#xff0c;我开始明白程序是怎么运行的&#xff0c;该书介绍了程序是什么、由什么组成的以及是内存的机制。读完这本书的第一章后&#xff0c;我知道程序是指令与数据的组合。不过在刚学习的时候&#xff0c;我只是按照书介绍说知&#…

CAS证书分析(2)

CAS的核心就是其Ticket&#xff0c;及其在Ticket之上的一系列处理操作。CAS的主要票据有TGT、ST、PGT、PGTIOU、PT&#xff0c;其中TGT、ST是CAS1.0协议中就有的票据&#xff0c;PGT、PGTIOU、PT是CAS2.0协议中有的票据。一 名词解释TGT&#xff08;Ticket Grangting Ticket&am…

Java Web 之Token+Cookie+Session

发展史&#xff1a; 1. 早期的WEB基本上就是文档的浏览而已&#xff0c;服务器不需要记录谁在某个时间都浏览了什么文档&#xff0c;每次请求都是全新的HTTP协议。 2. 随着交互式WEB应用的兴起&#xff0c;例如在线购物网站&#xff0c;需要登录的网站等&#xff0c;则需要对会…

Google Logos

All Googles logos.... 转载于:https://www.cnblogs.com/WuCountry/archive/2006/01/20/320689.html

CC254X 蓝牙博文收集

【BLE】CC2541之添加特征值 【BLE】CC2541之发现多个特征值句柄 IoT产品之蓝牙设计 BLE-CC2541 BLE-CC2640

〈转贴〉如何解决 Windows XP 中的硬件和软件驱动程序问题

如何解决 Windows XP 中的硬件和软件驱动程序问题 察看本文应用于的产品文章编号:322205最后修改:2004年3月25日修订:1.0本页 症状原因解决方案 检查第三方软件或驱动程序 检查新硬件这篇文章中的信息适用于:症状 在安装新硬件设备或新软件后&#xff0c;您的计算机可能自动开始…

断点续传与差分升级

断点续传的原理 基于STM32单片机的差分升级(增量升级)算法 OTA 差分升级 云端一体化差分升级&#xff0c;AliOS Things物联网升级“利器” 详解STM32在线IAP升级 单片机差分升级算法(STM32,M0,M3,M4等芯片都适用) AliOS Things 3.0 开发&#xff1a;OTA之差分升级快速上手…

MYSQL配置关键

2019独角兽企业重金招聘Python工程师标准>>> 在启动管理init.d里关于mysql的命令有 sudo /etc/init.d/mysql start|stop|restart|reload|force-reload|status sudo apt-get install mysql-server GRANT ALL PRIVILEGES ON *.* TO rootlocalhost IDENTIFIED BY &quo…

百度正式发布PaddlePaddle深度强化学习框架PARL

去年&#xff0c;斯坦福大学神经生物实验室与 EPFL 联合举办了一场强化学习赛事——人工智能假肢挑战赛&#xff08;AI for Prosthetics Challenge&#xff09;&#xff0c;希望将强化学习应用到人体腿部骨骼仿真模拟模型的训练。 经过激烈的角逐&#xff0c;最终来自百度大脑的…

关于lvalue and rvalue

2019独角兽企业重金招聘Python工程师标准>>> lvalue &#xff1a;An object is a region of storage that can be examined and stored into.An lvalue does not necessarily permit modification of the object it designates&#xff1a; eg An array type An inc…

[转载]全面解读软件版本的标志

软件名称后面经常有一些英文和数字&#xff0c;如&#xff1a;QQ 2003 Beta&#xff0c;这些都是软件的版本标志&#xff0c;通过它&#xff0c;我们可以对软件的类型有所了解&#xff1a;Beta(β)&#xff1a;测试版&#xff0c;为正式版本推出之前发布&#xff0c;可能存在一…

gitlab 使用教程

视频教程&#xff1a;叮&#xff5e;&#xff0c;你收到一份最全的gitlab使用说明 地址&#xff1a;https://www.bilibili.com/video/BV11E411x7Uv?spm_id_from333.337.search-card.all.click 目录简介1、注册、登录2、创建项目3、添加项目成员4、分支权限设置5、下载安装git6…

mssql 分页

为什么80%的码农都做不了架构师&#xff1f;>>> http://www.cnblogs.com/ddlink/archive/2013/03/30/2991007.html 分页问题修正 http://blog.csdn.net/wangkadm/article/details/12708005 转载于:https://my.oschina.net/macleo/blog/223782

今天体育课受伤

中午轮滑体育课&#xff0c;由于技术不到家&#xff08;基本上还不会&#xff09;&#xff0c;一不小心就扭下去了&#xff0c;虽然从开始下倒到坐在地上不到1秒的时间&#xff0c;不过那一瞬间的记忆却特别的漫长&#xff1a; 先是向左倒&#xff0c;膝关节处感觉到了咔嚓的两…