分享方式:


jitCompilationStart MDA

注意

本文專屬於 .NET Framework。 它不適用於較新的 .NET 實作,包括 .NET 6 和更新版本。

當 Just-In-time (JIT) 編譯器開始編譯函式時,會啟動 jitCompilationStart Managed 偵錯助理 (MDA)。

徵兆

已使用原生影像格式的程式,工作集大小會增加,因為mscorjit.dll載入進程。

原因

並非所有程式相依的元件都已產生為原生格式,或未正確註冊元件。

解決方法

啟用此 MDA 可讓您識別正在編譯 JIT 的函式。 請確定包含函式的元件會產生為原生格式並正確註冊。

對運行時間的影響

此 MDA 會在方法剛要進行 JIT 編譯之前記錄訊息,所以啟用此 MDA 會對效能造成重大影響。 如果方法內嵌,此 MDA 將不會產生個別的訊息。

輸出

下列程式碼範例會顯示範例輸出。 在此情況下,輸出會顯示在元件測試中,類別 「ns2.CO」 上的方法 「m」 是 JIT 編譯的。

method name="Test!ns2.C0::m"

組態

下列組態檔顯示的各種篩選器,可用來篩選出第一次 JIT 編譯時要報告哪些方法。 您可以將名稱屬性的值設定為 *,指定回報所有的方法。

<mdaConfig>
  <assistants>
    <jitCompilationStart>
      <methods>
        <match name="C0::m" />
        <match name="MyMethod" />
        <match name="C2::*" />
        <match name="ns0::*" />
        <match name="ns1.C0::*" />
        <match name="ns2.C0::m" />
        <match name="ns2.C0+N0::m" />
      </methods>
    </jitCompilationStart >
  </assistants>
</mdaConfig>

範例

下列程式碼範例是用來搭配先前的組態檔。

using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

public class Entry
{
    public static void Main(string[] args)
    {
        C0.m();
        C1.MyMethod();
        C2.m();

        ns0.C0.m();
        ns0.C0.N0.m();
        ns0.C1.m();

        ns1.C0.m();
        ns1.C0.N0.m();

        ns2.C0.m();
        ns2.C0.N0.m();
    }
}

public class C0
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    public static void m() { }
}

public class C1
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    public static void MyMethod() { }
}

public class C2
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    public static void m() { }
}

namespace ns0
{
    public class C0
    {
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void m() { }

        public class N0
        {
            [MethodImpl(MethodImplOptions.NoInlining)]
            public static void m() { }
        }
    }

    public class C1
    {
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void m() { }
    }
}

namespace ns1
{
    public class C0
    {
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void m() { }
        public class N0
        {
            [MethodImpl(MethodImplOptions.NoInlining)]
            public static void m() { }
        }
    }
}

namespace ns2
{
    public class C0
    {
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void m() { }

        public class N0
        {
            [MethodImpl(MethodImplOptions.NoInlining)]
            public static void m() { }
        }
    }
}

另請參閱