调试 .NET Framework 源代码、.DotNetCore源码
条件
- 加载符号文件:调试之前要加载符号文件,F11步入才有可能触发源码加载或下载
- 加载源码(不会自动加载源码的情况):加载符号文件之后,调试器会根据符号文件记录的源码位置查找并打开源码。我们要做的就是触发加载源码的弹窗,手动选择上面下载的源码。
提前断点
- 选择源码文件之后,即可开始调试。此时打开的源码可以在里面其它地方断点,运行到的时候就会命中断点,但前提是要加载它对应的符号文件
- 如果需要在运行前断点,并在运行到断点行时命中,需要先加载符号文件:在调试-调试堆栈窗口选择需要断点的模块,单击右键选择始终加载,那么下次运行就会自动加载符号了。也可以在调试堆栈转到模块列表,然后设置加载。或者在工具-调试-符号-始终加载指定模块,填写dll名包括dll
调试DotNetCore
- DotNetCore是开源的,源码位于github,所有通过Nuget分发的包都会附带构建时的源码,源码版本跟运行的dll版本一一对应,就不会像调试DotNetFramework源码一样差异过大
- 在运行程序时自动从github下载病并加载加载pdb符号文件。如果加载全部符号启动将变得异常缓慢,所以仅选择需要调试的dll即可
加载符号
- 首先找到需要调试代码所在的dll名称,在需要调试的方法上点击鼠标右键-转到定义。
- 此时可能会从服务器上下载源码,需要等一会。下载完之后自动切换标签页,接下来要做的有两步,断个点,然后复制一下类名或者命名空间到.Net API浏览器搜索。
点击搜索结果,跳转到类详情页,复制dll全称。
在VS依次操作:工具-选项-调试-符号-指定包含的模块-右上角加号-粘贴-确定。
- 完成符号准备工作,程序运行时将自动从符号服务器下载pdb符号文件并加载进程序。
注意:如果是发布的第三方包,请把pdb删掉,不要一起发布,因为该pdb文件包含的源码地址时打包者电脑地址,其他人加载了改文件将找不到源码。而通过
dotnet pack --include-symbols
命令打包生成的pdb不好含本地源码地址。这样就不限于打包者本人直接调试通过nuget发布的dll,其他人也将可以通过本文所述方式进行调试,无需自己拉去源码编译dll。相关参考链接
调试
- 一切顺利的话,运行程序,加载完符号,断点是红色实心,否则就要检查符号是否正常加载。接下来开始愉快的调试之旅
运行时加载符号调试
- 此方法两个框架都适合,在调试自己的代码时,通过调用堆栈切换,触发加载符号的对话框,加载符号即可进行调试,但是下次还要调试时的话要重复此操作
打开调用堆栈
- 首先在调试时打开调用堆栈。
调试中加载符号
- 未加载符号的堆栈时灰色,双击它,自动出现加载符号页
点击加载,将自动加载符号并跳转到源码页,在需要调试的地方断点即可开始调试
- 类似的,调试DotNetFramework源码,可加载本地下载好的符号文件。调试时如果找不到源码文件会自动弹出选择源码的对话框,这时候再选择下载好的源码也可开始调试
注意
- 下载的DotNetFramework源码可能跟引用的版本不是完全对应,这是需要注意的