让程序崩溃时自动创建minidump
创建Minidump实际上相当的简单。主要是调用了dbghelp.dll提供的APIMiniDumpWriteDump。
函数原型是:
BOOL MiniDumpWriteDump (
HANDLE hProcess,
DWORD ProcessId,
HANDLE hFile,
MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);
前两个参数分别是当前程序的句柄和ID,分别用GetCurrentProcess(), GetCurrentProcessId(),这两个函数就可以获得了。第三个参数是文件句柄,一般我们用CreateFile来创建一个XXX.dmp的文件,而返回的句柄就是我们所需要的。DumpType是Minidump的类型,一般来说设置为MiniDumpNormal就可以了。接下来就是最关键的一个参数ExceptionParam,这是一个指向MINIDUMP_EXCEPTION_INFORMATION 结构的指针。如果不填充这个结构那么我们的minidump就不能达到理想的效果,我会在后面谈到怎么填充这个结构。最后两个参数我认为在这里没有多大用处,我们可以简单的赋值为NULL。
接下来的问题就是,我们怎么在程序崩溃的时候自动的创建Minidump。这里我们就要用到一个Kernel32.dll提供的APISetUnhandledExceptionFilter 。如果读过《软件调试》等书籍的朋友肯定知道,这个函数是用来设置最后的异常处理函数的。也就是当程序产生异常的时候,如果程序自身没有处理就会调用这个函数设置的异常处理函数来处理这个异常。
有了这个函数的帮助,我们就可以在程序开始的时候设置最后的异常处理函数。并在这个函数中调用MiniDumpWriteDump 。这样就可以达到理想的效果。
不过我还是觉得这个不够方便,因为我每次创建一个程序,都需要调用这个函数。能不能有一个更好的方法呢?的确是有的,我们可以写一个创建minidump的类,然后在类的构造函数中调用SetUnhandledExceptionFilter 来设置异常处理函数。最后的效果就是只需要我们加入事先写好的.h和.cpp文件,然后什么也不用做,直接编译运行就能达到理想的效果了。
再来看看我们所生成的Minidump的效果,将生产的dmp文件拖入windbg,然后!analyze -v,可以看到以下信息:
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
