当前位置:  开发笔记 > 小程序 > 正文

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

如何解决《在客户环境中创建内存转储好吗?》经验,为你挑选了1个好方法。

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



1> ralphtheninj..:

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

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

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

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

现在,当你在这里时,有几件事需要考虑.检查这样的转储文件时,需要在编译和链接可执行文件时生成.pdb文件.否则,不可能将转储数据映射到人类可读数据,例如获取良好的callstack和变量值等.这也意味着您必须保存这些.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()只能在此上下文中使用,在程序执行期间不能在其他任何地方使用.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有