我們經常遇到這樣的情況,在程式運行過程中,突然的就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來了。