我们经常遇到这样的情况,在程序运行过程中,突然的就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 : 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来了。