一:背景 1. 講故事 上篇聊到了 C#程序編譯成Native代碼 的宏觀過(guò)程,有粉絲朋友提了一個(gè)問(wèn)題,能不能在 dotnet publish 發(fā)布的過(guò)程中對(duì)AOT編譯器攔截進(jìn)行源碼級(jí)調(diào)試,這是一個(gè)好問(wèn)題,也是深度研究的必經(jīng)之路,這篇我們就來(lái)分享下吧。 二:托管和非托管調(diào)試器 1. 調(diào)試器介紹 相信
上篇文章介紹了C#程序編譯成Native代碼的宏觀過(guò)程。有粉絲朋友提出了一個(gè)問(wèn)題:是否能夠在dotnet publish發(fā)布的過(guò)程中對(duì)AOT編譯器進(jìn)行源碼級(jí)調(diào)試? 這是一個(gè)極具挑戰(zhàn)性的問(wèn)題,也是深度研究的必經(jīng)之路。在本文中,我們將分享如何實(shí)現(xiàn)這一過(guò)程。
上篇文章中我們討論了C#程序編譯成Native代碼的宏觀過(guò)程。其中有一位粉絲朋友提出了一個(gè)問(wèn)題:在dotnet publish發(fā)布的過(guò)程中是否能對(duì)AOT編譯器進(jìn)行源碼級(jí)調(diào)試?這是一個(gè)極具挑戰(zhàn)性的問(wèn)題,也是深度研究的必經(jīng)之路。在本文中,我們將分享如何實(shí)現(xiàn)這一過(guò)程。
大家都知道AOT Compiler (ilc.exe) 是用C#代碼寫(xiě)的,因此它是一個(gè)托管程序。托管程序的調(diào)試有兩種調(diào)試器:
總的來(lái)說(shuō),各有利弊。接下來(lái),我們將通過(guò)Visual Studio和Windbg實(shí)現(xiàn)各自的攔截。
作為Windows平臺(tái)上非托管調(diào)試器的代表,使用它來(lái)劫持ilc.exe非常方便。只需在注冊(cè)表的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ilc.exe下配置Debugger鍵值即可。接下來(lái)使用dotnet publish發(fā)布程序,稍等片刻,Windbg將立即啟動(dòng)攔截ilc.exe,然后通過(guò)ctrl+o打開(kāi)需要下斷點(diǎn)的cs文件,如核心的Compilation方法。Windbg的使用雖然簡(jiǎn)單粗暴,但用非托管調(diào)試器調(diào)試C#總顯得不夠規(guī)范,更好的方式應(yīng)該是使用專業(yè)級(jí)的Visual Studio。
上一篇文章談到,執(zhí)行dotnet publish調(diào)用的ilc.exe來(lái)自目錄.nuget\packages\runtime.win-x64.microsoft.dotnet.ilcompiler\8.0.8\tools。為了使用托管調(diào)試器,我們將ilc.sln項(xiàng)目手工編譯出一個(gè)ilc.exe,然后將其替換原有的ilc.exe。ilc提供了一個(gè)--waitfordebugger參數(shù),通過(guò)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目錄下都會(huì)有一個(gè)xxx.ilc.rsp,這個(gè)文件是AOT Compiler的輸入來(lái)源。因此我們可以將它作為ilc.sln項(xiàng)目的啟動(dòng)參數(shù)。將@xxx.ilc.rsp文件放到ILCompiler項(xiàng)目的command line中,配置好之后可以輕松成功調(diào)試。
以劫持的方式對(duì)AOT Compiler自身進(jìn)行源碼級(jí)調(diào)試,這本身就是一個(gè)極具意義的話題。不斷的介入Compiler編譯的各個(gè)階段,相信能給大家深度學(xué)習(xí)AOT提供了一些不同以往的手段。
小編推薦閱讀
如何使用 Pytorch 中的 DataSet 和 DataLoader
閱讀golang slice相關(guān)常見(jiàn)的性能優(yōu)化手段
閱讀連接Elasticsearch服務(wù)器的Python代碼示例
閱讀國(guó)產(chǎn)操作系統(tǒng)上實(shí)現(xiàn)RTMP推流攝像頭視頻和麥克風(fēng)聲音到流媒體服務(wù)器
閱讀使用Python讀取和導(dǎo)出NetCDF格式的多時(shí)相柵格文件
閱讀多租戶系統(tǒng)數(shù)據(jù)權(quán)限設(shè)計(jì)與RuoYi系統(tǒng)的借鑒
閱讀count(*)、count(1)哪個(gè)更快?面試必問(wèn):通宵整理的十道經(jīng)典MySQL必問(wèn)面試題
閱讀從需求分析、產(chǎn)品設(shè)計(jì)到部署交付各階段說(shuō)明
閱讀如何利用七牛云進(jìn)行數(shù)據(jù)備份和刪除
閱讀強(qiáng)化學(xué)習(xí)筆記之【ACE:Off-PolicyActor-CriticwithCausality-AwareEntropyRegularization】
閱讀使用MailKit在.NET Core中收發(fā)郵件的完整示例
閱讀WiFi基礎(chǔ)(六):天線基礎(chǔ)知識(shí)
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2024 haote.com 好特網(wǎng)