在保留一些堆信息的同时减少托管程序的小型转储的大小?

Posted

技术标签:

【中文标题】在保留一些堆信息的同时减少托管程序的小型转储的大小?【英文标题】:Reducing the size of minidumps of managed programs while keeping some heap information? 【发布时间】:2010-07-27 13:51:09 【问题描述】:

借助 .NET 4.0 中的转储调试支持,我们正在自动研究(当然是在询问用户之后:)创建 C# 程序崩溃的小型转储,以将它们上传到我们的问题跟踪系统(以便小型转储可以帮助解决崩溃的原因)。

使用 WithFullMemory 小型转储类型时一切正常。我们可以看到堆栈和堆变量。不幸的是,即使对于小型 C# 程序,(压缩的)转储也相当大。

如果我们使用“Normal”小型转储类型,我们会得到一个非常小的转储,但在托管调试器中甚至没有堆栈变量信息可用。事实上,任何低于 WithFullMemory 的东西在托管调试器中似乎都毫无用处。我们曾尝试使用 MINIDUMP_CALLBACK_ROUTINE 将包含的模块信息限制在我们自己的模块中,但似乎它对托管转储几乎没有影响,但仍然设法破坏托管调试?

有没有人有关于如何修剪小型转储同时保持它对托管调试有用的任何提示?

【问题讨论】:

【参考方案1】:

我使用以下标志来节省空间将为 C++ 应用程序生成有用的小型转储:

MiniDumpWithPrivateReadWriteMemory | 
            MiniDumpWithDataSegs | 
            MiniDumpWithHandleData |
            MiniDumpWithFullMemoryInfo | 
            MiniDumpWithThreadInfo | 
            MiniDumpWithUnloadedModules

标志值在 DbgHelp.h 中指定,需要编组到 C# 中。通过指定 CallbackRoutine 进一步限制转储。

【讨论】:

【参考方案2】:

仅供参考,如上所述,ClrDump 看起来很酷,但它似乎只适用于 1.1。和 2.0 运行时。

【讨论】:

【参考方案3】:

恕我直言,我强烈建议您注册一个 Microsoft WinQual 帐户,向 Microsoft 注册您的应用程序。

http://www.microsoft.com/whdc/winlogo/maintain/StartWER.mspx

您不仅可以利用 Microsoft 广泛的崩溃收集和分析服务(免费!),还可以通过 Windows 的内置错误报告工具为您的应用程序发布修复和补丁。

此外,通过参与 WinQual 计划,部署您的应用程序和使用内部 Windows 错误报告系统的企业也将能够收集、报告和接收您的应用程序的补丁。

另一个好处是,使用 WinQual,您离获得应用徽标认证更近了一步!

与使用自己的崩溃收集和报告系统相比,与我合作过的每一个使用 WinQual 的 OEM 和 ISV 都节省了大量的精力和费用。

【讨论】:

尽管我支持 WinQual:在隐私方面,微软在许多用户中仍然名声不佳。我认识很多人,他们永远不会发送其中一个崩溃转储,而他们会很乐意将它们直接发送给开发人员。有时,情感胜过争论,并且滚动你自己的崩溃集合是要走的路。但这取决于应用的目标受众。 1) 大多数人不太关心对 Microsoft 的声誉发表意见 2) 许多用户宁愿将故障转储发送给 Microsoft,也不愿发送给他们不认识的公司/实体,知道或信任。 3) 许多恶意软件通过弹出警告消息来抓取用户数据,用户点击该警告消息然后授权 UAC。接下来他们知道,用户的机器将无法启动,因为他们现在已被安装的恶意软件感染。 90% 的情况下,最好支持操作系统的内置错误报告基础架构。 感谢您的建议,但 WinQual 与我们无关。【参考方案4】:

我给 ClrDump 的作者写了一封电子邮件,询问他的工具用于在“最小”模式下创建转储的 MINIDUMP_TYPE 参数是什么。我在这里发布了他的答案:What is minimum MINIDUMP_TYPE set to dump native C++ process that hosts .net component to be able to use !clrstack in windbg

【讨论】:

【参考方案5】:

ClrDump 可能会帮助你。

ClrDump 是一组允许生成小型小型转储的工具 托管应用程序。过去,必须使用完整转储 (非常大)如果您需要对 .NET 应用程序。 ClrDump 可以生成包含 足够的信息来恢复所有线程的调用堆栈 应用。

【讨论】:

以上是关于在保留一些堆信息的同时减少托管程序的小型转储的大小?的主要内容,如果未能解决你的问题,请参考以下文章

Java 本机内存跟踪堆提交的数量远远超过堆转储的总数

为啥我的 Java 堆转储大小比已用内存小得多?

调优工具MAT内存分析工具

C++ 捕获程序异常奔溃minidump

SOS windbg 中的啥命令只能为 Gen 2 和 LOH 转储堆?

减少 SVN 存储库大小