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

windows生成dump文件相关推荐

  1. Windows下dump文件生成与分析

    一.    生成Dump文件方式 1.1任务管理器 在程序崩溃后,先不关闭程序,在任务管理器中找到该程序对应的进程.右键->创建转储文件. 此时会在默认的目录下创建出一个dump文件. 可以看出 ...

  2. Windows下生成dump文件的三种方式

    文章目录 前言 一.什么是dump文件? 概述 dump分类 内核模式Dump 用户模式Dump 二.dump生成方式 实现方法 方法一:修改注册表 参数说明 方法二:生动创建转储文件 方法三:通过代 ...

  3. Windows下dump文件的生成

    Windows下Dump文件分为两大类,内核模式Dump和用户模式Dump.内核模式Dump是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump.用户模式Dump进一步可 ...

  4. 关于Windows程序崩溃(Crash)以及生成dump文件的探究

    文章目录 关于Windows程序崩溃(Crash)以及生成dump文件的探究 什么是崩溃(Crash),崩溃(Crash)的现象 崩溃(Crash)的原因是什么 如何消除崩溃时出现的异常信息对话框 如 ...

  5. [Windows编程] 如何捕捉程序异常/crash 并生成 dump 文件

    前面介绍如如何用WinDBG 生成crash dump <WinDBG 技巧:如何生成Dump 文件(.dump 命令) >,但是用户机器上通常不安装WinDBG, 而且多数用户也不知道怎 ...

  6. 利用 dbghelp.dll 生成 dump 文件

    dbghelp.dll windows的系统目录system32下,都有dbghelp.dll,但在实际使用时,往往会让exe加载自己目录下的dll,以避免系统目录下的dll版本不一导致的程序异常. ...

  7. linux手动生成dump文件权限不足_linux下生成dump文件方法及设置

    https://andyniu.iteye.com/blog/1965571 Linux中生成 Core Dump 文件的方法 1 什么是 Core Dump Core Dump 又叫核心转储.在程序 ...

  8. 启动(程序还没执行生成dump文件的代码)就崩溃的处理流程

    何志丹 如果有专业人员,利用Windbg启动这个程序,在分析就可以了. 上次崩溃,让大家手忙脚乱.所以列了一个启动(程序还没执行生成dump文件的代码)就崩溃的处理流程. 1,用我写的opendll. ...

  9. linux下生成dump文件方法及设置

    Linux中生成 Core Dump 文件的方法 1 什么是 Core Dump Core Dump 又叫核心转储.在程序运行过程中发生异常时,将其内存数据保存到文件中,这个过程叫做 Core Dum ...

最新文章

  1. Vue.js学习系列(四十二)-- Vue.js组件
  2. 转: java学习路线图
  3. Netty 学习和进阶策略
  4. 2021-01-21 linux shell脚本实现间隔一定时间执行一次任务
  5. 五种网络管理技巧优化网络办公环境
  6. 迪普工业以太网交换机产品线
  7. 机器学习之基于Fisher实现二分类的人脸识别
  8. scrapy.request
  9. Linux虚拟文件系统之文件系统安装(sys_mount())
  10. 自我提升之二 揭秘IOC注入框架,轻松实现布局、属性、事件注入
  11. Lingo11 解决优化问题( 下载和运行 )
  12. Alize和NIST中sphere2.7编译问题
  13. Real Time Transfer (RTT)
  14. 2021最火南风表情包最新微信小程序源码+带采集+流量主+前后端完整版+免费下载+附安装教程无加密源码
  15. UESTC878————温泉旅店(动态规划)
  16. U-BOOT启动流程详细分析[转]
  17. java $ 怎样用_jsp中$是什么意思?怎么用?
  18. 年中团建之军训-回顾
  19. 【2022年高教杯数学建模】C题:古代玻璃制品的成分分析与鉴别方案及代码实现(一)
  20. 【PaddleOCR】Paddle-Lite, Paddle2ONNX介绍, 学习教程...

热门文章

  1. 线程池的种类,区别和使用场景
  2. Win2D 入门教程 VB 中文版 - 防止内存泄漏
  3. 项目实例改编:利用structs2的action 实时显示图片、pdf和其他内容的框架抽取。(转)...
  4. ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(2)用户登录、注销
  5. STL - 底层实现
  6. 学习JS基本数据类型与对象的valueOf方法
  7. 算法 --- 插入排序的JS实现
  8. cobbler基础安装
  9. 分布式搜索 Elasticsearch —— 节点实例化
  10. TextView控件