MiniDump

#pragma once

void RunCrashHandler();
#include "MiniDump.h"
#include <windows.h>
#include <imagehlp.h>
#include <stdlib.h>
#include <tchar.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);
    _wsplitpath_s(pModuleName, NULL, 0, NULL, 0, szFileName, 0, NULL, 0);
    //if (wcsicmp(szFileName, L"ntdll") == 0)
    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;
}

//创建Dump文件
inline void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCTSTR strFileName)
{
    HANDLE hFile = CreateFile(strFileName, 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)0x0000ffff;
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mdei, NULL, &mci);
        CloseHandle(hFile);
    }
}

LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter)
{
    return NULL;
}

BOOL PreventSetUnhandledExceptionFilter()
{
    HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll"));
    if (hKernel32 == NULL)
        return FALSE;
    void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter");
    if (pOrgEntry == NULL)
        return FALSE;
    unsigned char newJump[100];
    DWORD dwOrgEntryAddr = (DWORD)pOrgEntry;
    dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far
    void *pNewFunc = &MyDummySetUnhandledExceptionFilter;
    DWORD dwNewEntryAddr = (DWORD)pNewFunc;
    DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;
    newJump[0] = 0xE9;  // JMP absolute
    memcpy(&newJump[1], &dwRelativeAddr, sizeof(pNewFunc));
    SIZE_T bytesWritten;
    BOOL bRet = WriteProcessMemory(GetCurrentProcess(), pOrgEntry, newJump, sizeof(pNewFunc)+1, &bytesWritten);
    return bRet;
}

LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *pException)
{
    TCHAR szMbsFile[MAX_PATH] = { 0 };
    ::GetModuleFileName(NULL, szMbsFile, MAX_PATH);
    TCHAR* pFind = _tcsrchr(szMbsFile, ‘\\‘);
    if (pFind)
    {
        *(pFind + 1) = 0;
        //_tcscat(szMbsFile, _T("CreateMiniDump.dmp"));
        _tcscat_s(szMbsFile, _T("CreateMiniDump.dmp"));
        CreateMiniDump(pException, szMbsFile);
    }
    // TODO: MiniDumpWriteDump
    FatalAppExit(-1, _T("Fatal Error"));
    return EXCEPTION_CONTINUE_SEARCH;
}

//运行异常处理
void RunCrashHandler()
{
    static bool bIni = false;
    if (!bIni)
    {
        SetUnhandledExceptionFilter(UnhandledExceptionFilterEx);
        PreventSetUnhandledExceptionFilter();
        bIni = true;
    }
}
时间: 2024-10-07 19:29:09

MiniDump的相关文章

【转】程序崩溃时自动记录minidump的c++类

原帖:程序崩溃时自动记录minidump的c++类 封装了一个C++类,当程序意外崩溃的时候可以生成dump文件,以便确定错误原因. 头文件: //crash_dumper_w32.h #ifndef _CRASH_DUMPER_H_ #define _CRASH_DUMPER_H_ #include <windows.h> class CrashDumper { public: CrashDumper(); ~CrashDumper(); static bool _PlaceHolder()

异常处理与MiniDump详解(4) MiniDump

http://blog.csdn.net/vagrxie/article/details/4398721 异常处理与MiniDump详解(4) MiniDump 分类:             [Windows]              2009-07-31 23:18     23631人阅读     评论(12)     收藏     举报 exceptionpointersmicrosoftfunwindowsnull 目录(?)[+] 一   综述 二   基本应用 怎么感知到程序的崩

Effective minidump

Effective minidump (上) 原文更新: 07.02.2005 翻译:2011/7/16 目录 简介 Minidump 类型 MiniDumpCallback函数 用户数据流 Dump类型 其他 例子程序 简介 在过去几年里,崩溃转储(crash dump)成为了调试工作的一个重要部分.如果软件在客户现场或者测试实验室发生故障,最有价值的解决方式是能够创建一个故障瞬间的应用程序状态镜像,然后可以在开发者的机器上通过调试器进行分析.第一代的crash dump通常被称为"全用户转储

[IT学习]关于minidump

windows debug里面需要用到数据分析. 很重要的一个工具就是dump. 什么事minidump,就是windows在蓝屏或其他故障时,转存的内存数据.(我现在是这么理解的) Applications can produce user-mode minidump files, which contain a useful subset of the information contained in a crash dump file. Applications can create mi

C#使用MiniDump捕获异常

c/c++语言里MiniDump是一个重要的调试手段,他们没有C#/java这样语言有很多异常输出信息( JVM异常导出bug日志功能,通常在jdk目录,文件格式hs_err_%pid%.log,pid是进程id). 我们通常在项目中都会把可预见性进行异常处理.常见的处理方法如下 try{ ... catch(Exception ex) { HandleExeption(ex); } 项目部署到客户机中运行在程序员无法评估的情况下,如(堆栈溢出.访问冲突)则无法处理 或者很难重现这种异常,这给程

[Windows]_[初级]_[Release程序的崩溃报告minidump解决方案]

场景: 1. Release的程序崩溃时,崩溃报告可以让开发人员查明代码哪里出了问题,用处大大的. 2. 只有用VS的编译器才支持,所以MinGW就无缘了. 3. 使用了未处理异常过滤处理函数. 4. 生成的.dmp文件用zlib库压缩, 用到以下的ZipHelper类,编译时还是需要zlib库和dbghelp.lib http://blog.csdn.net/infoworld/article/details/41290969 5. 使用方式就是把DbgReport作为app类的成员变量,或者

MiniDump类笔记

h文件 : #pragma once #include <windows.h> #include <Tchar.h> #include <stdio.h> #include <stdlib.h> class CMiniDump { public: static BOOL Begin(VOID); //声明成静态函数是想直接调用而不必new一个实例 static BOOL End(VOID); }; cpp文件 : #include "CMiniDu

Crush The Crash--汇编级看函数调用

游戏在后期polish以及上线之后,一个不可避免的部分就是要处理各种bug,包括crash. 汇编?似乎只是学校里学习了一下,在现在都倾向于使用高层语言的时代,还有用么?答案是肯定的. 有大量的crash以及bug都是只发生在retail版中,现场都是优化过的汇编代码,大部分是minidump,里面包含的信息非常有限,你拿到的就是一个优化过的汇编代码,加上少量的stack上的内存信息,这种情况下要处理掉crash,能从这些汇编代码中解析minidump并最终击杀问题是唯一的选择. 本文涉及的知识

day6:vcp考试

Q101. Refer to the Exhibit.Which tab shows the Hardware Acceleration support status?A. DevicesB. PropertiesC. PathsD. Advanced Options Q102. Which minor badge items make up the Efficiency badge score for an ESXi host in vCenter Operations Manager?A.