在.Net中如何查看JIT编译器执行流程

起因

在去年看.Net Conf China大会中,看到龙芯.Net编译组组长分享的PPT,有一张是介绍JIT执行过程,当时看着挺蒙,其实现在也只是有点印象了.JIT将IL生成机器码过程是比较复杂.不过本文只是简单了解JIT执行流程.

我们先看看分享图:
龙芯.Net编译组组长分享.Net JIT编译器执行的过程图
从上图有3个层次(由上至下,最上方是JIT初始化阶段,中间为优化阶段(初始化阶段和优化阶段还是HIR),下面为后端生成(LIR))
HIR(High-Level Intermediate Representation):高级中间表示
LIR(Low-Level Intermediate Representation):低级中间表示

如何查看JIT编译器执行流程

在源码根目录: docs/design/coreclr/jit ,JIT相关文档.
  1. ryujit-tutorial.md 介绍JIT执行流程(阶段),里面有上方图
  2. viewing-jit-dumps.md 有JIT相关配置介绍

如果本地没有编译好的.Net环境,要在本地编译一下: 如何编译.Net 6 Runtime源码

使用PowerShell添加JIT调试环境变量:
# 在控制台输出Main方法 JIT执行流程 在.Net 5中可以COMPlus_JitDump="Main",在.Net 6配置环境变量建议用DOTNET_前缀
$env:DOTNET_JitDump="Main"

# 在控制台输出Main方法 JIT生成汇编代码
$env:DOTNET_JitDisasm="Main"

测试代码:

private static void Main(string[] args)
{
    int num = 10;
    int sum = num + num + num + num + num;  //在.Net 7正式版本, JIT会进行优化, 5个数相加,会转为 num = num << 2; num = num + 10;
    Console.WriteLine(sum);
}

先把JIT生成汇编代码环境加入环境变量中,然后执行corerun.exe networkapp.dll(.Net程序,测试代码生成)

在环境变量中,加入DOTNET_Jitdisasm=\

配置JitDump环境变量后,执行:

.\corerun.exe .\NetworkApp.dll

配置JitDump环境变量后,输出JIT执行流程

JitDump输出的内容可以和上图进行对应,因为输出的内容太多,就不展示了,内容已经上传百度网盘了. 

链接: https://pan.baidu.com/s/1Mn_UIfBPMKbAX3h4KKIZkg 提取码: df5r

秋风 2022-03-03