vs 自動生成core dump文件


  一直以來覺着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 }
View Code

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 }
View Code

 

如果您覺得文章不錯,不妨給個 打賞,寫作不易,感謝各位的支持。您的支持是我最大的動力,謝謝!!! 

 

  


很重要--轉載聲明

  1. 本站文章無特別說明,皆為原創,版權所有,轉載時請用鏈接的方式,給出原文出處。同時寫上原作者:朝十晚八 or Twowords
  2. 如要轉載,請原文轉載,如在轉載時修改本文,請事先告知,謝絕在轉載時通過修改本文達到有利於轉載者的目的。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM