有多少次你在调试器中追踪一个缺陷,通过代码,观察局部变量的值改变,当你碰壁——不是你所期待的值和你不能进入的方法,因为它来自类库或 .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/

最新文章

  1. javaScript判断浏览器类型
  2. Innodb 表空间传输迁移数据
  3. 有效解决 iOS The document “(null)” requires Xcode 8.0 or later.
  4. ios - block数据的回调
  5. Android中RelativeLayout各个属性的含义
  6. js最新手机号码、电话号码正则表达式
  7. JavaScript脚本语言基础(三)
  8. UI学习笔记---第十一天UITableView表视图高级-自定义cell
  9. 十五、struts2中的拦截器(框架功能核心)
  10. html中的圆角边框
  11. Android中系统设置中的清除数据究竟会清除哪些数据
  12. 三种Join方法
  13. 中高级JavaScript易错面试题
  14. Beta冲刺-用户测试报告
  15. 定时器Timer的使用
  16. linux常用命令及使用技巧(三)
  17. Excel函数匹配查找
  18. windows下Anaconda的安装与配置正解
  19. The Chinese Postman Problem HIT - 2739(有向图中国邮路问题)
  20. mysql slave 主从 指定表 通配符

热门文章

  1. 深入理解Linux文件系统与日志分析
  2. vue中$nextTick详细讲解保证你一看就明白
  3. 17、linux root用户密码找回
  4. 15、mysql事物和引擎
  5. vue3,后台管理列表页面各组件之间的状态关系
  6. css 设置body背景图片铺满
  7. MySQL不支持DELETE使用表别名?
  8. 第三章 - CPU缓存结构和java内存模型
  9. SpringMVC(4)数据绑定-1
  10. XCTF 3rd-GCTF-2017 hackme