调试技术:生成DMP文件

来源:互联网 发布:java二叉树非递归遍历 编辑:程序博客网 时间:2024/05/29 16:05

通过本文你可以知道如何生成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年以前就被使用了,我今天才了解,真是应该倍加努力.

原创粉丝点击