jitCompilationStart MDA
Управляемый помощник по отладке (MDA) jitCompilationStart активируется, чтобы сообщить о том, что JIT-компилятор начал компиляцию функции.
Признаки
Размер рабочего множества для программы увеличивается, даже если она уже в формате исходного образа, поскольку в процесс загружается mscorjit.dll.
Причина
Не все сборки, от которых зависит программа, были сгенерированы в исходный формат, или те сборки, которые были сгенерированы в исходный формат, не были правильно зарегистрированы.
Решение
Включение данного MDA позволяет определить, какие функции были скомпилированы посредством JIT-компилятора. Следует определить, была ли сборка, содержащая функцию, сгенерирована в исходном формате и правильно зарегистрирована.
Влияние на среду выполнения
Данный MDA записывает сообщение непосредственно перед компиляцией метода с помощью JIT-компилятора, поэтому включение данного MDA оказывает значительное влияние на производительность. Обратите внимание, что если метод является встроенным, данный MDA не будет генерировать отдельное сообщение.
Output
В следующем образце кода приведен пример вывода. В данном случае результат показывает, что в сборке "Тест" метод "m" класса "ns2.CO" был скомпилирован посредством 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() { }
}
}
}
См. также
Ссылки
Основные понятия
Диагностика ошибок посредством управляемых помощников по отладке