Udostępnij za pośrednictwem


jitCompilationStart MDA

Uwaga

Ten artykuł jest specyficzny dla programu .NET Framework. Nie ma zastosowania do nowszych implementacji platformy .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.

Objawy

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.

Rozwiązanie

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.

Wyjście

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"

Konfigurowanie

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>

Przykład

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