在客户环境中创建内存转储好吗?

时间:2009-05-23 05:26:57

标签: debugging memory-dump

我的程序遇到严重问题,只能在客户所在地进行复制。放入日志,没有帮助,因为我怀疑第三方DLL发生了故障。出于某些原因,我无法从图书馆提供商处获得帮助。我正在考虑在失败时生成转储,以便离线分析它。这是推荐的做法吗?或任何其他选择?

5 个答案:

答案 0 :(得分:5)

是的,这是每个程序应该尽可能多地使用和使用的东西。

我建议您不要使用第三方库。改为创建自己的转储。这非常简单直接。您基本上需要执行以下操作:

您的程序需要访问 dbghelp.dll 。它是一个Windows dll,允许您创建人类可读的调用堆栈等。调试器使用此dll显示您的过程中的数据。它还处理事后调试,即某种转储。这个DLL可以安全地与您的软件一起分发。我建议您下载并安装Debugging Tools for Windows。这将使您可以访问各种工具和最佳工具 WinDbg.exe ,最新的dbghelp.dll也在该发行版中。

在dbghelp.dll中,您可以调用例如 MiniDumpWriteDump(),它将创建转储文件,或多或少。你完成了。只要您手中有该文件,就可以开始使用它。可能在Visual Studio Debugger中,甚至可能与.dmp文件扩展名关联,或者在WinDbg中。

现在,当你在这里时,有几件事需要考虑。检查这样的转储文件时,需要在编译和链接可执行文件时生成.pdb文件。否则,不可能将转储数据映射到人类可读数据,例如,获得好的callstacks和变量值等。这也意味着你必须保存这些.pdb文件。您需要能够将它们与该版本完全匹配。由于转储文件的日期标记有可执行文件的日期戳,因此调试器需要准确的pdb文件。如果您的代码没有更改一个位,那么无关紧要,如果.pdb文件属于另一个编译会话,那么您就是干杯。

我鼓励每个Windows win32开发人员查看Oleg Starodumov的网站DebugInfo.com。它包含大量示例和教程,以及如何配置和调整转储文件生成。当然有多种方法可以排除某些数据,创建自定义调试消息以附加到转储等。

请记住,minidumps将包含有关异常时应用程序状态的非常有限的信息。权衡是一个小文件(大约50-100 kB,具体取决于您的设置)。但是如果需要,可以创建一个完整转储,它将包含整个应用程序的状态,即全局甚至内核对象。这些文件可能很大,只能在极端情况下使用。

如果存在法律方面,请确保您的客户了解您正在做的事情。我打赌你已经有了一些合同,你不应该透露商业机密或其他法律方面。如果客户抱怨,说服他们发现错误是多么重要,这将大大提高软件的质量。或多或少的高品质,无所作为。如果它没有花费任何成本,这也是一个很好的论据:)

最后,如果您想了解有关崩溃转储分析的更多信息,请访问以下网站:dumpanalysis.org

希望这会有所帮助。如果您想让我解释一下,请发表评论。

干杯!

编辑:

只是想补充说明 MiniDumpWriteDump()要求你有一个指向MINIDUMP-EXCEPTION-INFORMATION(带下划线)结构的指针。但 GetExceptionInformation()宏在您的异常处理程序(结构化异常处理或SEH)中的异常时为您提供此功能:

__try {

}
__except (YourHandlerFunction(GetExceptionInformation())) {

}

YourHandlerFunction()将负责生成minidump(或调用链中的其他一些函数)。此外,如果您的计划中有自定义错误,例如发生的事情不应该发生但技术上也不例外,您可以使用 RaiseException()来创建自己的。

GetExceptionInformation()只能在此上下文中使用,而在程序执行期间不能在其他任何地方使用。

答案 1 :(得分:4)

崩溃转储是一种非常常见的故障排除方法,非常有效,特别是对于仅在客户站点重现的问题。

确保客户/客户了解您正在做什么以及您是否有权限。崩溃转储可能包含客户可能不希望(或被允许)走出门或电线的敏感信息。

答案 2 :(得分:1)

更好的是,有些库会将崩溃数据上传回你。

BugDumpBugSplat

还有微软的方式:

http://msdn.microsoft.com/en-us/library/aa936273.aspx

答案 3 :(得分:0)

免责声明:我不是律师,也不是假装的,这不是法律建议。

您可以包含在日志和崩溃转储中的数据还取决于您正在使用的域。例如,医疗设备和患者信息系统通常包含有关未经授权人员不应看到的患者的敏感数据。

  

The HIPAA Privacy Rule规范   使用和披露某些   “涵盖实体”持有的信息   (...)制定规则   保护的使用和披露   健康信息(PHI)。 PHI是任何   被保险实体持有的信息   涉及健康状况,   提供医疗保健或支付   可以与之相关的医疗保健   个人。[10]这是解释   相当广泛,包括任何部分   个人的医疗记录或   支付历史。 - 必

不应该将健康信息与个人联系起来。崩溃转储和日志应该匿名并删除任何敏感信息,或者根本不发送。

这可能不适用于您的具体情况,因此这更像是一般情况。我认为它适用于处理敏感信息的其他域,例如军事和财务等。

答案 4 :(得分:0)

基本上,生成转储文件的最简单方法是使用adplus。您无需更改代码。

Adplus是Windows调试工具的一部分,如上文所述。 Adplus基本上是windbg的一个巨大的vbscript自动化。

使用adplus需要做什么:

  1. 下载并安装Windows的调试工具到c:\ debuggers
  2. 启动您的申请
  3. 打开命令行并导航到c:\ debuggers
  4. 运行此行“adplus -crash your_exe.exe”
  5. 重现崩溃
  6. 您将获得一个包含所需信息的minidump。 您可以在您喜欢的调试器中打开故障转储。 在windbg中,命令“analyze -v”帮助了我至少40%的碰撞事故,这些事故只发生在客户现场并且无法在内部重现。

相关问题