3

不久前,我们了解到即使发布版本也可能无法正常运行 - 可能会下降 - 可能会挂起等等。所以我们决定实施转储创建过程。在 Internet 上很快找到了所有步骤。但是一个——主要的事情——对我们来说仍然是无法理解的。

根据 MSDN,MINIDUMP_TYPE 支持 23 个标志。但是对于下一个问题没有深入的技术解释:它们在各自的应用领域中都是独立的吗?或者它们可以成对使用,三联使用?它们都可以同时使用吗?我可以在某些组中使用它们吗(例如,一些 3 个标志 - 与其他 5 个标志几乎生成相同的转储。)我的意思是当我将使用前。1+3 标志 - 绝对等同于使用标志 4+6+9。或标志 1 或标志 3 或 ... - 是所有其他标志的叠加吗?或者是什么?我想了解所有可用标志之间所有可能的交叉。因为使用标志 3+12+14 可能没有实际意义。例如,我目前的目标是使用内存中绝对所有可用数据创建转储。我应该能够查看所有线程,所有 local-static-global-in_heap 变量。我的意思是,当我打开一些使用 bla+bla+bla 标志组合生成的转储时 - 它应该与我可以将调试器直接附加到进程的情况完全相同。我应该获得所有可能的数据!

PS MiniDumpWithFullMemory - 没有给我这样的能力(((为什么?这个词@FULL@ memory - 并不意味着FULL?它只是什么的一部分?

4

3 回答 3

4

一个小型转储包含一堆代表一个进程的片段。进程使用的内存只是其中的一部分。关于线程、句柄等的元数据都是附加部分。

所有这些数据都存储在 .dmp 文件中的单独“流”中(可以在此处查看列表)。

通过MiniDumpWriteDump的一些标志来选择要包含的这些流中的哪一个。然后使用一大块标志来自定义要在内存流中包含多少内存,这只是为了让开发人员可以最小化生成文件的大小。对于我们生成的所有故障转储,我们通常使用这些MINIDUMP_TYPE标志:

MiniDumpWithFullMemory | MiniDumpWithHandleData | MiniDumpWithModuleHeaders | 
MiniDumpWithUnloadedModules | MiniDumpWithProcessThreadData | 
MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo


WinDbg 有一个未记录的命令,可用于转储崩溃转储文件的内部内容:

.dumpdebug

您可以在查看故障转储文件时使用它来查看包含哪些流、查看所有模块、内存部分等。

于 2013-08-17T21:03:06.163 回答
1

对于 VS 2010,它无法识别MINIDUMP_TYPE标志MiniDumpWithModuleHeaders。以下标志对我有用:-

MiniDumpWithFullMemory | MiniDumpWithHandleData | MiniDumpWithUnloadedModules |
MiniDumpWithUnloadedModules | MiniDumpWithProcessThreadData | 
MiniDumpWithFullMemoryInfo | MiniDumpWithThreadInfo | 
MiniDumpWithFullAuxiliaryState | MiniDumpIgnoreInaccessibleMemory |
MiniDumpWithTokenInformation
于 2014-08-05T08:58:26.453 回答
0

供将来参考,并且由于信息仍然很少可用:已经提出了类似的问题,请参阅MINIDUMP_TYPE 枚举值的哪种组合将为我提供最“完整”的小型转储?. 答案提到了优秀的(尽管有点)过时的调试资源 DebugInfo.com,特别是指向文章http://www.debuginfo.com/articles/effminidumps.html#minidumptypes。请注意,确实没有解释新的标志(自 Windows 7 和可能的早期版本,如 Windows Vista 起可用)。似乎没有全面的MINIDUMP_TYPE标志版本历史,API 文档给出的最小版本似乎并不总是正确的,因为我过去使用标志时遇到过问题,例如MiniDumpWithFullMemoryInfo据称自 Windows 7 上的 DbgHelp.dll 6.1 起可用,直到我将 DbgHelp.dll 6.8 版升级到(最新的 Windows 7)DbgHelp.dll 6.12 版。

Windows 7 确实引入了 Windows 错误报告 (WER) 并查看WerReportAddDump的文档,一个人会偶然发现(除其他外)WerDumpTypeHeapDump,其中(截至 2020 年 7 月 27 日)似乎等同于小型转储类型

MiniDumpWithDataSegs
 | MiniDumpWithProcessThreadData
 | MiniDumpWithHandleData
 | MiniDumpWithPrivateReadWriteMemory
 | MiniDumpWithUnloadedModules
 | MiniDumpWithFullMemoryInfo
 | MiniDumpWithThreadInfo
 | MiniDumpWithTokenInformation
 | MiniDumpWithPrivateWriteCopyMemory

最后三个标志显然仅在 Windows 7 之后才可用(并且需要足够新的 DbgHelp.dll)。这似乎是 WER 可以记录的最全面的转储(忽略自定义转储类型),并且可能是一个很好的起点,就应该为事后调试记录的最少信息而言,就像调试器附加到进程一样预先。

于 2020-07-27T20:39:03.023 回答