网站代备案流程,做金融看哪些网站有哪些内容,seo网站改版方案怎么写,ppt资源网免费如果你还不清楚什么是转储文件#xff0c;不知道什么时候需要转储文件#xff0c;请参考转储文件系列文章的第一篇 —— 转储文件知多少。前言不知道各位小伙伴有没有遇到过 微信 或者 QQ 崩溃的情况。它们在崩溃的时候都会自动弹出一个对话框#xff0c;提示用户上传相关文… 如果你还不清楚什么是转储文件不知道什么时候需要转储文件请参考转储文件系列文章的第一篇 —— 转储文件知多少。前言不知道各位小伙伴有没有遇到过 微信 或者 QQ 崩溃的情况。它们在崩溃的时候都会自动弹出一个对话框提示用户上传相关文件供开发人员分析问题的原因。有的小伙伴儿可能不太清楚我在说什么。没关系下图就是微信崩溃后自动弹出的界面。微信 Crash Report 界面如果勾选了 发送错误报告(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 {DWORD ThreadId;PEXCEPTION_POINTERS ExceptionPointers;BOOL ClientPointers;} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;
UserStreamParam指向用户自定义信息结构 MINIDUMP_USER_STREAM_INFORMATION 的指针。如果本参数为 NULL则转储文件中不会包含用户定义的信息。typedefstruct _MINIDUMP_USER_STREAM_INFORMATION {ULONG UserStreamCount;PMINIDUMP_USER_STREAM UserStreamArray;} MINIDUMP_USER_STREAM_INFORMATION, *PMINIDUMP_USER_STREAM_INFORMATION;
CallbackParam指向回调例程 MINIDUMP_CALLBACK_INFORMATION 的指针。如果此参数为NULL转储过程中不会执行任何回调例程。typedefstruct _MINIDUMP_CALLBACK_INFORMATION {MINIDUMP_CALLBACK_ROUTINE CallbackRoutine;PVOID CallbackParam;} MINIDUMP_CALLBACK_INFORMATION, *PMINIDUMP_CALLBACK_INFORMATION;
本结构中的CallbackParam 是传递给回调函数的参数用户可以指定一些自己需要传递的参数很常见的做法。CallbackRoutine 是回调函数类型为 MINIDUMP_CALLBACK_ROUTINE 。原型如下typedefBOOL(WINAPI * MINIDUMP_CALLBACK_ROUTINE) (_Inout_ PVOID CallbackParam,_In_ PMINIDUMP_CALLBACK_INPUT CallbackInput,_Inout_ PMINIDUMP_CALLBACK_OUTPUT CallbackOutput);
因为 DumpType会影响最后生成的转储文件的大小这里介绍下这个参数。DumpType 参数DumpType 类型为 MINIDUMP_TYPE。以下定义摘自 10.0.18362.0 版本的 minidumpapiset.h应该是比较全的了。如果你问我你怎么知道 MINIDUMP_TYPE 定义在这个文件里答案很简单用 File Locator 搜的呗。搜索结果typedefenum _MINIDUMP_TYPE {MiniDumpNormal 0x00000000,MiniDumpWithDataSegs 0x00000001,MiniDumpWithFullMemory 0x00000002,MiniDumpWithHandleData 0x00000004,MiniDumpFilterMemory 0x00000008,MiniDumpScanMemory 0x00000010,MiniDumpWithUnloadedModules 0x00000020,MiniDumpWithIndirectlyReferencedMemory 0x00000040,MiniDumpFilterModulePaths 0x00000080,MiniDumpWithProcessThreadData 0x00000100,MiniDumpWithPrivateReadWriteMemory 0x00000200,MiniDumpWithoutOptionalData 0x00000400,MiniDumpWithFullMemoryInfo 0x00000800,MiniDumpWithThreadInfo 0x00001000,MiniDumpWithCodeSegs 0x00002000,MiniDumpWithoutAuxiliaryState 0x00004000,MiniDumpWithFullAuxiliaryState 0x00008000,MiniDumpWithPrivateWriteCopyMemory 0x00010000,MiniDumpIgnoreInaccessibleMemory 0x00020000,MiniDumpWithTokenInformation 0x00040000,MiniDumpWithModuleHeaders 0x00080000,MiniDumpFilterTriage 0x00100000,MiniDumpWithAvxXStateContext 0x00200000,MiniDumpWithIptTrace 0x00400000,MiniDumpScanInaccessiblePartialPages 0x00800000,MiniDumpValidTypeFlags 0x00ffffff,
} MINIDUMP_TYPE;
下面是每个选项的意义主要翻译自官方帮助文档。名称描述MiniDumpNormal只包含调用栈相关信息MiniDumpWithDataSegs包含已加载的模块的数据段信息比如全局变量MiniDumpWithFullMemory包含全部可访问的内存MiniDumpWithHandleData包含句柄信息MiniDumpFilterMemory过滤一些敏感信息保护重建调用栈需要的信息MiniDumpScanMemory扫描以包含引用内存MiniDumpWithUnloadedModules包含最近被卸载的模块信息MiniDumpWithIndirectlyReferencedMemory包含未直接引用的内存MiniDumpFilterModulePaths过滤某块的路径信息MiniDumpWithProcessThreadData包含完整的进程和线程信息MiniDumpWithPrivateReadWriteMemory包含页面属性为 PAGE_READWRITE 的页面MiniDumpWithoutOptionalData不包含可选数据MiniDumpWithFullMemoryInfo包含内存区信息MiniDumpWithThreadInfo包含线程状态信息MiniDumpWithCodeSegs包含所有代码和有关的内存段MiniDumpWithoutAuxiliaryState关闭辅助内存收集MiniDumpWithFullAuxiliaryState使用所有的内存收集器MiniDumpWithPrivateWriteCopyMemory包含页面属性为 PAGE_WRITECOPY 的页面MiniDumpIgnoreInaccessibleMemory忽略不可访问的页面MiniDumpWithTokenInformation包含安全令牌相关信息。可以在调试的时候使用 !token 命令MiniDumpWithModuleHeaders包含模块头相关信息MiniDumpFilterTriage添加与筛选器分类相关的数据MiniDumpWithAvxXStateContextMiniDumpWithIptTraceMiniDumpValidTypeFlags设置所有标志位说明MINIDUMP_TYPE 的值是不断发展变化的向后兼容旧版本的 DbgHelp.dll 可能不支持某些值具体可以参考 微软官方介绍 MINIDUMP_TYPE 的文档[1]。关于MINIDUMP_TYPE 每一项的作用更为详细的介绍请参考 Effective minidumps (Part 1)[2] 和 Effective minidumps (Part 2)[3]。真的是超级详细强烈建议大家点开看一看唯一的遗憾是作者写的比较早很多新出现的标志没总结进来但仍然是非常好的参考资料MiniDumpWriteDump() 可以用来生成转储文件我们应该怎么使用呢使用场景通常我们希望在自己的程序发生异常的时候能自动保存一份转储文件供我们事后分析。我们需要做的大概是捕获各种异常在异常处理函数中判断发生的异常是否能恢复如果不能恢复就保存转储文件和其它一些关键文件比如程序的配置文件出现问题时的屏幕截图等并一起打包并保存然后提示用户让用户上传我们打包好的文件供我们分析。当程序发生异常的时候我们很难确定发生异常的进程的运行状态。所以我们需要启动一个新的进程并在新进程中调用 MiniDumpWriteDump() 来保存异常进程的信息。以上的操作看起来比较简单但是处理起来有很多细节需要考虑。比如我们需要捕获哪些异常怎么捕获这些异常保存好的文件怎么上传通过什么形式上传等等等等…… 如果有可以直接拿来使用的框架就太好了别说还真有相关开源库以上的这些功能早已经有开源软件可以用了。作为一个谦卑的程序员尽量复用现有的轮子吧。给大家推荐一些不错的开源库。CrashRpt[4] 之前在项目里用过如果你想自己手动实现一个类似的可以参考此项目的代码。CrashRpt 官方介绍除了 CrashRptchromium 里使用的 crashpad[5] 也是一个非常好的选择。google 出品质量有保障。crashpad 的前身是 breakpad[6]根据 google 官方介绍breakpad 使用的是进程内报告机制不再建议大家使用。适用于.NET程序的 CrashReporter[7]。其它平台AndroidiOS等也有类似的开源库。可以在 github 上搜索 crash report。我就不截图了。说明本文介绍的方法只适用于我们自己的程序。如果我们想转储其它进程我们需要借助现有工具当然如果有时间和精力也可以自己写一个。关于抓取转储的工具的介绍可以参考之前的文章—— 你需要知道的 N 种抓取 dump 的工具。总结我们可以通过 MiniDumpWriteDump() 来保存转储文件。我们可以借助 CrashRpt, CrashPad 等开源框架来为我们的程序添加崩溃转储功能。参考资料《软件调试》MiniDumpWriteDump 文档[8]Effective minidumps (Part 1)[2]Effective minidumps (Part 2)[3]References:[1]微软官方介绍 MINIDUMP_TYPE 的文档: https://docs.microsoft.com/zh-cn/windows/win32/api/minidumpapiset/ne-minidumpapiset-minidump_type[2]Effective minidumps (Part 1): http://www.debuginfo.com/articles/effminidumps.html[3]Effective minidumps (Part 2): http://www.debuginfo.com/articles/effminidumps2.html[4]CrashRpt: http://crashrpt.sourceforge.net/[5]crashpad: https://github.com/chromium/crashpad[6]breakpad: https://github.com/google/breakpad[7]CrashReporter: https://github.com/ravibpatel/CrashReporter.NET[8]MiniDumpWriteDump 文档: https://docs.microsoft.com/zh-cn/windows/win32/api/minidumpapiset/nf-minidumpapiset-minidumpwritedump猜你喜欢转储文件系列转储文件知多少你需要知道的 N 种抓取 dump 的工具你生成的转储文件有问题吗JIT Debug Info 简介调试系列调试实战——你知道怎么使用DebugView查看调试信息吗调试实战——程序CPU占用率飙升你知道如何快速定位吗调试实战——崩溃在ComFriendlyWaitMtaThreadProc调试实战——使用windbg调试崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs调试实战——调试PInvoke导致的内存破坏调试实战——调试excel启动时死锁调试实战——调试DLL卸载时的死锁调试实战——调试TerminateThread导致的死锁排错系列排错实战——VS清空最近打开的工程记录排错实战——拯救加载调试符号失败的IDA排错实战——你知道拖动窗口时只显示虚框怎么设置吗排错实战——解决Tekla通过.tsep安装插件失败的问题排错实战——使用process explorer替换任务管理器排错实战——通过对比分析sysinternals事件修复程序功能异常欢迎留言交流