4

我的程序面临一个严重的问题,该程序只能在客户处复制。放置日志并没有帮助,因为我怀疑第三方 dll 中发生了故障。由于某些原因,我无法从图书馆提供者那里获得帮助。我正在考虑在故障点产生转储,以便离线分析它。这是推荐的做法吗?或者有什么替代方案?

4

5 回答 5

5

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

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

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

在 dbghelp.dll 中,您调用例如MiniDumpWriteDump(),它将创建转储文件,这或多或少是它。你完成了。一旦您掌握了该文件,就可以开始使用它。在 Visual Studio 调试器中,甚至可能与 .dmp 文件扩展名相关联,或者在 WinDbg 中。

现在,当你在做的时候,有一些事情需要考虑。像这样检查转储文件时,您需要在编译和链接可执行文件时生成 .pdb 文件。否则没有机会将转储数据映射到人类可读数据,例如获得良好的调用堆栈和变量值等。这也意味着您必须保存这些 .pdb 文件。您需要能够将它们与该版本完全匹配。由于转储文件带有可执行文件的日期戳,因此调试器需要确切的 pdb 文件。如果你的代码没有改变一点也没关系,如果 .pdb 文件属于另一个编译会话,你就完蛋了。

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

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

如果有法律方面的问题,请确保您的客户知道您在做什么。我敢打赌,您已经签订了一些合同,您不应该透露商业机密或其他法律方面的内容。如果客户抱怨,请说服他们发现错误是多么重要,这将大大提高软件的质量。或多或少的质量更高,不惜一切代价。如果它不花费他们任何费用,那也是一个很好的论据:)

最后,如果您想了解更多关于故障转储分析的信息,这里是另一个很棒的网站:dumpanalysis.org

希望这可以帮助。如果您想让我解释更多,请发表评论。

干杯!

编辑:

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

__try {

}
__except (YourHandlerFunction(GetExceptionInformation())) {

}

YourHandlerFunction() 将负责生成小型转储(或调用链中的其他一些函数)。此外,如果您的程序中有自定义错误,例如发生了不应该发生但技术上不是异常的事情,您可以使用RaiseException()来创建自己的错误。

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

于 2009-05-23T09:25:22.873 回答
4

故障转储是一种非常常见的故障排除方法,并且非常有效,尤其是对于仅在客户站点重现的问题。

只需确保客户/客户了解您在做什么并且您获得许可。故障转储可能包含客户可能不希望(或被允许)走出门或通过电线的敏感信息。

于 2009-05-23T05:40:05.187 回答
1

更好的是,有一些库可以将崩溃数据上传回您。

BugDumpBugSplat

还有微软的方式:

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

于 2009-05-23T06:10:19.990 回答
0

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

您可以包含在日志和故障转储中的数据还取决于您在哪个领域工作。例如,医疗设备和患者信息系统通常包含有关患者的敏感数据,未经授权的人员不应看到这些数据。

HIPAA 隐私规则规范了“受保护实体”持有的某些信息的使用和披露(...),它为受保护的健康信息 (PHI) 的使用和披露制定了法规。PHI 是涵盖实体持有的任何与个人相关的与健康状况、医疗保健提供或医疗保健支付有关的信息。 [10] 这被解释得相当广泛,包括个人医疗记录或付款历史的任何部分。——维基百科

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

也许这不适用于您的具体情况,因此这更像是一般性说明。我认为它适用于处理敏感信息的其他领域,例如军事和金融等。

于 2009-05-23T06:44:28.233 回答
0

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

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

使用 adplus 必须做的事情:

  1. 将 Windows 调试工具下载并安装到 c:\debuggers
  2. 启动您的应用程序
  3. 打开命令行并导航到 c:\debuggers
  4. 运行这一行“adplus -crash your_exe.exe”
  5. 重现崩溃

你会得到一个包含你需要的所有信息的小型转储。您可以在您最喜欢的调试器中打开故障转储。在 windbg 中,命令“analyze -v”帮助我解决了至少 40% 的仅发生在客户现场且无法在内部重现的崩溃。

于 2009-05-26T15:29:36.070 回答