jitCompilationStart MDA

在实时 (JIT) 编译器开始编译函数时,将激活 jitCompilationStart 托管调试助手 (MDA) 来报告此情况。

症状

因为已将 mscorjit.dll 加载到进程中,所以将为本机图像格式的程序增大工作集大小。

原因

尚未将该程序依赖的所有程序集都生成为本机格式,或者已经生成为本机格式的程序集未正确注册。

解决方法

使用此 MDA,您可以确定哪个函数正在进行 JIT 编译。 确定包含该函数的程序集是否已生成为本机格式以及是否已正确注册。

对运行时的影响

此 MDA 在 JIT 编译一个方法之前会记录一条消息,所以启用此 MDA 将对性能产生重大影响。 请注意,如果方法是内联的,则此 MDA 将不会另外生成一条消息。

Output

下面的代码示例演示示例输出。 在此例中,该输出显示:在程序集“测试”中,类“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() { }
        }
    }
}

请参见

参考

MarshalAsAttribute

概念

使用托管调试助手诊断错误

互操作封送处理