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

问题描述 投票:17回答:6

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

在几个网站上四处搜寻,我发现了一些花絮,这些花絮指示是否将PDB文件(vc80.pdb和projectName。pdb)以及可执行文件的Release版本一起交付给客户,有某种方式可以生成小型转储当发生崩溃时。然后,我可以将故障转储加载到Visual Studio中,并获得堆栈跟踪和一些其他有用的信息。微软的Dr. Watson实用程序似乎也参与了此过程。

但是我无法找到明确的说明来实现此步骤

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

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

c++ visual-studio debugging pdb-files visual-studio-debugging
6个回答
12
投票

我们能够从我们的Release版本中获取故障转储,并且可以在现场将pdb文件与我们的产品一起交付。

我们通过使用MiniDumpWriteDump()在顶级异常处理程序中自行创建崩溃转储文件的调用。但是即使没有这些,您也可以让用户在崩溃时使用任务管理器生成崩溃文件,如此处记录的那样:MSDN Instructions for creating dump file

一旦有了转储文件,客户就会将其压缩并邮寄给您,然后将其拖放到Visual Studio上。在VS中,然后选择使用混合调试]或仅使用本机调试,它使用pdb文件的本地副本向您显示调用堆栈,等等。>

“我刚从MS进程创建的转储中的示例”

您应该具有的过程如下:

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

    • WinDbg对于在生产环境中进行调试非常有用。它是一个非常强大的调试器,并且可移植,但是如果您习惯于VS,使用它会更自在。
    • 如果创建一个小型转储,您将获得堆栈跟踪和一些变量值。如果创建一个完整的转储,您将获得完整的堆,包括所有变量-以及一个更大的转储文件...如果传输没有问题,请使用完整转储。
    • 如果您是register at Microsoft,则可以访问程序在客户端站点上崩溃时创建的转储。就是令人讨厌的“将信息发送给Microsoft吗?”进程崩溃时出现的窗口,它将转储发送到MS,您将可以访问它...
    • 我感到你很痛苦。不得不这样做。

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

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

      [Breakpad目前由Google Chrome,Firefox,Google Picasa, Camino,Google地球和其他项目

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

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

      我前一段时间做过,我想我遵循了this guide。如果它不起作用,请检查Windbg实用程序,我记得您不需要安装它,只需复制并运行,甚至可以从USB记忆棒运行]

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

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

      和再次进行事后调试http://drdobbs.com/architecture-and-design/227900186

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

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

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


    6
    投票

    您应该具有的过程如下:

    1. 编译可执行文件并生成PDB文件。确保您不对可执行文件使用的代码进行任何更改,也不要保留备份。

    5
    投票

    我感到你很痛苦。不得不这样做。

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


    3
    投票

    我前一段时间做过,我想我遵循了this guide。如果它不起作用,请检查Windbg实用程序,我记得您不需要安装它,只需复制并运行,甚至可以从USB记忆棒运行]


    3
    投票

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

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


    1
    投票

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

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

    © www.soinside.com 2019 - 2024. All rights reserved.