一:背景 1. 講故事 上篇聊到了 C#程序編譯成Native代碼 的宏觀過程,有粉絲朋友提了一個問題,能不能在 dotnet publish 發(fā)布的過程中對AOT編譯器攔截進(jìn)行源碼級調(diào)試,這是一個好問題,也是深度研究的必經(jīng)之路,這篇我們就來分享下吧。 二:托管和非托管調(diào)試器 1. 調(diào)試器介紹 相信
上篇文章介紹了C#程序編譯成Native代碼的宏觀過程。有粉絲朋友提出了一個問題:是否能夠在dotnet publish發(fā)布的過程中對AOT編譯器進(jìn)行源碼級調(diào)試? 這是一個極具挑戰(zhàn)性的問題,也是深度研究的必經(jīng)之路。在本文中,我們將分享如何實(shí)現(xiàn)這一過程。
上篇文章中我們討論了C#程序編譯成Native代碼的宏觀過程。其中有一位粉絲朋友提出了一個問題:在dotnet publish發(fā)布的過程中是否能對AOT編譯器進(jìn)行源碼級調(diào)試?這是一個極具挑戰(zhàn)性的問題,也是深度研究的必經(jīng)之路。在本文中,我們將分享如何實(shí)現(xiàn)這一過程。
大家都知道AOT Compiler (ilc.exe) 是用C#代碼寫的,因此它是一個托管程序。托管程序的調(diào)試有兩種調(diào)試器:
總的來說,各有利弊。接下來,我們將通過Visual Studio和Windbg實(shí)現(xiàn)各自的攔截。
作為Windows平臺上非托管調(diào)試器的代表,使用它來劫持ilc.exe非常方便。只需在注冊表的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ilc.exe下配置Debugger鍵值即可。接下來使用dotnet publish發(fā)布程序,稍等片刻,Windbg將立即啟動攔截ilc.exe,然后通過ctrl+o打開需要下斷點(diǎn)的cs文件,如核心的Compilation方法。Windbg的使用雖然簡單粗暴,但用非托管調(diào)試器調(diào)試C#總顯得不夠規(guī)范,更好的方式應(yīng)該是使用專業(yè)級的Visual Studio。
上一篇文章談到,執(zhí)行dotnet publish調(diào)用的ilc.exe來自目錄.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.8\tools。為了使用托管調(diào)試器,我們將ilc.sln項(xiàng)目手工編譯出一個ilc.exe,然后將其替換原有的ilc.exe。ilc提供了一個--waitfordebugger參數(shù),通過Console.ReadLine讓程序暫停,好讓你用VS去Attach。然而,在手工編譯的ilc.exe上使用Console.ReadLine貌似攔不住,因此需要稍作修改。重新編譯項(xiàng)目,將生成目錄runtime\artifacts\bin\coreclr\windows.x64.Debug\ilc\net8.0下的所有文件復(fù)制到.nugut目錄下,一切準(zhǔn)備就緒后使用dotnet publish重新發(fā)布程序,從cmd輸出中可以看到正在等待attach附加。在VS菜單上Debug -> Attach to Process到我們的ilc.exe進(jìn)程,可以看到命中了斷點(diǎn)。
每一次AOT編譯之前在native目錄下都會有一個xxx.ilc.rsp,這個文件是AOT Compiler的輸入來源。因此我們可以將它作為ilc.sln項(xiàng)目的啟動參數(shù)。將@xxx.ilc.rsp文件放到ILCompiler項(xiàng)目的command line中,配置好之后可以輕松成功調(diào)試。
以劫持的方式對AOT Compiler自身進(jìn)行源碼級調(diào)試,這本身就是一個極具意義的話題。不斷的介入Compiler編譯的各個階段,相信能給大家深度學(xué)習(xí)AOT提供了一些不同以往的手段。
小編推薦閱讀
機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動態(tài)代理的對比分析
閱讀Win11筆記本“自動管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]
湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)