在客户端的计算机上调试版本

时间:2011-09-09 02:14:56

标签: c++ visual-studio debugging pdb-files visual-studio-debugging

我们有一个使用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?

有人可以描述这个过程吗?

6 个答案:

答案 0 :(得分:11)

我们可以从我们的Release版本中获取崩溃转储,并且不需要将pdb文件与我们的产品一起发送。

我相信,我们使用MiniDumpWriteDump()在我们的顶级异常处理程序中构建调用来创建崩溃转储文件。但即使没有这个,你也可以让用户在崩溃时使用我相信的任务管理器生成崩溃文件,如下所述:MSDN Instructions for creating dump file

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

Example from a dump I just created from a MS process

答案 1 :(得分:6)

你应该拥有的过程如下:

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

    • WinDbg对于在生产环境中进行调试非常有用。它是一个非常强大的调试器,它是可移植的,但是如果你已经习惯了VS,那么使用它会更加舒服。
    • 如果您创建一个minidump,您将获得堆栈跟踪和一些变量值。如果您创建完整转储,您将获得完整的堆,包括所有变量 - 以及更大的转储文件......如果转移不是问题,请使用完全转储。
    • 如果您register at Microsoft,您可以访问在程序在客户端站点崩溃时创建的转储。这是令人讨厌的“将信息发送给微软?”当进程崩溃将转储发送给MS时,您获得的窗口,您将可以访问它...

答案 2 :(得分:5)

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

无论如何,你试过google Breakpad吗?

  

Breakpad是一个库和工具套件,允许您分发   使用编译器提供的调试信息向用户应用程序   删除,记录紧凑的“minidump”文件中的崩溃,将它们发回   您的服务器,并从这些小型转储产生C和C ++堆栈跟踪。   Breakpad也可以根据请求编写minidumps   没有坠毁。

     

Breakpad目前由Google Chrome,Firefox,Google Picasa使用,   Camino,Google Earth和其他项目

您可以在此处找到它:http://code.google.com/p/google-breakpad/

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

答案 3 :(得分:3)

我之前做过这个,我想我跟着this guide。如果它不起作用,请查看Windbg实用程序,我记得您不需要安装它,只需复制并运行,即使是从USB记忆棒

答案 4 :(得分:3)

我在DDj上写了两篇关于事后调试的文章,这可能对你有帮助:

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

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

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

答案 5 :(得分:1)

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

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