设置C++崩溃时生成Dump文件
来源:互联网 发布:淘宝什么是千人千面 编辑:程序博客网 时间:2024/05/19 16:19
Dump 文件是进程的内存镜像 , 可以把程序的执行状态通过调试器保存到dump文件中 ; Dump 文件是用来给驱动程序编写人员调试驱动程序用的 , 这种文件必须用专用工具软件打开 , 比如使用 WinDbg , VisualStudio 打开 ;
当我们的程序发布出去之后 , 在客户机上是无法跟踪自己代码的 BUG 的 , 所以 Dump 文件对于我们来说特别有用 ; 我们可以通过 .dmp
文件把出现 BUG 的情况再现 , 然后再现客户环境 (包括堆栈调用等情况) , 设置源码调试路径 , 可以找到出现 BUG 的语句 ;
C++ 程序设置生成 Dump 文件的代码如下 :
#include "stdafx.h"#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("DumpDemo_v1.0"); SYSTEMTIME stLocalTime; GetLocalTime(&stLocalTime); wsprintf(szFileName, L"%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(){ // 加入崩溃dump文件功能 SetUnhandledExceptionFilter(ExceptionFilter); // 使程序崩溃产生 Dump 文件 int *p = NULL; *p=1;}
然后编译项目 , 运行程序 , 就会发现在当前运行目录生成了 Dump 文件 , 类似 DumpDemo_v1.0-20170602-154446.dmp
;
生成 Dump 文件后 , 我们可以用 VS2012 等工具来进行调试 , 具体方法点击 传送门 ;
个人网站: Github , 欢迎点击给星
阅读全文
0 0
- 设置C++崩溃时生成Dump文件
- Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
- 程序崩溃时生成Dump文件
- 程序崩溃时生成DUMP文件
- 让程序崩溃时生成dump文件以供调试
- 程序崩溃生成dump符号文件
- windows程序崩溃生成dump文件
- windows程序崩溃生成dump文件
- qt中程序崩溃生成dump文件
- windows程序崩溃生成dump文件
- Linux C 让程序崩溃后生成Core Dump
- 程序崩溃时抓取dump文件
- 一个宏命令,就可以程序崩溃时生成dump文件
- 使用SetUnhandledExceptionFilter和DebugMiniDumpFilter来使程序在崩溃时生成dump文件
- 一个宏命令,就可以程序崩溃时生成dump文件
- 使用SetUnhandledExceptionFilter和DebugMiniDumpFilter来使程序在崩溃时生成dump文件 .
- 一个宏命令,就可以程序崩溃时生成dump文件
- 生成程序崩溃的dump文件,使用windbg调试
- 第一个Java程序(HelloWorld)的编写
- 网页js获取视频帧图片
- Activiti系列(一)——最简单的Activiti程序
- 光电隔离RS485典型电路
- background-attachment: fixed;
- 设置C++崩溃时生成Dump文件
- Divide_Two_Integers(低时间复杂度版)
- android 仿微信右滑返回
- Python 判断密码等级的强弱,不使用正则表达式
- ASP.NET-Request对象
- 解决在thinkPhP中加载css和js的问题
- 卷积神经网络CNN
- XML基本语法
- C#网络编程(一.2、Socket)