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

  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/

 

 
posted @   MeteorSeed  阅读(974)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示