参考源、dotPeek 和源代码调试





5.00/5 (5投票s)
参考源、dotPeek 和源代码调试
不久前,Microsoft 通过一个非常棒的页面公开了 .NET 源代码:http://referencesource.microsoft.com/。此外,他们还承诺 .NET Framework 源代码调试终于可以在 Visual Studio 中使用了。几乎同时,JetBrains 发布了其 dotPeek 工具的 EAP 版本,其中包含一些出色的功能,可以非常轻松地进行“逆向工程调试”。对于其他 DLL,我们仍然可以使用旧的 Microsoft 公共符号服务器。在这篇文章中,我将向您展示我如何为不同的调试场景配置我的系统和 Visual Studio。
我将从一些关于如何查找和加载符号文件的基本信息开始。大多数调试器和诊断应用程序使用 Microsoft 提供的 dbghelp.dll 库来加载 PDB 文件。按以下顺序检查用于查找 PDB 文件的位置(请记住,PDB 文件名必须与 DLL 文件名匹配)
- 应用程序文件夹(.exe 文件所在的位置)
- 加载 DLL 文件的文件夹(对于 .NET 程序集,例如可能是 GAC)
- C:\WINDOWS\
- C:\WINDOWS\symbols\dll\
- C:\WINDOWS\dll
_NT_SYMBOL_PATH
系统变量指向的位置(您可以在此处找到有关此变量的更多信息)- 调试器中配置的其他位置
值得设置系统中的 _NT_SYMBOL_PATH
变量,因为它不仅被调试器读取,还被 Windows Performance Toolkit 或 sysinternals 应用程序的工具读取。我有一个脚本,在新安装的 Windows 上运行时,它会为我设置此变量。
@echo Setting _NT_SYMBOL_PATH...
@setx /M _NT_SYMBOL_PATH SRV*C:\symbols\dbg*http://referencesource.microsoft.com/symbols;SRV*C:\symbols\dbg*http://msdl.microsoft.com/download/symbols
@echo Setting _NT_SYMCACHE_PATH...
@setx /M _NT_SYMCACHE_PATH c:\symbols\xperf
:: and for the current session also
@set "_NT_SYMBOL_PATH=SRV*C:\symbols\dbg*http://referencesource.microsoft.com/symbols;SRV*C:\symbols\dbg*http://msdl.microsoft.com/download/symbols"
@set "_NT_SYMCACHE_PATH=c:\symbols\xperf"
脚本中出现的 _NT_SYMCACHE_PATH
是另一个系统变量,它指向 Windows Performance Toolkit 的性能分析器使用的符号缓存。Visual Studio 了解 _NT_SYMBOLS_PATH
变量,该变量显示在调试选项窗格中。
现在,让我们检查您想要调整符号加载设置的各种调试场景。
调试我的应用程序代码
在调试时,通常您不关心不属于您应用程序的程序集,也没有时间等待所有模块的符号文件加载完成。Visual Studio 团队已考虑到这种情况,并在调试器设置中提供了 **仅我的代码** 选项。
请注意,勾选此复选框将使您的调试器跳过加载 .NET Framework 程序集(以及一些外部库)的符号,并且在发生异常时,调用堆栈窗口将不会显示异常被抛出的确切位置。
调试 .NET Framework 源代码
当您想单步调试 .NET Framework 代码时,您需要像此处所述那样,在 Visual Studio 调试器中更改一些设置。不幸的是,.NET Framework 的更新经常会破坏此功能。如果某个程序集的符号文件未加载,您可以验证 Visual Studio 检查了哪些位置——只需在“模块”对话框(调试 -> 窗口 -> 模块)中右键单击该模块并选择 **符号加载信息…**。输出将类似于下面的内容。
D:\Users\...\bin\Debug\System.IdentityModel.pdb: Cannot find or open the PDB file.
C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.IdentityModel\v4.0_4.0.0.0__b77a5c561934e089\System.IdentityModel.pdb: Cannot find or open the PDB file.
C:\WINDOWS\System.IdentityModel.pdb: Cannot find or open the PDB file.
C:\WINDOWS\symbols\dll\System.IdentityModel.pdb: Cannot find or open the PDB file.
C:\WINDOWS\dll\System.IdentityModel.pdb: Cannot find or open the PDB file.
C:\Symbols\dbg\System.IdentityModel.pdb\be517440cdd24a25b0fad1eefd33553b1\System.IdentityModel.pdb: Cannot find or open the PDB file.
C:\Symbols\dbg\MicrosoftPublicSymbols\System.IdentityModel.pdb\be517440cdd24a25b0fad1eefd33553b1\System.IdentityModel.pdb: Cannot find or open the PDB file.
SYMSRV: C:\symbols\dbg\System.IdentityModel.pdb\BE517440CDD24A25B0FAD1EEFD33553B1\System.IdentityModel.pdb not found
SYMSRV: http://referencesource.microsoft.com/symbols/System.IdentityModel.pdb/BE517440CDD24A25B0FAD1EEFD33553B1/System.IdentityModel.pdb not found
SRV*C:\symbols\dbg*http://referencesource.microsoft.com/symbols: Symbols not found on symbol server.
SYMSRV: C:\symbols\dbg\System.IdentityModel.pdb\BE517440CDD24A25B0FAD1EEFD33553B1\System.IdentityModel.pdb not found
SYMSRV: http://msdl.microsoft.com/download/symbols/System.IdentityModel.pdb/BE517440CDD24A25B0FAD1EEFD33553B1/System.IdentityModel.pdb not found
SRV*C:\symbols\dbg*http://msdl.microsoft.com/download/symbols: Symbols not found on symbol server.
SYMSRV: C:\Symbols\dbg\System.IdentityModel.pdb\BE517440CDD24A25B0FAD1EEFD33553B1\System.IdentityModel.pdb not found
SYMSRV: http://msdl.microsoft.com/download/symbols/System.IdentityModel.pdb/BE517440CDD24A25B0FAD1EEFD33553B1/System.IdentityModel.pdb not found
http://msdl.microsoft.com/download/symbols: Symbols not found on symbol server.
正如您所见,在我调试应用程序时,Visual Studio 无法在 Microsoft 符号服务器中找到 System.IdentityModel.pdb 文件。幸运的是,借助 dotPeek,您仍然可以解决这种情况——我将在下一段中向您展示如何操作。
调试外部程序集
在这里,我们将处理一种情况,即我们没有模块的有效 PDB 文件,但仍然想调试外部库(或默认设置不起作用的 .NET Framework 程序集)的源代码。首先,去下载 dotPeek 的 EAP 版本。运行它并打开“选项”窗口。转到“符号服务器”,然后勾选 **程序集浏览器中打开的程序集**。
其他选项也很酷,但通常会大大减慢您的调试器速度。现在,将您想要调试的程序集拖到程序集浏览器中,然后按工具栏中的 **启动符号服务器** 按钮。现在是时候在 Visual Studio 中使用我们全新的符号服务器了。如果您尚未在系统中设置 _NT_SYMBOL_PATH
变量,只需将 https://:33417 添加到调试器选项中的符号文件位置,然后取消勾选“Microsoft 符号服务器”(否则您将获得 .NET 程序集的 Microsoft 公共符号)。
如果您已设置 _NT_SYMBOL_PATH
,您将需要通过在开头添加 SRV*https://:33417; 来修改它,这样该位置将被优先搜索,并且不会应用符号缓存。另外,请记住清空符号缓存。如果 Visual Studio 在其中找到 PDB 文件,您的符号服务器将永远不会被调用。
Visual Studio 插件
我写了一个非常简单的 VS 插件——这是我人生中的第一个。如果您决定安装它,它可能会是您见过的最丑的插件 :)。它只有四个按钮,可以将您的符号设置切换到前面提到的配置之一。该插件外观如下。
如果您不害怕,可以从 此处获取。不幸的是,当您想在 MS 符号和 dotPeek 之间切换时,您需要在调试器未运行时进行切换。我还观察到调试器引擎有时在第二次运行时切换到新设置——不知道是我的问题还是 Visual Studio 的 bug。
无论您是手动配置符号还是使用我的硬核插件,我都祝您调试愉快。:)
分类于:CodeProject, PDB 文件使用