Symbols Server
Symbols Server and Your Symbols
Set the symbol server for debugging
在调试程序的时候,有的时候你会发现设置的断点不起作用,而且更糟糕的是,一般碰到这种情况的时候都是非常紧急或者是加班到夜已深、人寂静的时候了。正是应了那句玩笑话:“机器机器,越急越气!”。一般发生断点不起作用的话:
1. 你首先要判断的是断点是否真的设置上了?
a) 如果在Visual Studio里面,你的断点符号是一个实心圆,那么断点的确是设置上了,你要判断的是设置断点的语句是否真的被执行到了,这种情况的解决方案不在本文讨论当中。
b) 如果在Visual Studio里面,你的断点符号是一个空心圆,那么说明断点被你禁用了,那么启用就行了。
c) 如果在Visual Studio里面,你的断点符号是一个空心圆并且还带了一个小感叹号的话,如下图所示:
那么说明你的调试符号文件没有被正确加载,参看我这篇文档了解什么是符号文件:http://blog.csdn.net/Donjuan/archive/2008/12/05/3454597.aspx
2. 如果确定是符号文件没有加载正确,单击“调试”-- >“窗口”-- >“模块”列出程序加载的所有DLL文件,模块窗口还会列出每一个DLL文件的符号文件加载信息:
3. 由于我们设置的断点的源文件是TestWPF.exe源代码的一部分,从第二列里面可以看出Visual Studio没有找到TestWPF.exe的PDB文件,为了查看Visual Studio尝试在哪些路经加载我们的符号文件,可以右键单击TestWPF.exe那一行,在弹出菜单里面选择“符号文件加载信息”,打开的窗口里面详细显示了为什么Visual studio没有成功加载TestWPF.exe的PDB文件,这是一个输出的例子:
E:/Workspace/Study/Forum/Test/TestWPF/bin/Debug/TestWPF.pdb: Cannot find or open the PDB file. E:/Workspace/Study/Forum/Test/TestWPF/obj/Debug/TestWPF.pdb: Cannot find or open the PDB file. C:/WINDOWS/symbols/exe/TestWPF.pdb: Cannot find or open the PDB file. C:/WINDOWS/exe/TestWPF.pdb: Cannot find or open the PDB file. C:/WINDOWS/TestWPF.pdb: Cannot find or open the PDB file. |
4. 如果你有PDB文件,只要在右键菜单里面选择“加载符号文件”选项在打开的对话框里面输入符号文件的路径就可以了。如果你选择了符号文件,Visual studio还是报错说符号文件不能加载的话,那么请确认符号文件是否和调试的模块相匹配,因为不匹配的话,调试器就没有办法正确设置断点,没有正确显示变量的值。
a) 判断符号文件与模块是否匹配最简便的方法就是察看两者的创建时间是否相同,如果不同的话,那就肯定是不匹配的。
b) 如果时间相同,那有可能是因为模块文件是调试(Debug)版本,而符号文件是发布(Release)版本,这个时候,你可以用windbg自带的symchk程序来检查一下。命令的语法是:
Symchk.exe <模块的完整路径> /s <符号文件所在的文件夹>
下面两个图片分别是符号文件不匹配和匹配的输出示例:
符号文件和模块不匹配
符号文件和模块匹配的情形
c) 或者你有源代码的话,那就干脆重新编译一次就完了—这是最简单的方法。
5. 如果在“模块”窗口里面显示的是“跳过加载符号文件”,那么说明Visual studio默认认为这个模块的源代码不是程序的一部分,比如是程序引用到的一些.NET Framework的Assembly文件,因此它认为你不必要给这个模块排错。但是有的时候你需要看看堆栈信息或者需要单步跟踪进.NET Framwork的函数里面看看为什么调用会出错,因此你可以通过单击VS菜单里面的“工具”-- >“选项”-- >“调试”-- >“通用(General)”,勾掉“只调试我的代码”复选框,点击确定就可以了: