任何推荐的VC ++设置,以便在发布版本上进行更好的PDB分析

时间:2008-08-30 16:51:04

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

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

我根据项目crashrpt建立了故障转储分析系统。

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

7 个答案:

答案 0 :(得分:5)

  

“我应该知道的任何VC ++设置”

确保关闭帧指针ommision。 Larry osterman的博客有the historical details关于fpo及其调试所带来的问题。

  

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

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

b)复制所有EXE,DLL& PDB文件连同minidump(在同一文件夹中)到开发机器(到临时文件夹)。使用Visual Studio从该文件夹加载minidump。

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

另外两个提示:

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

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

答案 4 :(得分:0)

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

Artem写道:

  

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

     

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

     

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

     

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

     

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

答案 5 :(得分:0)

Visual Studio是否提示您输入源文件的路径?如果不是那么它不认为它有callstack的符号。设置源路径应该无需映射确切的原始位置即可。

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

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

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

答案 6 :(得分:0)

  

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

没有

  

如果不是那么它不认为它有符号   对于callstack。设置来源   路径应该工作而不必映射   确切的原始位置。

符号已成功加载。它显示了callstack,但双击一个条目并没有带我到源代码。我当然可以在文件中搜索有问题的行,但这很难:)