一直以來覺着core dump這個東西很神奇,在初步學習的時候也沒有個大方向,最近項目需要記錄程序崩潰時的日志信息,因此在網上尋找相關的信息,此時core dump也成為了我重點關注的東西。
說說我的辛酸歷史吧,剛畢業1年的我,C++領域的東西還是知之甚少啊,記得又一次面試被問起了demp文件,我當時真是對此一無所知,然而面試過后,我 也查詢了有關dump的信息,由於當時是百度的,所以也沒有查到什么有用的信息,直到最近項目上的需求我又重新拾起了這個問題,而這次是用google搜 索的相關字眼,結果被我找到了幾篇不錯的文章,而且還附帶有事例代碼,短短幾分鍾,我就成功的在我的程序中生成了dump文件,在此記錄一下,也非常感謝 幫助我的幾篇博客。
自己創建 minidump:該篇博客中封裝好的代碼,下載下來,導入自己的工程,在main函數中執行有關代碼,dump文件在異常時會自動寫入
程序自動生成Dump文件: 這篇文字的內容基本和上面的文章一樣,只是略顯亂一點,這么說應該不太合適。
下面 我貼出頭文件和main函數中應該加入的代碼的代碼:
minidump.h
1 #include 2 #pragma comment(lib, "dbghelp.lib") 3 4 5 bool IsDataSectionNeeded(const WCHAR* pModuleName) 6 { 7 if (pModuleName == 0) 8 { 9 return false; 10 } 11 12 WCHAR szFileName[_MAX_FNAME] = L""; 13 _wsplitpath(pModuleName, NULL, NULL, szFileName, NULL); 14 15 if (wcsicmp(szFileName, L"ntdll") == 0) return true; 16 return false; 17 } 18 19 BOOL CALLBACK MiniDumpCallback( 20 PVOID pParam, 21 const PMINIDUMP_CALLBACK_INPUT pInput, 22 PMINIDUMP_CALLBACK_OUTPUT pOutput 23 ) 24 { 25 if (pInput == 0 || pOutput == 0) return FALSE; 26 switch (pInput->CallbackType) 27 { 28 case ModuleCallback: 29 if (pOutput->ModuleWriteFlags & ModuleWriteDataSeg) 30 if (!IsDataSectionNeeded(pInput->Module.FullPath)) 31 pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg); 32 // fall through 33 case IncludeModuleCallback: 34 case IncludeThreadCallback: 35 case ThreadCallback: 36 case ThreadExCallback: 37 return TRUE; 38 default:; 39 } 40 return FALSE; 41 } 42 43 void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCSTR filename) 44 { 45 HANDLE hFile = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, 46 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 47 48 if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) 49 { 50 MINIDUMP_EXCEPTION_INFORMATION mdei; 51 mdei.ThreadId = GetCurrentThreadId(); 52 mdei.ExceptionPointers = pep; 53 mdei.ClientPointers = FALSE; 54 MINIDUMP_CALLBACK_INFORMATION mci; 55 mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback; 56 mci.CallbackParam = 0; 57 MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory | 58 MiniDumpWithDataSegs | 59 MiniDumpWithHandleData | 60 0x00000800 | 61 0x00001000 | 62 MiniDumpWithUnloadedModules); 63 MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), 64 hFile, mdt, (pep != 0) ? &mdei : 0, 0, &mci); 65 66 CloseHandle(hFile); 67 } 68 }
main.cpp
1 #include "minidump.h" 2 3 #include 4 #include 5 6 7 8 LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo) 9 { 10 char creashFile[100]; 11 getcwd(creashFile, 100); 12 strcat(creashFile, "\\CreatFile.dmp"); 13 CreateMiniDump(pExceptionInfo, creashFile); 14 return EXCEPTION_EXECUTE_HANDLER; 15 } 16 17 18 19 int main(int argc, char *argv[]) 20 { 21 SetUnhandledExceptionFilter(MyUnhandledExceptionFilter); 22 23 //do something... 24 25 return 0; 26 27 28 29 }
如果您覺得文章不錯,不妨給個
打賞,寫作不易,感謝各位的支持。您的支持是我最大的動力,謝謝!!!


