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

  1. .NET Core使用Source Link提高源代码调试体验和生产效率

    前言: 在我们日常开发过程中常常会使用到很多其他封装好的第三方中间件(NuGet依赖项).类库或者是.NET框架中自带的库.但是当你想要对这些类库的方法设置断点调试,然后发现无法F11(逐语句)调试进 ...

  2. VS调试技巧,提高调试效率(转):

    如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们. 它们学起来很容易,能帮你节省很多时间. 运行到光标(Ctrl+ F10) 我经常看见人们是这样来调试应用程序的: 他们在应用程序需要调试的代码 ...

  3. IntelliJ IDEA配置Springboot2.x 通过devtools实现代码热部署,提高调试效率

    1.pom.xml添加依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifa ...

  4. 借助Visual Studio Code提高基于ActionScript的LayaAir HTML5游戏的调试效率

    借助Visual Studio Code提高基于ActionScript的LayaAir HTML5游戏的调试效率 使用Visual Studio Code(VS Code)调试的优势 借助VS Co ...

  5. 12个Visual Studio调试效率技巧

    在这篇文章中,我们假定读者了解VS基本的调试知识,如: F5 开始使用调试器运行程序 F9 在当前行设置断点 F10 运行到下一个断点处 F5 从被调试的已停止程序恢复执行 F11 步进到函数内(如果 ...

  6. 成吨提高开发效率:Intellij Shortcuts精简子集与思维模式

    在线精简cheatsheet备查表:intellij.linesh.twGithub项目:intellij-mac-frequent-keymap Intellij的快捷键多而繁杂,从官方推荐的key ...

  7. 倍数提高工作效率的 Android Studio 奇技

    来源:JeremyHe 链接:http://zlv.me/posts/2015/07/13/14_android-studio-tips/ 这是从Philippe Breault的系列文章<An ...

  8. [转]倍数提高工作效率的 Android Studio 奇技

    转自:http://android.jobbole.com/81687/ 倍数提高工作效率的 Android Studio 奇技 2015/10/08 · 技术分享 · 4 评论· Android S ...

  9. 提高开发效率的 Eclipse 实用操作

    工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分 ...

随机推荐

  1. oracle中job无法正常运行,如何排查

    1.生产环境Oracle中的job无法正常运行 select * from dba_jobs_running;(查看正在运行的job) 2.select * from dba_jobs(查看job历史 ...

  2. 安装redHat6.5详细图文教程

    ​ ​ 进入VM虚拟机,双击进入已经创建好的红帽6虚拟机 双击进入CD/DVD,准备添加红帽6.5的iso镜像文件 [红帽6.5的iso镜像文件需要先下载,redhat_6.5下载地址:https:/ ...

  3. Java进阶 | Proxy动态代理机制详解

    一.Jvm加载对象 在说Java动态代理之前,还是要说一下Jvm加载对象的过程,这个依旧是理解动态代理的基础性原理: Java类即源代码程序.java类型文件,经过编译器编译之后就被转换成字节代码.c ...

  4. canvas小画板——(3)笔锋效果

    画线准备 准备一个canvas <canvas id="canvasId" width="1000" height="800"> ...

  5. 温故知新,CSharp遇见异步编程(Async/Await),聊聊异步编程最佳做法

    什么是异步编程(Async/Await) Async/Await本质上是通过编译器实现的语法糖,它让我们能够轻松的写出简洁.易懂.易维护的异步代码. Async/Await是C# 5引入的关键字,用以 ...

  6. jdk keytool 自签证书

    jdk keytool 自签证书 https需要用到ssl证书,可以从阿里等平台申请,本文采用jdk keytool进行自签证书. 生成环境:linux 用jdk自带keytool工具生成密钥库 ke ...

  7. hadoop学习(二)hadoop集群的启动

    一.完全分布式集群环境的搭建 1.配置hosts文件:将三台集群服务器的主机名与IP的对应关系互相配置到对方的hosts文件中,以便对方服务器能通过主机名寻找IP,hosts文件在/etc目录下. 2 ...

  8. ctf实验吧Once More

    题目链接:http://ctf5.shiyanbar.com/web/more.php 思路分析:显然是后台逻辑代码. 1.ereg函数有漏洞,可以使用%00截断,这个就做笔记了好吧.这个函数大致意思 ...

  9. STM32中STD、HAL、LL库比较

    ST为开发者提供了标准外设库(STD库).HAL库.LL库 三种.前两者都是常用的库,后面的LL库是ST新添加的,随HAL源码包一起提供,目前支持的芯片也偏少. 标准外设库(Standard Peri ...

  10. python使用笔记28--unittest单元测试框架

    单元测试:开发程序的人自己测试自己的代码 unittest自动化测试框架 1.单元测试 unittest框架,执行的顺序是按照方法名的字母来排序的 setUpClass方法是最开始执行的 tearDo ...