自己创建 minidump (自认为精品) (转)


以前曾写过一个 bugslayer.dll 的介绍. 在程序出错时将调用栈写到文件. 觉得不错. 后来开始用 windbg. 知道了 userdump. 知道了如何调试 dump... 才知道程序崩溃的时候写 dump 文件其实可以获取比调用栈多得多的信息. 

如果你的程序什么都不干. 那么在程序出错的时候. drwtsn32.exe 会写一个 userdump. 但 drwtsn32 有些缺点. 比如只能写一个 dump 文件. 后面的崩溃写 dump 文件时会覆盖前面的. win2000 下的 drwtsn32 只能写旧式的 dump 文件(往往尺寸比较大). 有一篇文章论述的比较清楚:
 http://www.debuginfo.com/articles/ntsdwatson.html

建议使用 ntsd 代替 drwtsn32. 但 ntsd 的缺点就是需要安装最新的 windbg. 这是一个硬伤. 在看了 debuginfo.com 的另一篇文章:
 http://www.debuginfo.com/articles/effminidumps.html
 
之后, 我选择的是在程序出错的时候调用 api 自己写 minidump. 克服了 drwtsn32, ntsd 的缺点.
将封装好的函数放到了一个头文件中, 包含即可. 使用的方法很简单:

#include <windows.h>
#include "minidump.h"
LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
 CreateMiniDump(pExceptionInfo, "c://user.dmp");
 return EXCEPTION_EXECUTE_HANDLER;
}

void main()
{
 SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
 *(int*)0=0; // AV
}

这样就好了. 注意安装至少 xp 以上的 sdk.
这里用到了一个 api SetUnhandledExceptionFilter(), 如果不明白可以搜一下 msdn.
运行例子程序出错退出之后, 就得到了 c://user.dmp. 可以用 windbg 等调试器来分析了.  

代码从这里下载 http://nicoster.googlepages.com/minidump.rar



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1553027

你可能感兴趣的:(自己创建 minidump (自认为精品) (转))