分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

一.Net CoreClr 2.0的编译及调试

发布时间:2023-09-06 01:36责任编辑:熊小新关键词:编译

小目标:我们的目的是用.Net Core 2.0 SDK编译一个小控制台程序 test_core.dll ,然后用VS2017 Debug coreclr 源码 ,接下来就可以详细调试、查看test_core.dll 中IL代码是怎么一步步jit成Native代码的。

1.下载最新 coreclr 源码并切换到release/2.0.0分支 ,本文章主要目的是学习coreclr源码,由于主Master代码一直在更新,好多新问题并没有及时修复,选用release分支可以避免很多编译问题,同时也很稳定。

2.准备coreclr编译环境 ,本次选用Win10系统,VS2017编译及调试(本机VS2015,VS2017都安装了)。

3.一切准备就绪coreclr目录打开控制台 .\build skiptests,漫长等待,编译完成如下:

4.配置Debug,Github上有相关描述,但是比较老,并不完全好用,下面加入我个人理解,重新整理如下:

  • a. 找到文件夹 coreclr\bin\obj\Windows_NT.x64.Debug ,VS2017打开 CoreCLR.sln
  • b.设置 INSTALL工程为启动项目。
  • c.设置 INSTALL工程->右键properties ->Debugging。
  • d.设置 Command=$(SolutionDir)..\..\product\Windows_NT.$(Platform).$(Configuration)\corerun.exe。
  • e.设置 Command Arguments=<managed app you wish to run> (e.g. test_core.dll)。
  • f.设置 Directory=$(SolutionDir)..\..\product\Windows_NT.$(Platform).$(Configuration)这个文件夹包含了编译 CoreCLR 生成的dll和pdb文件。
  • g.设置 Environment=CORE_LIBRARIES=C:\Program Files\dotnet\shared\Microsoft.NETCore.App\2.0.3 (此配置告诉CoreCLR去此路径去找基础托管类库,不配置debug会抛错,为了方便直接指向本机.Net Core SDK内文件夹)。

完整配置如下: 

小总结:现在为止一共涉及到3方dll(托管和非托管):

  • 我们自己编译的托管 test_core.dll ,也是主要实验对象。
  • .NET Core SDK的托管基础类库System.Runtime.dll、System.Threading.dll、、、等(test_core.dll 相关托管依赖)。
  • 我们编译的CoreClr非托管dll,coreclr.dll、clrjit.dll、CoreRun.exe、、等,是我们主要的Debug对象。

5.用编译test_core.dll

用.Net Core2.0 SDK编译如下代码,如何编译自行脑补

 1 using System; 2 using System.Runtime.CompilerServices; 3 ?4 namespace test_core 5 { 6 ????class Program 7 ????{ 8 ????????const int Pass = 100; 9 ????????const int Fail = -1;10 ????????[MethodImplAttribute(MethodImplOptions.NoInlining)]11 ????????public static void DblRoots(double a, double b, double c, ref double r1, ref double r2)12 ????????{13 ????????????r1 = (-b + Math.Sqrt(b * b - 4 * a * c)) / (2 * a);14 ????????????r2 = (-b - Math.Sqrt(b * b - 4 * a * c)) / (2 * a);15 ????????????return;16 ????????}17 ????????static int Main(string[] args)18 ????????{19 ????????????double x1 = 0;20 ????????????double x2 = 0;21 ????????????DblRoots(1d, -5d, 6d, ref x1, ref x2);22 ????????????Console.WriteLine(x1 + "," + x2);23 ????????????if (System.Math.Abs(x1 - 3d) > Double.Epsilon) return Fail;24 ????????????if (System.Math.Abs(x2 - 2d) > Double.Epsilon) return Fail;25 ????????????string str = Console.ReadLine();26 ????????????return Pass;27 28 ????????}29 ????}30 }

将编译生成内容全部copy到coreclr\bin\Product\Windows_NT.x64.Debug目录中

6.VS2017中设置断点并运行查看test_core.dll的运行结果

7.接下来就是发挥想象力的时候了,可以参考 GitHub coreclr 文档,关键位置下断点,调试ryujit核心代码。

8.希望此文能帮助大家更容易的Debug CoreClr,欢迎各路大拿指点。

一.Net CoreClr 2.0的编译及调试

原文地址:https://www.cnblogs.com/terry2018/p/8280846.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved