我是否应该了解任何 VC++ 设置才能生成包含更多信息的更好的 PDB 文件?

我有一个基于该项目的故障转储分析系统 崩溃报告.

另外,我的生产构建服务器将源代码安装在 D:\ 上,但我的开发计算机将源代码安装在 C:\ 上。我在VC++设置中输入了源路径,但是当查看崩溃的调用堆栈时,它不会自动跳转到我的源代码。我相信如果我的开发机器的源代码位于 D:\ 上,它就可以工作。

有帮助吗?

解决方案

“是否有我应该了解的 VC++ 设置”

确保关闭帧指针省略。拉里·奥斯特曼的博客有 历史细节 关于 fpo 及其在调试时引起的问题。

符号已成功加载。它显示了调用堆栈,但是双击某个条目不会将我带到源代码。

你用的VS是什么版本?(或者你正在使用Windbg?)...在 VS 中,如果找不到位置,第一次肯定会提示输入源。然而,它还保留了“未找到”的源列​​表,因此它不会每次都要求您提供。有时不看名单是一种痛苦......要恢复提示,您需要转到解决方案资源管理器/解决方案节点/属性/调试属性并编辑下部窗格中的文件列表。

最后,您可能会使用“剥离符号”。这些是生成的 pdb 文件,用于提供调试信息以供调用堆栈经过 FPO,但源位置被删除(以及其他数据)。Windows 操作系统组件的公共符号被剥离 pdb。对于您自己的代码来说,这些只会造成痛苦并且不值得,除非您将 pdb 提供给外部。你怎么会拥有这些可怕的被剥离的 pdb 之一呢?如果您将“binplace”与 -a 命令一起使用,您可能会拥有它们。

祝你好运!适当的迷你转储故事是生产调试的天赐之物。

其他提示

如果您直接从源代码管理系统构建,则应该使用文件来源注释 pdb 文件。这允许您在调试时自动获取准确的源文件。(这与检索 .Net 框架源代码的过程相同)。

http://msdn.microsoft.com/en-us/magazine/cc163563.aspx 了解更多信息。如果您使用 subversion 作为 SCM,您可以查看 SourceServerSharp 项目。

您可以尝试使用 MS-DOS 替代品 命令将您的源代码目录分配到 D:驾驶。

这是我在遇到与您类似的问题后使用的过程:

a) 将构建的所有 EXE 和 DLL 文件复制到生产服务器,每个文件及其相应的 PDB 都复制到同一目录,启动系统,等待崩溃发生。

b) 将所有 EXE、DLL 和 PDB 文件连同小型转储(在同一文件夹中)复制回开发计算机(到临时文件夹)。使用 Visual Studio 从该文件夹加载小型转储。

由于 VS 找到了最初编译它们的源文件,因此它总是能够识别它们并正确加载它们。与您一样,在生产计算机中使用的驱动器不是 C:,但在开发计算机中是。

还有两个提示:

  • 我经常做的一件事是复制重建的 EXE/DLL,却忘记复制新的 PDB。这破坏了调试周期,VS 将无法向我显示调用堆栈。

  • 有时,我会得到一个在 VS 中没有意义的调用堆栈。经过一番头痛之后,我发现 Windbg 总是会向我显示正确的堆栈,但 VS 通常不会。不知道为什么。

如果有人感兴趣,一位同事通过电子邮件回复了我这个问题:

阿尔乔姆写道:

MinidumpWritedump()有一个标志,可以进行更好的碰撞转储,该崩溃转储将允许看到完整的程序状态,并具有所有全局变量,等等。至于呼叫堆栈,我怀疑它们会因为优化而变得更好...除非您(也许是某些)优化。

另外,我认为禁用内联功能和整个程序优化将有很大帮助。

实际上,有很多转储类型,也许您可​​以选择一个足够小但仍然有更多信息 http://msdn.microsoft.com/en-us/library/ms680519(VS.85).aspx

但是,这些类型对呼叫堆栈无济于事,它们只会影响您可以看到的变量数量。

我注意到我们使用的dbghelp.dll版本5.1中不支持其中一些转储类型。我们可以将其更新为最新的6.9版本,但我刚刚检查了MS调试工具的EULA - 最新的DBGHELP.DLL仍然可以重新分配。

Visual Studio 是否提示您输入源文件的路径?如果不是,那么它认为它没有调用堆栈的符号。设置源路径应该可以工作,而无需映射确切的原始位置。

您可以通过查看 Visual Studio 中的“模块”窗口来判断符号是否已加载。

假设您正在构建 PDB,那么我认为没有任何选项可以直接控制 PDB 中的信息量。您可以更改编译器执行的优化类型以提高可调试性,但这会降低性能 - 正如您的同事指出的那样,禁用内联将有助于使崩溃文件中的事情变得更加明显,但会在运行时产生成本。

根据您的应用程序的性质,如果可以的话,我建议使用完整转储文件,它们更大,但为您提供有关该过程的所有信息......无论如何,它多久崩溃一次:)

Visual Studio是否会提示您进入源文件的路径?

不。

如果不是这样,它就不认为它具有呼叫箱的符号。设置源路径应该可以工作,而无需映射确切的原始位置。

符号已成功加载。它显示了调用堆栈,但是双击某个条目不会将我带到源代码。我当然可以在文件中搜索有问题的行,但这是一项艰苦的工作:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top