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

【译】使用 Source Link 提高调试效率的更多相关文章
- .NET Core使用Source Link提高源代码调试体验和生产效率
前言: 在我们日常开发过程中常常会使用到很多其他封装好的第三方中间件(NuGet依赖项).类库或者是.NET框架中自带的库.但是当你想要对这些类库的方法设置断点调试,然后发现无法F11(逐语句)调试进 ...
- VS调试技巧,提高调试效率(转):
如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们. 它们学起来很容易,能帮你节省很多时间. 运行到光标(Ctrl+ F10) 我经常看见人们是这样来调试应用程序的: 他们在应用程序需要调试的代码 ...
- IntelliJ IDEA配置Springboot2.x 通过devtools实现代码热部署,提高调试效率
1.pom.xml添加依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifa ...
- 借助Visual Studio Code提高基于ActionScript的LayaAir HTML5游戏的调试效率
借助Visual Studio Code提高基于ActionScript的LayaAir HTML5游戏的调试效率 使用Visual Studio Code(VS Code)调试的优势 借助VS Co ...
- 12个Visual Studio调试效率技巧
在这篇文章中,我们假定读者了解VS基本的调试知识,如: F5 开始使用调试器运行程序 F9 在当前行设置断点 F10 运行到下一个断点处 F5 从被调试的已停止程序恢复执行 F11 步进到函数内(如果 ...
- 成吨提高开发效率:Intellij Shortcuts精简子集与思维模式
在线精简cheatsheet备查表:intellij.linesh.twGithub项目:intellij-mac-frequent-keymap Intellij的快捷键多而繁杂,从官方推荐的key ...
- 倍数提高工作效率的 Android Studio 奇技
来源:JeremyHe 链接:http://zlv.me/posts/2015/07/13/14_android-studio-tips/ 这是从Philippe Breault的系列文章<An ...
- [转]倍数提高工作效率的 Android Studio 奇技
转自:http://android.jobbole.com/81687/ 倍数提高工作效率的 Android Studio 奇技 2015/10/08 · 技术分享 · 4 评论· Android S ...
- 提高开发效率的 Eclipse 实用操作
工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分 ...
随机推荐
- VBS脚本编程(2)——运算符
算数运算符 用于执行数学计算的运算符. 1.加法运算符( + ) 计算两个数之和. 2.减法运算符( - ) 计算两个数值的差或表示数值表达式的负值. 3.乘法运算符(*) 计算两个数之积. 4.除法 ...
- Golang使用proto3协议导致零值字段不显示
Golang使用proto3协议导致零值字段不显示 问题描述 proto协议生成的结构体如果使用直接转成json会导致零值字段不显示,这样的json是有毛病的,可以使用如下方法解决 示例Demo pa ...
- excel VBA构造正则函数(单参数)
Function zhengze(Rng As Range) Set regx = CreateObject("vbscript.regexp")With regx .Gl ...
- 13、windows下卸载oracle
13.1.停用oracle服务: 进入计算机管理,在服务中,找到oracle开头的所有服务,右击选择停止: 13.2.删除oracle: 在开始菜单中,找到oracle->Universal I ...
- Libevent2.1.8版在Liunx中编译安装遇到的问题
Libevent2.1.8版在Liunx中编译安装遇到的问题 前言:在网上找了很久,都没有一个明确的解决方法,通过分析可能的原因,将自己实际操作及解决的成功结果记录如下,以供遇到相似的问题,能提供思路 ...
- Docker搭建Gogs代码仓库——代码自动化运维部署平台(一)
一.准备工作 1.Gogs 概念: Gogs 是一款极易搭建的自助 Git 服务. 目的: Gogs 的目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Go ...
- Centos 8 误删/boot文件夹下文件后的恢复
一.环境 Centos8 二.过程 1.查看/boot底下文件 ls /boot 2.模拟误删/boot底下文件 rm -rf /boot/*ls /boot 3.reboot,无法正常启动 4.在v ...
- 想用Electron做个小工具?这个或许是终极版
故事背景 之前在网上有看到很多小伙伴基于 electron 实现了非常多好用的桌面端工具,比如图床管理工具 PicGo,就专门做图床工具.也有一些其他的类似的小工具,比如 saladict-deskt ...
- Linux:Linux安装配置JDK1.8
1 在/usr/local 文件夹下新建一个文件夹software ,将JDK放到此文件夹中 并在此文件夹下解压执行命令 tar zxvf jdk-8u144-linux-x64.tar. ...
- mqtt 集成
-- 在pom.xml导入依赖 <!-- mqtt --> <dependency> <groupId>org.springframework.boot</g ...