通过本文你可以知道如何生成DMP文件、相关知识的详解连接、和知识来源连接
最近对查崩溃相关的技术感兴趣,于是在网上搜索学习了下。
优秀文章有 <<让程序在崩溃时体面的退出>>系列,这里推荐下:http://blog.csdn.net/starlee/article/details/6618849。
看完了想系统的学习下,原来是MS在XP发布的时候推出的一套调试技术。全文已经收录在MSDN里了:Debugging and Error Handling。目前还没看完。
以下是生成DMP文件最重要的函数详解 <<Effective minidump>>
http://blog.csdn.net/pkrobbie/article/details/6641081
http://blog.csdn.net/pkrobbie/article/details/6636310
这里我想用最简洁的步骤给出DMP文件的生成方法:
#include <windows.h>
#include <dbghelp.h>
#pragma comment(lib,"dbghelp.lib")
void dump()
{
HMODULE hDbgHelpDll;
hDbgHelpDll = LoadLibrary("dbghelp.dll");
if( hDbgHelpDll != INVALID_HANDLE_VALUE)
{
typedef BOOL (CALLBACK* tMiniDumpWriteDump)(
HANDLE,DWORD,HANDLE,MINIDUMP_TYPE,PMINIDUMP_EXCEPTION_INFORMATION,PMINIDUMP_USER_STREAM_INFORMATION,PMINIDUMP_CALLBACK_INFORMATION
);
tMiniDumpWriteDump pMiniDumpWriteDump = (tMiniDumpWriteDump)GetProcAddress(hDbgHelpDll,"MiniDumpWriteDump");
handle xx = cratefile('xxx.dmp', g_wr,f_s_r,0,c_a,F_f_w_t,0);
M_EXCEPION_INFOMATION eInfo;
eInfo.ThreadId = getCurTid();
e.ExP = Null;
eInfo.Clptr = false;
MINIDUMP_CB_INFO cb;
cb.C = 0;
cb.cp = 0;
pMiniDumpWirteDump( getCurposs(), getCurpid(), xx, MiniDumpNormal, null? &eInfo : NULL, NULL, &cb);
closeHandle(xx);
}
freeLibrary(hDbgHelpDll)
}
}
这个函数在被调用时生成一个DMP文件. 其中包含了调用栈和一些其他信息.
配合Structure Exception Handling技术,即可实现 "让程序在崩溃时体面的退出" 系列文章中描述的效果.
知道的越多,越觉得自己不知道的太多.这些技术可能在2002年以前就被使用了,我今天才了解,真是应该倍加努力.