MFC程序自动生成dump Windbg文件

摘要:
如何获取客户端计算机上相应程序的详细错误信息?在这里,我们使用drwtsn32在应用程序崩溃时自动将调用堆栈信息以文件的形式保存在磁盘上。有许多工具可以生成转储,例如drwtsn32、NTSD、CDB等。drwtsn2随系统提供。在项目中使用以下步骤:1.创建minidmp h minidmp.h#pragmaonce#include#include#include #pragmacommentinlineBOOLIsDataSectionNeeded{if{returnFALSE;}WCHARszFileName[MAX_FNAME]=L“”;_wsplitpath;如果返回TRUE;returnFALSE;}inlineBOOLCALLBACKMiniDumpCallback{ifreturnFALSE;开关{caseModuleCallback:iif(!

  在客户机器上如何得到应该程序的详细出错信息, 这里使用drwtsn32,在应用程序崩溃的时候自动将调用栈的信息以文件形式保存在磁盘。

  生成dump有drwtsn32, NTSD,CDB等多种工具,drwtsn32 于系统自带。

  在项目中使用以下几个步骤:

1. 创建minidmp.h  

MFC程序自动生成dump Windbg文件第1张MFC程序自动生成dump Windbg文件第2张minidmp.h
#pragma once
#include 
<windows.h>
#include 
<imagehlp.h>
#include 
<stdlib.h>
#pragma comment(lib, "dbghelp.lib")

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, L"ntdll"== 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(EXCEPTION_POINTERS* pep, LPCTSTR strFileName)
{
    HANDLE hFile 
= CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE,
        
0, 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     
= FALSE;
        MINIDUMP_CALLBACK_INFORMATION mci;
        mci.CallbackRoutine     
= (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;
        mci.CallbackParam       
= 0;
        MINIDUMP_TYPE mdt       
= (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory | 
            MiniDumpWithDataSegs 
| 
            MiniDumpWithHandleData 
|
            
0x00000800 /*MiniDumpWithFullMemoryInfo*/ | 
            
0x00001000 /*MiniDumpWithThreadInfo*/ | 
            MiniDumpWithUnloadedModules);
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
            hFile, mdt, (pep 
!= 0? &mdei : 00&mci);
        CloseHandle(hFile); 
    }
}

2、  实现UnhandledExceptionFilter

MFC程序自动生成dump Windbg文件第3张MFC程序自动生成dump Windbg文件第4张GPTUnhandledExceptionFilter
#include "minidmp.h"

LONG WINAPI GPTUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
    
//得到当前时间
    SYSTEMTIME st;
    ::GetLocalTime(
&st);
    
//得到程序所在文件夹
    TCHAR exeFullPath[256]; // MAX_PATH
    GetModuleFileName(NULL,exeFullPath,256);//得到程序模块名称,全路径 
    CString strPath;
    DWORD nLoc;
    strPath.Format(
"%s",exeFullPath);  
    nLoc 
= strPath.ReverseFind('\\');
    strPath.Delete(nLoc
+1,strPath.GetLength()-nLoc); 

    LPSTR szFileName;
    wsprintf(szFileName, TEXT(
"%sERLOG_%04d%02d%02d%02d%02d%02d%02d%02d.dmp"),strPath, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, rand()%100);
    CreateMiniDump(pExceptionInfo, szFileName);
    std::cerr 
<< "未知错误:" << (*pExceptionInfo->ExceptionRecord) << std::endl;
    exit(pExceptionInfo
->ExceptionRecord->ExceptionCode);
    
return EXCEPTION_EXECUTE_HANDLER;    // 程序停止运行
}

3.  在异常发生之前调用SetUnhandledExceptionFilter(GPTUnhandledExceptionFilter);通常在Main()函数开始时调用即可。

注:必需有dbghlp.dll

免责声明:文章转载自《MFC程序自动生成dump Windbg文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇R绘图 第七篇:绘制条形图(ggplot2)(3)mpeg系列——mpeg1和mpeg2下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

工作总结:VS2010/MFC编程入门之十六(对话框:消息对话框)

原文地址:http://www.jizhuomi.com/software/171.html 我们在使用Windows系统的过程中经常会见到消息对话框,提示我们有异常发生或提出询问等。因为在软件开发中经常用到消息对话框,所以MFC提供了两个函数可以直接生成指定风格的消息对话框,而不需要我们在每次使用的时候都要去创建对话框资源和生成对话框类等。这两个函数就是...

C++ MFC学习 (三)

视窗口覆盖在框架窗口之上 如果有了 OnDraw 不要再用OnPaint  OnPaint会覆盖掉OnDraw所画内容 1 // MFC_Demo1View.cpp : CMFC_Demo1View 类的实现 2 // 3 4 #include "stdafx.h" 5 // SHARED_HANDLERS 可以在实现预览、缩略图和搜...

VS2010/MFC编程入门之前言

鸡啄米的C++编程入门系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了。但是教程中讲的例子只是一个个简单的例程,并没有可视化窗口。鸡啄米在这套VS2010/MFC编程入门教程中将会给大家讲解怎样使用VS2010进行可视化编程,也就是基于窗口的程序。 C++编程入门系列主要偏重于理论方面的知识,目的是让大家打好底子,...

VS2019 离线安装方法详解

本文详细介绍了 VS2019 离线安装的相关步骤,以桌面开发为主下载 C++桌面开发、.NET 桌面开发相关的工作负载、MFC 可选组件及帮助查看器。 工作负载(Workload) 离线安装需要先根据开发的项目类型下载相关的 工作负载(Workload)。工作负载包含多个依赖项,分为必需(Required)、建议(Recommended)、可选(Opti...

VC/MFC如何添加启动界面

2015-05 转自 香远益清原文VC/MFC如何添加启动界面 1、基于框架类的应用程序添加启动画面的步骤(利用组件库中的Splash Screen组件生成Splash1.cpp 和Splash1.h 这两个文件) (1)用Photoshop等制作启动画面图像,保存为bmp格式。  (2)用Appwizard建一个基于单文档的工程Splash。 (3)在资...

MFC-CString与int互相转化

1. CString转int int n = 0; CString str = _T("123"); n = _ttoi(str); 2. int转CString int n = 0; CString str; str.Format(_T(%d) , n); 参考:MFC中 CString与int的转化 vs2010 中 MFC::CString...