12

是否有任何我应该知道的 VC++ 设置来生成包含更多信息的更好的 PDB 文件?

我有一个基于项目crashrpt的故障转储分析系统。

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

4

7 回答 7

5

“有没有我应该知道的 VC++ 设置”

确保关闭 Frame pointer ommision。Larry osterman 的博客有关于 fpo的历史细节以及它导致的调试问题。

符号已成功加载。它显示了调用堆栈,但双击一个条目并没有将我带到源代码。

你用的是什么版本的VS?(或者你在使用Windbg?)......在VS中,如果它没有找到位置,它应该第一次提示源。但是,它还保留了一个“未找到”的来源列表,因此它不会每次都询问您。有时不要查看列表很痛苦...要备份提示,您需要转到解决方案资源管理器/解决方案节点/属性/调试属性并在下部窗格中编辑文件列表。

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

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

于 2008-09-01T21:41:59.600 回答
2

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

有关详细信息,请参阅http://msdn.microsoft.com/en-us/magazine/cc163563.aspx。如果你使用 subversion 作为你的 SCM,你可以查看 SourceServerSharp 项目。

于 2008-10-19T00:35:55.330 回答
1

您可以尝试使用 MS-DOS subst命令将源代码目录分配给 D: 驱动器。

于 2008-08-30T17:02:35.183 回答
1

这是我在遇到与您类似的麻烦后使用的程序:

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

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

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

还有两个提示:

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

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

于 2008-10-19T01:36:01.013 回答
0

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

阿尔乔姆写道:

MiniDumpWriteDump() 有一个标志可以做更好的崩溃转储,这将允许查看完整的程序状态,所有全局变量等。至于调用堆栈,我怀疑它们会因为优化而变得更好......除非你转(也许一些)优化关闭。

另外,我认为禁用内联函数和整个程序优化会很有帮助。

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

但是,这些类型对调用堆栈没有帮助,它们只会影响您可以看到的变量数量。

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

于 2008-08-30T17:24:48.733 回答
0

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

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

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

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

于 2008-08-30T17:34:25.030 回答
0

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

不。

如果不是,那么它认为它没有调用堆栈的符号。设置源路径应该可以工作,而无需映射确切的原始位置。

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

于 2008-08-30T17:49:23.980 回答