Windows调试技术-创建MiniDump文件

我们经常遇到这样的情况,在程序运行过程中,突然的就crash掉了,并且又是在customer那里crash的。这个时候我们需要借助于dump文件来查找发生exception的位置。下面的代码是创建一个MiniDump文件,至于为什么叫Mini,并不是因为小或是内容少的原因,而是相对于FullDump而言,MiniDump文件只保存了进程在crash的是部分关键的virtual memory信息。
Code
#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 : 000);
        
        
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;
        
*= 20;
    }
    __except(CreateMiniDump(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER) {
    }

    
return 0;
}

在做minidump文件的时候,会有一种情况是写不出dump文件的。那就是在这个异常块的外面还有异常处理模块,并且已经设置了不保存minidump文件处理,这个时候就没办法写出dump来了。

转载于:https://www.cnblogs.com/moonz-wu/archive/2008/08/21/1272708.html

你可能感兴趣的:(Windows调试技术-创建MiniDump文件)