参考:Debugging into .NET Core 2.1
原理:利用与源码做了连接(source link)的pdb文件,反向找到源码文件,从而在调试进入源码。
pdb(program database)文件,中文翻译过来叫程序数据库文件,其实pdb文件还有一个别名叫做symbol文件,也就是符号文件,里面存有标识符,供调试器使用。调试器根据标识符找到对应的源码和行号,以及可执行文件中在设置断点的位置。
从.Net Core 2.1开始,.Net开源社区将.Net Core的pdb文件发布到Microsoft Symbol Server上,并做了Source Link,正是这样,所以我们可以在调试的时候进入.Net Core的源码,注意,这一功能仅在.Net Core 2.1以上版本有效,而且只能通过调试器进入源码。
- 在 VS Code 中升级C# for Visual Studio Code (powered by OmniSharp) 插件到最新版本,目前我的是1.15版本。
- 确保本机安装了.Net Core 2.1 版本及以上。
- 项目是基于.Net Core 2.1版本及以上的,可在.csproj文件中查看
<TargetFramework>
标签。
有了以上3个先决条件后,需要在vscode的launch.json配置中添加如下字段
//关闭 “仅我的代码” 项,这样
"justMyCode": false,
"symbolOptions": {
//从Microsoft Symbol Server(https://msdl.microsoft.com/download/symbols)上查找并下载symbol文件
"searchMicrosoftSymbolServer": true
},
//取消jit编译器的优化(默认是false)
"suppressJITOptimizations": true,
"env": {
//这个环境变量告诉.Net RunTime 忽略已经提前编译的源码.Net框架程序集,用JIT编译器编译的程序集代替。
"COMPlus_ZapDisable": "1"
}
有了上面的配置,当你调试时,调试器就会在Microsoft Symbol Server上自动下载symbol文件和对应的源码(不是所有的,仅仅是当前调试用到的),但下载了我们需要的symbol文件后,可以注释掉 searchMicrosoftSymbolServer:true 这一项,这样就可以不再Symbol Server上去查找symbol文件了。
suppressJITOptimzatioins和COMPlus_ZapDisable两个选项组合起来使用,才让我们能够将未优化的源码载入调试器中,从而达到debugging into Source的功能。