在客户机上调试发布版本构建

18
我们有一个使用Visual Studio 2005构建的本地C ++ Win32 .exe,可以在我们内部测试过的所有机器上(XP 32位,Vista 32位和Windows 7 64位)无缝运行。但是,当然,在客户的32位Vista机器上反复崩溃。
在几个网站上进行搜索后,我发现如果向客户端提供Release版本的可执行文件时连同PDB文件(vc80.pdb和projectName.pdb),则可以在崩溃发生时生成minidump。然后,我可以将崩溃转储文件加载到Visual Studio中,并获得堆栈跟踪和其他有用信息。微软的Dr. Watson实用程序似乎也涉及此过程。
但是,我找不到任何清晰的说明要遵循哪些步骤才能实现这一点:
- 哪些文件需要提供? - 如何生成崩溃转储文件? - 如何将其加载到VS中?
请问有人可以描述一下这个过程吗?

1
我认为在Vista及以后的操作系统中不能保证存在Dr. Watson。 - Ken Wayne VanderLinde
6个回答

12

我们能够从我们在外地发布的 Release 版本中获取崩溃转储信息,并且不需要将 pdb 文件随产品一同发货。

我们在我们的顶层异常处理程序中建立了调用以创建崩溃转储文件,使用 MiniDumpWriteDump()。但即使没有设置这个,你也可以让用户在崩溃点使用任务管理器生成崩溃文件,如此文档中所述:MSDN 创建转储文件的说明

一旦你有了转储文件,客户将其压缩并发送给你,你将其放在 Visual Studio 中。在 VS 中,你可以选择混合调试仅本机代码调试,它将使用你本地副本的 pdb 文件来显示调用堆栈等信息。

我刚刚从 MS 进程创建的示例


6
你应该按照以下步骤进行:
  1. 编译可执行文件并生成PDB文件。确保不对用于可执行文件的代码进行任何更改,或者备份。
  2. 将可执行文件发送给客户端。无需发送PDB文件。唯一需要发送它的原因是如果您想在客户端机器上调试,或者在某个时候使用像Process Explorer这样的工具获取带有函数名称的堆栈跟踪。在您的情况下似乎都不适用。
  3. 如果是XP/2003机器,请使用drwtsn32配置崩溃转储的创建。如果是Vista/7/2008,则drwtsn32已经停用,您应该配置WER。另一个选项是使用ADPlus启动您的应用程序。
  4. 一旦发生崩溃,请将转储发送回您,并在Visual Studio中加载它。您必须手头有完全相同的代码、可执行文件和PDB才能顺利调试。

注意:

  • WinDbg对于在生产环境中进行调试非常有用。它是一个非常强大的调试器,而且它是可移植的,但如果您习惯使用VS,那么使用它会更加舒适。
  • 如果您创建了一个minidump,您将获得堆栈跟踪和一些变量值。如果您创建了一个完整的转储,您将获得完整的堆,包括所有变量 - 以及一个更大的转储文件...... 如果传输不是问题,请使用完整的转储。
  • 如果您在Microsoft注册,您可以访问在客户站点上程序崩溃时创建的转储。当进程崩溃时出现的那个烦人的“将信息发送给Microsoft?”窗口将转储发送到MS,您将可以访问它......

5

我深知你的苦楚。之前我也经历过这样的事。

不管怎样,你尝试过使用 Google Breakpad 吗?

Breakpad 是一个库和工具套件,可以让你在分发应用程序时删除编译器提供的调试信息,在紧凑的“minidump”文件中记录崩溃信息,将其发送回服务器,并从这些 minidump 中生成 C 和 C++ 堆栈跟踪。Breakpad 还可以按请求为尚未崩溃的程序编写 minidump。

目前,Breakpad 被 Google Chrome、Firefox、Google Picasa、Camino、Google Earth 等项目使用。

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

它做的事情与其他回答提到的相同,但它是自动完成的,可以节省你大量时间和精力。


3

我之前做过这个,我想我遵循了这篇指南。如果不起作用,请查看Windbg实用程序,我记得你不需要安装它,只需复制和运行,甚至可以从USB设备中运行。


我确实看到了那篇 CodeProject 的文章,但它似乎过时了(发布于2002年,并且有 VS .Net 2003 的说明)。您知道它是否适用于 VS2005吗?(我知道编译器也很老,但我不得不使用它)。WinDbg 看起来很有前途... +1 - Praetorian
当我做这件事时,我使用的是VS2008。这肯定是可能的,但你可能需要进行一些调整。 - dario_ramos

3

1

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

您可以保留所有PDB私有。只有在实际分析转储文件时才需要它们。如果您想跟踪与您发货的产品版本相对应的PDB,那么您应该强烈考虑使用符号服务器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接