【译】通过自动反编译和外部源提升调试

news/发布时间2024/5/19 5:45:04

  Visual Studio 支持外部源代码调试和反编译已经有一段时间了。然而,随着 Visual Studio 17.7的发布,调试器有了一个重大的飞跃,它为 .NET 库引入了自动反编译功能,使得 Visual Studio 中的外部代码调试变得更加流畅和轻松。它集成了反编译器,可以实时反编译外部代码,并根据需要将其无缝地集成到调试器中。

  在本文中,我们将研究 Visual Studio 的自动反编译特性,强调其在调试和工程外部代码中的重要性。

探索自动反编译及其内部工作原理

  Visual Studio 的调试器利用了 ILspy 反编译器引擎。它有助于将编译后的二进制代码(机器代码)转换回更高级的编程语言,如 C#。这意味着开发人员可以轻松地检查、排除故障并修复外部代码中的问题,就像他们正在处理自己的代码一样。

  当涉及到外部源代码时,将自动反编译想象成 Visual Studio 调试器的备份计划:它首先在您的机器上搜索本地外部源代码,然后使用来自 PDB 文件的 Source Link 或 Source Server 信息来加载源代码。如果其他方法都失败,则调试器反编译代码以供显示。

  虽然 Visual Studio 中的自动反编译特性提高了调试的效率,但 .NET 包作者可以完全控制他们是否想要他们的工作成果被反编译。这可以通过在程序集或模块中实现 SuppressIldasmAttribute 属性来实现,从而有效地防止 Visual Studio 启动反编译过程。虽然这个属性在 .NET 6+中已经过时了,但 Visual Studio 还是支持该属性。

  再好的东西也有一定的局限性。当试图反编译 .NET 程序集以获得见解时,遇到限制并不罕见。如果你想了解更多,请参阅《Decompile .NET code while debugging 》

利用外部代码的自动反编译

  还记得在 Visual Studio 中加载外部代码有点像解谜的日子吗?你不得不手动找出如何做到这一点,从“No Source Page”。但是现在,有了自动反编译,调试器会替您思考。您可以专注于完善您的代码,并且调试器确保您拥有所需的外部代码片段,它们应该在解决方案资源管理器中。

  现在,让我们看看如何充分利用反编译场景来提高效率和生产力。

  为了说明这一点,让我们考虑一下这个简单的 WPF 应用程序。我想引导您注意位于底部的调用堆栈窗口。目前,此窗口内的调用堆栈仅源自于代码中高亮显示的第12行相关的本地代码。

  现在,激动人心的部分来了。在调用堆栈的顶部菜单上,您将看到一个标记为“show external code”的选项。选择此选项后,调用堆栈不仅会显示本地代码堆栈,还会显示外部代码组件。这里的外部代码主要是框架代码,如 PresentationCore.dll, WindowsBase.dll 等。

  当我从外部代码单击这些调用堆栈时,它会在一瞬间自动为我反编译它。反编译代码虽然与原始源代码不同,但仍提供了对各种函数和组件如何工作的见解。

通过外部代码导航和调试

  继续我们的旅程,这一过程超出了其最初的能力。让我们将焦点转移到解决方案资源管理器上,当您处于调试模式时,一个名为“External Sources”的特殊节点会出现在最顶部。

  该节点充当虚拟文件浏览器,整齐地组织来自不同调用栈的反编译外部代码模块。

  此设置允许我研究这些外部模块并检查代码的特定部分。通过在这段外部代码中放置断点,我可以再向前迈出重要的一步。这意味着,如果有必要,我可以在特定的点暂停代码的执行,就像我对自己的代码所做的那样,使外部代码调试尽可能无缝。

  例如,在我的 WPF 应用程序中,我使用我的“MessageLibrary”来显示点击按钮时的通知。如下面的视频所示,我可以流畅地浏览外部代码,就像我在解决方案资源管理器中处理自己的代码一样。如果有必要,我还可以设置断点并通过这些文件进行调试。

  当你使用一个严重依赖外部包和 dll 的应用程序时,这尤其方便。想象一下,您正在处理一个棘手的 bug,它可能隐藏在这些外部部件中。在这种情况下,深入了解这些外部部件将改变游戏规则,从而提高调试效率。

  自动反编译非常有用,可以提高您的效率。但是,如果出于任何原因您想要关闭此自动功能,您可以通过设置选项 Debug >  General>  Automatically decompile to source when needed.  (Managed only)

结论

  总而言之,Visual Studio 中引入的自动反编译功能彻底改变了我们调试外部代码的方式。我们真的很想知道恁对这个新体验的看法。如果您有任何想法或建议,请在开发者社区网站上与我们分享。您的意见对我们非常有价值!

 

原文链接:https://devblogs.microsoft.com/visualstudio/elevating-debugging-with-auto-decompilation-and-external-sources/

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/73830442.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

学信息系统项目管理师第4版系列09_配置管理

学信息系统项目管理师第4版系列09_配置管理1. 配置管理 1.1. 应用技术的和管理的指导和监控方法以标识和说明配置项的功能和物理特征,控制这些特征的变更,记录和报告变更处理和实现状态并验证与规定的需求的遵循性 1.1.1. GB/T 11457《信息技术软件工程术语》 2. 配置项 2.1.…

Windows 安装 chromedriver 和 Python 调试

下载 chromedriver 从官方网站上下载 chromedriver 的版本,这个版本需要和你 Chrome 的版本对应上。 下载的地址为:ChromeDriver - WebDriver for Chrome - Downloads这个地方,将会打开一个新的浏览器界面,Chrome for Testing availability 在这个新的浏览器界面中,我们能…

Chromedriver 在 Python 中查看源代码的方法

Python 中可以属性来查看需要爬取的网站的源代码。 对应具体的是:chrome.page_source需要注意的是首先需要导入包 from selenium.webdriver import Chrome 然后进行初始化:chrome = Chrome(service=Service(r"C:\Users\yhu\Downloads\chromedriver-win64\chromedriver-w…

Maven03-Maven使用入门

1、创建Maven项目的目录结构为maven-project01项目创建目录结构。首先创建一个名为maven-project01的文件夹,并在其下创建如下目录。2、编写pom.xmlMaven项目的核心是pom.xml,就像Make的Makefile,Ant的build.xml一样。 POM(Project Object Model,项目对象模型)定义了项目的…

Maven03-Maven入门使用

1、创建Maven项目的目录结构为maven-project01项目创建目录结构。首先创建一个名为maven-project01的文件夹,并在其下创建如下目录。2、编写pom.xmlMaven项目的核心是pom.xml,就像Make的Makefile,Ant的build.xml一样。 POM(Project Object Model,项目对象模型)定义了项目的…

算法--二叉树展开

Leetcode 114: 给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历顺序相同。示例 1:输入:root = [1,2,5,3,4,null,6] 输…