有多少次你在调试器中追踪一个缺陷,通过代码,观察局部变量的值改变,当你碰壁——不是你所期待的值和你不能进入的方法,因为它来自类库或 .NET 框架本身;或者您设置了一个条件断点,等待检查某个值是如何设置的,然后注意到调用堆栈基本上是灰色的,而不让您看到调用堆栈中早些时候发生了什么。如果您可以轻松地进入,设置断点,并在 NuGet 依赖关系或框架本身上使用调试器的所有特性,这不是很好吗?
2020年的 .NET 开发实践在很多方面都比十年前有了很大的不同和改善。最大的变化是 .NET 平台是开源的,并在 GitHub 上维护。我们每天都在使用的许多 NuGet 库也是在 GitHub 上维护的。这意味着我真正想要在调试器中看到的源代码只是一个 HTTPS GET。我们可以有这样一个非常高效的生态系统,在那里我们可以对所有依赖项都使用源代码进行调试。那太好了!事实上,由 Cameron Taggart 发起的 Source Link 项目意识到了这一点,并建立了一种体验来实现这一点。让我来告诉你吧。
使用启用了 Source Link 的库,调试器可以在您进入时下载底层的源代码文件,并且您可以像设置任何其他源代码一样设置断点/跟踪点。启用 Source Link 的调试使您更容易理解代码从代码到运行时的完整流程。Source Link 与语言无关,因此您可以从任何 .NET 语言和一些本地库中获益。
调试 Framework
让我们看一个例子。有时候,您想要进入框架查看发生了什么,特别是当发生了一些您没有预料到的事情时。使用 Source Link,您可以像使用自己的代码一样进入框架方法,检查所有变量并设置断点。
如果您在没有 Source Link 的情况下尝试它,您将看到以下内容,在按 F11 进入之前和之后。
调试器不会单步进入 Console.WriteLine,因为它没有符号或源代码。一旦我们配置 Source Link,当我们介入,我们得到一个不同的结果:
您可以看到 Visual Studio 已经下载了匹配的源代码并进入了该方法。如果您查看 Autos 窗口,它会显示传入的本地变量。您可以按照自己的意愿逐步进入、穿过和退出框架代码。
调试一个依赖
通常,你试图解决的问题是一个依赖项。如果您也能进入源代码查看您的依赖项,这不是很好吗?如果依赖项在其构建期间添加了 Source Link 信息,您可以!下面是一个关于 Newtonsoft.Json 的例子。因为 Newtonsoft.Json 使用了 Source Link 信息构建,你可以插入到它的代码:
当插入时,调试器跳过了两个用 DebuggerStepThrough 标记的方法,并在 CreateDefault 方法的下一条语句中停止。由于源文件来自互联网(本例中是 GitHub),因此会提示您允许使用它,无论是单个文件还是所有文件。
异常
Source Link 帮助您处理来自框架或依赖项的异常。你已经看过这条消息多少次了,你真正想要的是检查变量?
使用 Source Link,调试器将把您带到抛出异常的位置,然后您可以导航调用堆栈并进行排查。
启用 Source Link
由于 Source Link 从互联网上下载源文件,默认情况下它是不启用的。以下是如何启用它:
Visual Studio
有几个步骤来启用它:
1 Tools > Options > Debugging > Symbols 并确保 “NuGet.org Symbol Server”选项被选中。为符号缓存指定目录是避免再次下载相同符号的好主意。
如果你想插入.NET Framework 代码,你还需要检查“Microsoft Symbol Servers”选项。
2 Tools > Options > Debugging > General 中的“Disable Just My Code”,因为我们希望调试器尝试定位符号支持解决方案之外的代码。
验证是 Enable Source Link support 是否勾选(默认情况下是这样)。如果你想进入.NET Framework 代码,你还需要检查启用 Enable .NET Framework source stepping。这不是 .NET Core 所必需的。
注意
1. 并非 nuget.org 上的每个库都有它们的 .pdb 文件。如果你发现调试器找不到你正在使用的开源库的 PDB 文件,请鼓励开源库上传它们的 PDB 文件。
2. nuget.org 上的大多数库都不是预先编译的,所以如果你只是试着调试这个库而不是 .NET Framework 本身,你可以省略上面的 env 部分。在某些情况下,使用优化的 .NET Framework 将显著提高性能。
3. 只有微软提供的库会在微软符号服务器上有他们的 .pdb 文件,所以如果你只对一个 OSS(开源软件)库感兴趣,你可以禁用这个选项。
在以后的文章中,我们将向您展示如何创建启用源代码链接的库和应用程序,这样您的用户就可以从中受益。
原文地址
https://devblogs.microsoft.com/dotnet/improving-debug-time-productivity-with-source-link/