【译】使用 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快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分 ...
随机推荐
- React-Antd4的Form表单校验
之前很少用react做项目,最近入职新公司,用的react,在自己的摸索过程中,慢慢会记录一些使用方法.今天简单记录一下使用antd 4.0版本的Form表单校验,直接代码. 需要购买阿里云产品和服务 ...
- 关于win10 samba访问提示用户名和密码错误的原因
排除掉linux上的配置错误,只需要做到以下两步就可以了: 1.win10系统运行secpol.msc 打开本地安全策略 2.安全策略->本地策略->安全选项 3.右侧找到 网络安全:LA ...
- 01-ubuntu18.04安装docker脚本[含自动配置apt]
01-ubuntu18.04安装docker脚本[含自动配置apt] 脚本一键安装docker,并配置阿里云的docker镜像加速. #!/bin/bash #更新apt源为清华源 echo &quo ...
- 05 找出占用CPU、内存过高的进程
#!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin echo "----- ...
- flyway实现java 自动升级SQL脚本
flyway实现java 自动升级SQL脚本 为什么要用Flyway 在日常开发中,我们经常会遇到下面的问题: 自己写的SQL忘了在所有环境执行: 别人写的SQL我们不能确定是否都在所有环境执行过了: ...
- CentOS-自定义SFTP用户及目录
ftp功能说明:通过SSH启动CentOS的sftp功能 创建用户组及用户(sftp可变) $ groupadd sftp $ useradd -g sftp -s /sbin/nologin -d ...
- 关于Feign的Fallback处理
Feign的不恰当的fallback Feign的坑不少,特别与Hystrix集成之后. 在微服务引入Feign后,上线不久后便发现,对于一个简单的查询类调用,在下游返回正常的"404-资源 ...
- 在Ubuntu 16.04中搭建RobotFramework环境
1.搭建RF环境 2.安装RF相关库 3.查看RF case 4.设置环境变量 相关知识点:pip --proxy=http://xx.xx.xx.xx:xx install 包名,使用pip的-- ...
- MYSQL数据库数据拆分之分库分表总结 (转)
数据存储演进思路一:单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 数据存储演进思路二:单库多表 随着用户数 ...
- APP-SECURITY-404 组件导出漏洞复现
参考资料:https://github.com/wnagzihxa1n/APP-SECURITY-404/blob/master/2.%E7%BB%84%E4%BB%B6%E5%AF%BC%E5%87 ...