Debugging 在客户环境中创建内存转储是否良好?

Debugging 在客户环境中创建内存转储是否良好?,debugging,memory-dump,Debugging,Memory Dump,我的程序面临严重问题,只能在客户处复制。放置日志并没有帮助,因为我怀疑故障是否发生在第三方dll中。由于某些原因,我无法从图书馆供应商那里得到帮助。我正在考虑在故障点生成转储,以便离线分析。这是推荐的做法吗?或任何替代方法?崩溃转储是一种非常常见的故障排除方法,可以非常有效,尤其是对于仅在客户现场重现的问题 只需确保客户/客户了解你在做什么,并且你有权限。崩溃转储可能包含客户可能不希望(或不允许)泄露的敏感信息。比有库可以将崩溃数据上传回您更好 及 还有微软的方式: 免责声明:我不是律师,也不是

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

崩溃转储是一种非常常见的故障排除方法,可以非常有效,尤其是对于仅在客户现场重现的问题


只需确保客户/客户了解你在做什么,并且你有权限。崩溃转储可能包含客户可能不希望(或不允许)泄露的敏感信息。

比有库可以将崩溃数据上传回您更好

还有微软的方式:

免责声明:我不是律师,也不是冒充律师,这不是法律建议

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

调节 某些信息的使用和披露 “涵盖实体”持有的信息 (……)它为 受保护信息的使用和披露 健康信息(PHI)。PHI是任何 涵盖实体持有的信息 这关系到健康状况, 提供医疗保健或支付 可链接到 个人。[10]这是一种解释 相当广泛,包括任何部分 个人的医疗记录或 付款历史记录--维基百科

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


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

是的,这是每个程序都应该尽可能经常拥有和利用的东西

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

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

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

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

我鼓励每一位windows win32开发人员查看Oleg Starodumov的网站。它包含许多示例和教程,以及如何配置和优化转储文件生成。当然,排除某些数据、创建要附加到转储的自定义调试消息等方法有很多种

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

如果有法律方面的问题,只要确保你的客户知道你在做什么。我打赌你已经有了一些合同,你不应该透露商业秘密或其他法律方面。如果客户抱怨,说服他们发现bug是多么重要,这将大大提高软件的质量。或多或少以零成本获得更高的质量。如果他们不为此付出任何代价,这也是一个很好的论据:)

最后,如果您想了解更多关于崩溃转储分析的信息,这里还有一个很棒的站点:

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

干杯

编辑:

只想添加minidumpWriteDomainp()要求您有一个指向MINIDUMP-EXCEPTION-INFORMATION(带下划线)结构的指针。但是GetExceptionInformation()宏在异常处理程序(结构化异常处理或SEH)中发生异常时为您提供以下信息:

YourHandlerFunction()将负责生成迷你转储(或调用链中的其他函数)。此外,如果您的程序中有自定义错误,例如发生了不应该发生的事情
__try {

}
__except (YourHandlerFunction(GetExceptionInformation())) {

}