我的程序遇到了严重的问题,该问题仅在客户处复制。放置日志无济于事,因为我怀疑故障发生在第三方dll中。由于某些原因,我无法从图书馆提供商那里获得帮助。我正在考虑在故障点生成转储,以便离线分析它。这是推荐做法吗?还是其他选择?
最佳答案
是的,这是每个程序都应该拥有并尽可能多地利用的东西。
我建议您不要使用第三方库。而是创建自己的转储。这非常简单直接。您基本上需要执行以下操作:
您的程序需要访问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()将负责生成minidump(或调用链中的某些其他函数)。另外,如果您的程序中存在自定义错误,例如某些本不应该发生的事情,但从技术上讲也不是例外,您可以使用RaiseException()创建自己的事物。
GetExceptionInformation()只能在此上下文中使用,而在程序执行期间则不能在其他地方使用。
关于debugging - 在客户环境中创建内存转储是否良好?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/900921/