在客户端机器上调试发布版本

Posted

技术标签:

【中文标题】在客户端机器上调试发布版本【英文标题】:Debugging release build on a client's machine 【发布时间】:2011-11-13 11:08:01 【问题描述】:

我们有一个使用 Visual Studio 2005 构建的原生 C++ Win32 .exe,它可以在我们内部测试过的所有机器(XP 32 位、Vista 32 位和 Windows 7 64 位)上完美运行。但当然,它会在客户端的 32 位 Vista 机器上反复崩溃。

在几个网站上四处挖掘,我发现了一些花絮,表明我是否将 PDB 文件(vc80.pdb 和 projectName.pdb)连同可执行文件的发布版本一起发送给客户,有一些发生崩溃时生成小型转储的方式。然后,我可以将故障转储加载到 Visual Studio 并获取堆栈跟踪和其他一些有用信息。微软的 Dr. Watson 实用程序似乎也参与了这个过程。

但我找不到任何明确的说明来说明实现这一点的步骤

要发送哪些文件? 如何生成故障转储? 以及如何将其加载到 VS 中?

谁能描述一下这个过程?

【问题讨论】:

我不认为 Dr. Watson 一定会在 Vista 及更高版本中存在。 【参考方案1】:

我们能够从现场构建的版本中获取故障转储,并且不需要将 pdb 文件与我们的产品一起提供。

我们使用 MiniDumpWriteDump() 在我们的***异常处理程序中内置调用来自己创建故障转储文件。但即使没有,您也可以让用户使用任务管理器在崩溃点生成崩溃文件,如下所述:MSDN Instructions for creating dump file。

获得转储文件后,客户会将其压缩并邮寄给您,然后您将其放到 Visual Studio 中。然后在 VS 中选择 Debug with MixedDebug with Native Only,它会使用 pdb 文件的本地副本向您显示调用堆栈等。

【讨论】:

【参考方案2】:

你应该有的过程是这样的:

    编译可执行文件并生成 PDB 文件。确保您不对用于可执行文件的代码进行任何更改,或保留备份。 将可执行文件发送给客户端。无需发送 PDB 文件。发布它的唯一原因是,如果您想在客户端机器上进行调试,或者使用 Process Explorer 之类的工具在某个时候获取带有函数名称的堆栈跟踪。两者似乎都不适用于您的情况。 如果是 XP/2003 机器,请使用 drwtsn32 配置故障转储的创建。如果是Vista/7/2008,drwtsn32已经退役,你应该配置WER instead。另一种选择是使用ADPlus 来启动您的应用。 一旦发生崩溃,将转储返回给您,然后在 Visual Studio 中加载它。您必须拥有完全相同的代码、可执行文件和 PDB 才能顺利调试。

注意:

WinDbg 可用于在生产环境中进行调试。它是一个非常强大的调试器并且它是可移植的,但是如果你习惯了 VS,你会更自如地使用它。 如果您创建一个小型转储,您将获得堆栈跟踪和一些变量值。如果您创建完整转储,您将获得完整的堆,包括所有变量 - 以及更大的转储文件...如果传输没有问题,请使用完整转储。 如果您register at Microsoft,您可以访问当您的程序在客户端站点上崩溃时创建的转储。就是那个烦人的“把信息发给微软?”当进程崩溃时,您会看到将转储发送到 MS 的窗口,您将可以访问它...

【讨论】:

【参考方案3】:

我感觉到你的痛苦。不久前不得不这样做。

无论如何,您尝试过 google Breakpad 吗?

Breakpad 是一个库和工具套件,可让您分发 使用编译器提供的调试信息向用户应用 删除,在紧凑的“小型转储”文件中记录崩溃,将它们发送回 您的服务器,并从这些小型转储中生成 C 和 C++ 堆栈跟踪。 Breakpad 还可以根据要求为具有 没有崩溃。

Breakpad 目前被 Google Chrome、Firefox、Google Picasa、 Camino、Google 地球和其他项目

你可以在这里找到它:http://code.google.com/p/google-breakpad/

它的作用与提到的其他答案相同,但它是自动完成的,为您节省了大量时间和精力

【讨论】:

【参考方案4】:

我前段时间这样做了,我想我关注了this guide。如果它不起作用,请查看 Windbg 实用程序,我记得您不需要安装它,只需复制并运行,即使从 USB 记忆棒也可以

【讨论】:

我确实看过那篇 CodeProject 文章,但它似乎过时了(发表于 2002 年,并且有 VS .Net 2003 的说明)。你知道它是否适用于VS2005吗? (我知道编译器也很古老,但我必须使用它)。 WinDbg 看起来确实很有希望...... +1 我做的时候用的是VS2008。这绝对是可能的,但你可能需要做一些调整【参考方案5】:

我在 DDj 上写了 2 篇关于事后调试的文章,希望对您有所帮助:

事后调试 http://drdobbs.com/tools/185300443

和 重新审视事后调试 http://drdobbs.com/architecture-and-design/227900186

第二篇文章包含源代码,用于使用从 map 或 pdb 文件中检索到的符号信息填充来自客户端计算机的堆栈转储。

【讨论】:

【参考方案6】:

如果您的客户端使用 Vista SP1 或更高版本,您可以将系统配置为在每次应用程序崩溃时生成本地转储文件。您可以在 MSDN site 上找到完整的文档。

您可以将所有 PDB 保密。仅当您实际分析转储文件时才需要这些。如果您想跟踪与您发布的产品版本相对应的 PDB,您应该强烈考虑使用符号服务器。

【讨论】:

以上是关于在客户端机器上调试发布版本的主要内容,如果未能解决你的问题,请参考以下文章

在 64 位机器上捕获的 32 位进程的调试转储

在客户环境中调试崩溃的后续步骤

特定 PostgreSQL 客户端/版本中的慢查询

远程调试客户端计算机

常用软件清单

测试发布版本