减小托管程序的迷你转储文件大小同时保留一些堆信息?

17

在.NET 4.0中,借助转储调试支持,我们正在研究在C#程序崩溃后自动(当然要经过用户确认 :))创建minidumps并上传到我们的问题跟踪系统中,以便这些minidumps能帮助解决崩溃原因。

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

如果我们使用“普通”minidump类型,则可以获得非常小的dump文件,但是受控调试器中甚至没有可用的堆栈变量信息。实际上,任何比WithFullMemory更少的选项在受控调试器中似乎都没有什么用处。我们尝试使用MINIDUMP_CALLBACK_ROUTINE将包含的模块信息限制为我们自己的模块,但似乎几乎对受控dump没有影响,但却仍然破坏了受控调试?

有人有什么提示可以在保持minidump有用的前提下修剪它们吗?

5个回答

3

我在生成C++应用程序有用的迷你转储时使用以下标志来节省空间:

MiniDumpWithPrivateReadWriteMemory | 
            MiniDumpWithDataSegs | 
            MiniDumpWithHandleData |
            MiniDumpWithFullMemoryInfo | 
            MiniDumpWithThreadInfo | 
            MiniDumpWithUnloadedModules

标志值在DbgHelp.h中指定,需要将其转换为C#。通过指定CallbackRoutine进一步限制转储。


1

仅供参考,正如上面提到的那样,ClrDump看起来非常酷,但似乎只能与1.1和2.0运行时一起使用。


1

恕我直言,我强烈建议您注册Microsoft WinQual账户,并将您的应用程序注册到Microsoft。

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

这将使您不仅能够免费利用微软广泛的崩溃收集和分析服务,还可以通过Windows内置的错误报告工具发布应用程序的修复和补丁。

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

另一个好处是,采用WinQual,您离获得应用程序标志认证更近了一步!

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


尽管我支持WinQual:微软在隐私方面仍然在许多用户中拥有不良声誉。我知道很多人永远不会发送这些崩溃转储,而他们会乐意直接将它们发送给开发者。有时情感胜过论据,自行滚动您自己的崩溃收集是正确的方式。但这取决于应用程序的目标受众。 - Michael Stum
  1. 大多数人对微软的声誉并不关心。
  2. 许多用户宁愿将崩溃转储发送给微软,而不是发送给他们不认识、不了解或不信任的公司/实体。
  3. 很多恶意软件通过弹出警告消息来搜集用户数据,用户点击后授权UAC。接下来,用户的机器就无法启动,因为已经被安装的恶意软件感染了。
90%的时间里,支持操作系统内置的错误报告基础设施更好。
- Rich Turner
谢谢您的建议,但WinQual对我们来说不相关。 - Ziphnor

0

ClrDump 可能会对你有所帮助。

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


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接