我是否应该知道有关生成包含更多信息的更好PDB文件的VC ++设置?
我根据项目crashrpt建立了故障转储分析系统。
另外,我的生产构建服务器在D:\上安装了源代码,但是我的开发机器在C:\上有源代码。我在VC ++设置中输入了源路径,但是当查看崩溃的调用堆栈时,它不会自动跳转到我的源代码。我相信如果我在D:\上有我的开发机器的源代码,那就行了。
答案 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,但双击一个条目并没有带我到源代码。我当然可以在文件中搜索有问题的行,但这很难:)