【译】通过自动反编译和外部源提升调试
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/
作者:MeteorSeed
我希望您喜欢这篇博文,并一如既往地感谢您阅读并与朋友和同事分享我的博文。
转载请注明出处。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器