Jetbrains Rider是否有类似Visual Studio调试器中查看汇编代码的功能?

4

Visual Studio 2019提供了一项名为“在Visual Studio调试器中查看反汇编代码”的功能。但我想在Rider中使用“在调试器中查看反汇编代码”,而不是在Visual Studio 2019中使用。

这可行吗?

我找到了“IL View”,但那不是我想要的。


你真的需要X64汇编(对于托管代码来说通常是无用的)还是IL? - PMF
5
我需要x64汇编代码。因为我的目的是研究调试版本和发布版本之间的差异,而不是管理代码。 - miniar
我无法回答你的问题(因为我还没有使用过Rider),但对于托管代码而言,当查看调试和发布之间的x64代码差异时,你可能不会得到预期的洞察力,因为这主要是由编译器而非JIT引起的(后者不知道代码是调试还是发布)。如果你想了解优化,应该查看IL差异-顺便说一句,这样更容易阅读。 - PMF
1
查看 IL 对于衡量机器代码的质量基本上是无用的。像强制边界检查这样的性能杀手在那个级别甚至都不可见,而且很难想象为什么例如 .NET Framework JIT 编译器可以将边界检查提升出关键循环,而后来版本的 JIT 编译器(例如 .NET 5、.NET 6)失去了这种能力。 - DarthGizka
1个回答

2
当我们在等待Rider可能/希望集成此功能时,这里有一个选项,在某些方面甚至比微软的提供更好:较新版本的LINQPad的组合反编译、IL和本地反汇编视图。我经常同时使用Rider和LINQPad,它们相互补充。

这是我如何验证一个封装了Int64的readonly struct的抽象成本确实为零,正如我所希望的:

combined decompilation, IL and native disassembly view (如果需要,单击以放大)

上面的窗格显示了源代码,其中嵌套了一个for循环,该循环重复调用BT.ERezeptId上的静态方法,并将结果存储到数组中。

反编译窗格(左侧)显示编译器已将for循环有效地转换为等效的while循环。

我只在 IL 窗格(中间)上聚焦于内部循环,因为在 IL 中,循环设置和外部循环增加了许多无聊的行。

本机代码窗格(右侧)显示编译器在优化 IL 时切除了相当多的废话。它有效地内联/扁平化了源代码级别上几层深的调用,从而消除了所有抽象成本。该代码的效率与处理裸露的 Int64 相同,而不是包装一个 Int64 的结构体。

这最明显的表现是,在源代码级别上调用的方法是 zufaellig(),而在本机代码中调用的方法是 Zufallswert()。实际上,编译器之所以在那一点停止内联,是因为我命令它这样做!

以下是被消除的抽象层级(全部驻留在一个引用程序集中,而不是当前源文件中):

public readonly partial struct ERezeptId
{
    private readonly long m_Wert;

    public ERezeptId (Ungeprueft<long> ungeprueft)
    {
        m_Wert = ungeprueft.Wert;
    }

    // ...

    public static ERezeptId zufaellig (Random rng)
    {
        return new ERezeptId(new Ungeprueft<long>(Zufallswert(rng)));
    }

    [MethodImpl(MethodImplOptions.NoInlining)]
    public static long Zufallswert (Random rng)
    {
        // ...
    }
}

public readonly struct Ungeprueft<T>
{
    public readonly T Wert;

    public Ungeprueft (T wert)
    {
        Wert = wert;
    }
}

注意:这个答案并没有展示如何在Rider中查看反编译,因为这个功能目前还不可用。然而,对于任何Rider用户或者.NET程序员来说,LINQPad都是一个有用的工具。事实上,如果必要的话,我也许可以使用另一个IDE代替Rider,但是没有LINQPad我将无法高效地工作... NB: Ungeprueft<>(德语意为“未经检查”)是我的标准模板之一,它明确了参数验证被有意绕过的情况。

虽然这是一个老问题,但感谢您提供有用的答案。 - miniar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接