我们知道,一般情况下,Visual Studio 调试时不能进入 .net 源码 或者 nugget 包的源码。而在 Java 或 Python 社区,跳转到相关包的源码则是标配。我觉得这一定程度上阻碍了 .NET 程序员功力的提升。后来,有一个叫 Cameron Taggart 的人编写了 SourceLink,允许在调试的时候根据需要将 .Net 平台的源码下载并加载,从而支持调试的时候跳转到平台的源码。这个项目后来被 Microsoft 整合,重新推出了新版的 SourceLink。项目地址:https://github.com/dotnet/sourcelink
配置 SourceLink
打开菜单:Tools -> Options -> Debugging -> General,不要勾选 Enable Just My Code,勾选 Enable Source Link support(启用源链接支持)。如果勾选了 Enable Just My Code,则只调试自己的代码,不能进入第三方的代码中。我们可以把 Enable Just My Code 当作一个非常实用的开关,在需要的时候才打开进入.net 或者 nugget 包的调试,这样尤其在测试或者调试允许的时候,获得更好的性能。
切换到 Symbols 选项,设置 Symbol File 的服务器:
然后在程序中合适的地方设置断点,调试时按 F11 就进入相应包的源码中。第一次运行的时候,需要下载相关代码到本地缓存,需要等待较长时间。比如,我在 asp.net core 的 Program.cs 文件中设置如下断点:
F5 开始调试,到断点的地方按下 F11, 即进入了 CreateDefaultBuilder() 方法的内部,位于 host.cs 文件:
除了 .net 类库包括 asp.net core类库,SourceLink 也支持 NuGet 包的调试连接,只要在相关包的设置中,允许 SourceLink。
什么是符号文件 (Symbol file)?
从 pdb 文件说起,我们都见过项目文件下面有扩展名为 pdb 的文件。pdb 全称是 Program Database,由微软开发的一种调试符号文件存储格式,在windows系统中,为了调试 dll 或者exe文件,需要有一个符号文件(Symbols file)来支撑调试。符号文件保存多种数据,比如:全局变量、局部变量、函数名称和其入口地址、源代码的行号等,这些数据在运行二进制文件时实际上并不需要,但在调试过程中可能非常有用。
调试时,必须确保调试器能够访问正在调试的目标关联的符号文件,如果调试的时候涉及第三方组件,并没有第三方的源代码文件,也没有 pdb 文件,则无法进入第三方组件进行调试。SourceLink 工具允许在编译过程中将有关程序集源代码的唯一信息嵌入到 PDB 中,从而实现丝滑调试之目的。Microsoft库(例如.NET Core 和 Roslyn)都已启用SourceLink。