一直以来觉着core dump这个东西很神奇,在初步学习的时候也没有个大方向,最近项目需要记录程序崩溃时的日志信息,因此在网上寻找相关的信息,此时core dump也成为了我重点关注的东西。
说说我的辛酸历史吧,刚毕业1年的我,C++领域的东西还是知之甚少啊,记得又一次面试被问起了demp文件,我当时真是对此一无所知,然而面试过后,我 也查询了有关dump的信息,由于当时是百度的,所以也没有查到什么有用的信息,直到最近项目上的需求我又重新拾起了这个问题,而这次是用google搜 索的相关字眼,结果被我找到了几篇不错的文章,而且还附带有事例代码,短短几分钟,我就成功的在我的程序中生成了dump文件,在此记录一下,也非常感谢 帮助我的几篇博客。
:该篇博客中封装好的代码,下载下来,导入自己的工程,在main函数中执行有关代码,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 pOutput23 )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 through33 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 }