jitCompilationStart MDA

Uwaga / Notatka

Ten artykuł jest specyficzny dla programu .NET Framework. Nie ma zastosowania do nowszych implementacji .NET, w tym .NET 6 i nowszych wersji.

Asystent jitCompilationStart zarządzanego debugowania (MDA) jest aktywowany do raportowania, gdy kompilator just in time (JIT) rozpoczyna kompilowanie funkcji.

Symptoms

Rozmiar zestawu roboczego zwiększa się dla programu, który jest już w formacie obrazu natywnego, ponieważ mscorjit.dll jest ładowany do procesu.

Przyczyna

Nie wszystkie zestawy, od których zależy program, zostały wygenerowane w formacie natywnym lub zestaw nie jest poprawnie zarejestrowany.

Rozdzielczość

Włączenie tej usługi MDA umożliwia określenie, która funkcja jest kompilowana w trybie JIT. Upewnij się, że zestaw zawierający funkcję jest generowany w formacie natywnym i poprawnie zarejestrowany.

Wpływ na środowisko uruchomieniowe

Ta usługa MDA rejestruje komunikat tuż przed skompilowaniem metody JIT, dlatego włączenie tej usługi MDA ma znaczący wpływ na wydajność. Jeśli metoda jest wbudowana, ta usługa MDA nie wygeneruje oddzielnego komunikatu.

Wynik

Poniższy przykładowy kod przedstawia przykładowe dane wyjściowe. W tym przypadku dane wyjściowe pokazują, że w teście zestawu metoda "m" w klasie "ns2.CO" została skompilowana w trybie JIT.

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

Konfiguracja

Poniższy plik konfiguracji przedstawia różne filtry, które można zastosować do filtrowania metod zgłaszanych podczas pierwszego kompilowania JIT. Można określić, że wszystkie metody mają być zgłaszane, ustawiając wartość atrybutu name na *.

<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>

Example

Poniższy przykładowy kod ma być używany z poprzednim plikiem konfiguracji.

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() { }
        }
    }
}

Zobacz także