一直以来觉着core dump这个东西很神奇,在初步学习的时候也没有个大方向,最近项目需要记录程序崩溃时的日志信息,因此在网上寻找相关的信息,此时core dump也成为了我重点关注的东西。
说说我的辛酸历史吧,刚毕业1年的我,C++领域的东西还是知之甚少啊,记得又一次面试被问起了dump文件,我当时真是对此一无所知,然而面试过后,我 也查询了有关dump的信息,由于当时是百度的,所以也没有查到什么有用的信息,直到最近项目上的需求我又重新拾起了这个问题,而这次是用google搜 索的相关字眼,结果被我找到了几篇不错的文章,而且还附带有事例代码,短短几分钟,我就成功的在我的程序中生成了dump文件,在此记录一下,
也非常感谢 帮助我的几篇博客。
自己创建 minidump:该篇博客中封装好的代码,下载下来,导入自己的工程,在main函数中执行有关代码,dump文件在异常时会自动写入
程序自动生成Dump文件: 这篇文字的内容基本和上面的文章一样,只是略显乱一点,这么说应该不太合适。
下面 我贴出头文件和main函数中应该加入的代码的代码:
minidump.h
#include
#pragma comment(lib, "dbghelp.lib") bool IsDataSectionNeeded(const WCHAR* pModuleName)
{
if (pModuleName == )
{
return false;
} WCHAR szFileName[_MAX_FNAME] = L"";
_wsplitpath(pModuleName, NULL, NULL, szFileName, NULL); if (wcsicmp(szFileName, L"ntdll") == ) return true;
return false;
} BOOL CALLBACK MiniDumpCallback(
PVOID pParam,
const PMINIDUMP_CALLBACK_INPUT pInput,
PMINIDUMP_CALLBACK_OUTPUT pOutput
)
{
if (pInput == || pOutput == ) return FALSE;
switch (pInput->CallbackType)
{
case ModuleCallback:
if (pOutput->ModuleWriteFlags & ModuleWriteDataSeg)
if (!IsDataSectionNeeded(pInput->Module.FullPath))
pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);
// fall through
case IncludeModuleCallback:
case IncludeThreadCallback:
case ThreadCallback:
case ThreadExCallback:
return TRUE;
default:;
}
return FALSE;
} void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCSTR filename)
{
HANDLE hFile = CreateFile(filename, GENERIC_READ | GENERIC_WRITE,
, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
{
MINIDUMP_EXCEPTION_INFORMATION mdei;
mdei.ThreadId = GetCurrentThreadId();
mdei.ExceptionPointers = pep;
mdei.ClientPointers = FALSE;
MINIDUMP_CALLBACK_INFORMATION mci;
mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;
mci.CallbackParam = ;
MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory |
MiniDumpWithDataSegs |
MiniDumpWithHandleData |
0x00000800 |
0x00001000 |
MiniDumpWithUnloadedModules);
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
hFile, mdt, (pep != ) ? &mdei : , , &mci); CloseHandle(hFile);
}
}
main.cpp
#include "minidump.h" #include
#include LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
char creashFile[];
getcwd(creashFile, );
strcat(creashFile, "\\CreatFile.dmp");
CreateMiniDump(pExceptionInfo, creashFile);
return EXCEPTION_EXECUTE_HANDLER;
} int main(int argc, char *argv[])
{
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter); //do something... return ; }
http://www.cnblogs.com/swarmbees/p/5621602.html