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
windows生成dump文件相关推荐
- Windows下dump文件生成与分析
一. 生成Dump文件方式 1.1任务管理器 在程序崩溃后,先不关闭程序,在任务管理器中找到该程序对应的进程.右键->创建转储文件. 此时会在默认的目录下创建出一个dump文件. 可以看出 ...
- Windows下生成dump文件的三种方式
文章目录 前言 一.什么是dump文件? 概述 dump分类 内核模式Dump 用户模式Dump 二.dump生成方式 实现方法 方法一:修改注册表 参数说明 方法二:生动创建转储文件 方法三:通过代 ...
- Windows下dump文件的生成
Windows下Dump文件分为两大类,内核模式Dump和用户模式Dump.内核模式Dump是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump.用户模式Dump进一步可 ...
- 关于Windows程序崩溃(Crash)以及生成dump文件的探究
文章目录 关于Windows程序崩溃(Crash)以及生成dump文件的探究 什么是崩溃(Crash),崩溃(Crash)的现象 崩溃(Crash)的原因是什么 如何消除崩溃时出现的异常信息对话框 如 ...
- [Windows编程] 如何捕捉程序异常/crash 并生成 dump 文件
前面介绍如如何用WinDBG 生成crash dump <WinDBG 技巧:如何生成Dump 文件(.dump 命令) >,但是用户机器上通常不安装WinDBG, 而且多数用户也不知道怎 ...
- 利用 dbghelp.dll 生成 dump 文件
dbghelp.dll windows的系统目录system32下,都有dbghelp.dll,但在实际使用时,往往会让exe加载自己目录下的dll,以避免系统目录下的dll版本不一导致的程序异常. ...
- linux手动生成dump文件权限不足_linux下生成dump文件方法及设置
https://andyniu.iteye.com/blog/1965571 Linux中生成 Core Dump 文件的方法 1 什么是 Core Dump Core Dump 又叫核心转储.在程序 ...
- 启动(程序还没执行生成dump文件的代码)就崩溃的处理流程
何志丹 如果有专业人员,利用Windbg启动这个程序,在分析就可以了. 上次崩溃,让大家手忙脚乱.所以列了一个启动(程序还没执行生成dump文件的代码)就崩溃的处理流程. 1,用我写的opendll. ...
- linux下生成dump文件方法及设置
Linux中生成 Core Dump 文件的方法 1 什么是 Core Dump Core Dump 又叫核心转储.在程序运行过程中发生异常时,将其内存数据保存到文件中,这个过程叫做 Core Dum ...
最新文章
- Vue.js学习系列(四十二)-- Vue.js组件
- 转: java学习路线图
- Netty 学习和进阶策略
- 2021-01-21 linux shell脚本实现间隔一定时间执行一次任务
- 五种网络管理技巧优化网络办公环境
- 迪普工业以太网交换机产品线
- 机器学习之基于Fisher实现二分类的人脸识别
- scrapy.request
- Linux虚拟文件系统之文件系统安装(sys_mount())
- 自我提升之二 揭秘IOC注入框架,轻松实现布局、属性、事件注入
- Lingo11 解决优化问题( 下载和运行 )
- Alize和NIST中sphere2.7编译问题
- Real Time Transfer (RTT)
- 2021最火南风表情包最新微信小程序源码+带采集+流量主+前后端完整版+免费下载+附安装教程无加密源码
- UESTC878————温泉旅店(动态规划)
- U-BOOT启动流程详细分析[转]
- java $ 怎样用_jsp中$是什么意思?怎么用?
- 年中团建之军训-回顾
- 【2022年高教杯数学建模】C题:古代玻璃制品的成分分析与鉴别方案及代码实现(一)
- 【PaddleOCR】Paddle-Lite, Paddle2ONNX介绍, 学习教程...