创建Dump文件

 

Windows调试技术-创建MiniDump文件

我们经常遇到这样的情况,在程序运行过程中,突然的就crash掉了,并且又是在customer那里crash的。这个时候我们需要借助于dump文件来查找发生exception的位置。下面的代码是创建一个MiniDump文件,至于为什么叫Mini,并不是因为小或是内容少的原因,而是相对于FullDump而言,MiniDump文件只保存了进程在crash的是部分关键的virtual memory信息。
#include "stdafx.h"
#include <Windows.h>
#include <DbgHelp.h>

#pragma comment(lib, "DbgHelp.lib")

void CreateMiniDump( LPEXCEPTION_POINTERS lpExceptionInfo) {
    // Open a file
    HANDLE hFile = CreateFile(_T("MiniDump.dmp"), GENERIC_READ | GENERIC_WRITE,
        0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    if ( hFile != NULL &&  hFile != INVALID_HANDLE_VALUE ) {

        // Create the minidump 
        MINIDUMP_EXCEPTION_INFORMATION mdei;
        mdei.ThreadId          = GetCurrentThreadId();
        mdei.ExceptionPointers = lpExceptionInfo;
        mdei.ClientPointers    = FALSE;

        MINIDUMP_TYPE mdt      = MiniDumpNormal;
        BOOL retv = MiniDumpWriteDump( GetCurrentProcess(), GetCurrentProcessId(),
            hFile, mdt, ( lpExceptionInfo != 0 ) ? &mdei : 0, 0, 0);
        
        if ( !retv ) {
            _tprintf( _T("MiniDumpWriteDump failed. Error: %u \n"), GetLastError() ); 
        } else { 
            _tprintf( _T("Minidump created.\n") ); 
        }

        // Close the file
        CloseHandle( hFile );

    } else {
        _tprintf( _T("CreateFile failed. Error: %u \n"), GetLastError() ); 
    }
}


int _tmain(int argc, _TCHAR* argv[])
{
    __try {
        int * p = NULL;
        *p = 20;
    }
    __except(CreateMiniDump(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER) {
    }

    return 0;
}

在做minidump文件的时候,会有一种情况是写不出dump文件的。那就是在这个异常块的外面还有异常处理模块,并且已经设置了不保存minidump文件处理,这个时候就没办法写出dump来了。
0
0
猜你在找
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
快速回复 TOP

你可能感兴趣的:(windows,exception,File,null,Crash,Pointers)