如果你还不清楚什么是转储文件,不知道什么时候需要转储文件,请参考转储文件系列文章的第一篇 —— 转储文件知多少。
前言
不知道各位小伙伴有没有遇到过 微信
或者 QQ
崩溃的情况。它们在崩溃的时候都会自动弹出一个对话框,提示用户上传相关文件,供开发人员分析问题的原因。有的小伙伴儿可能不太清楚我在说什么。没关系,下图就是微信崩溃后自动弹出的界面。
![73feea47d2868454c41160c71b693a7b.png](https://i-blog.csdnimg.cn/blog_migrate/971d4133b09f41741577967d2af291ce.jpeg)
如果勾选了 发送错误报告(S)
按钮,点击 确定(O)
按钮后,会把收集到的文件上传给开发人员。同样的,如果勾选了 重启程序(R)
,点击 确定(O)
按钮后,微信会自动重启。有没有觉得很酷?我们自己的程序可以做到类似的效果吗?答案是肯定的。如果感兴趣,就请继续阅读吧!
MiniDumpWriteDump
微软提供了专门的 API
来生成转储文件,这个 API
就是 MiniDumpWriteDump()
。
BOOL MiniDumpWriteDump(
HANDLE hProcess,
DWORD ProcessId,
HANDLE hFile,
MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);
简单介绍下每个参数:
hProcess
:要转储的进程句柄。打开进程的时候,至少需要指定
PROCESS_QUERY_INFORMATION
和PROCESS_VM_READ
权限。如果需要转储 句柄信息,还需要PROCESS_DUP_HANDLE
权限。如果需要转储线程信息,需要THREAD_ALL_ACCESS
权限。ProcessId
:要转储的进程ID
。有点不太理解为什么要额外传递一个进程 ID 的参数,调用
GetProcessId()
就可以根据hProcess
获取进程 ID 了,难道是为了效率?希望有知道的小伙伴儿指点一二。hFile
:通过CreateFile()
等API
打开的,用来保存dump
的文件句柄。DumpType
:转储类型。此参数会直接影响转储文件的大小,如果想自己写一个手动收集dump
的工具,了解下这个参数会很有用。稍后介绍。ExceptionParam
:指向异常信息结构MINIDUMP_EXCEPTION_INFORMATION
的指针。如果本参数为NULL
,则转储文件中不会包含异常信息。
typedefstruct _MINIDUMP_EXCEPTION_INFORMATION {