小目標:我們的目的是用.Net Core 2.0 SDK編譯一個小控制台程式 test_core.dll ,然後用VS2017 Debug coreclr 源碼 ,接下來就可以詳細調試、查看test_core.dll 中IL代碼是怎麼一步步jit成Native代碼的。 1.下載最新 coreclr ...
小目標:我們的目的是用.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,歡迎各路大拿指點。