您的位置:首頁 > 軟件教程 > 教程 > 深度研究:AOT編譯器的源碼級調(diào)試

深度研究:AOT編譯器的源碼級調(diào)試

來源:好特整理 | 時(shí)間:2024-10-17 10:00:38 | 閱讀:194 |  標(biāo)簽: a T Net   | 分享到:

一:背景 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)這一過程。

二、托管和非托管調(diào)試器

調(diào)試器介紹

大家都知道AOT Compiler (ilc.exe) 是用C#代碼寫的,因此它是一個托管程序。托管程序的調(diào)試有兩種調(diào)試器:

  • Visual Studio 托管調(diào)試器:對C#代碼的調(diào)試非常便捷,但對非托管部分的查看卻缺少了手段。
  • WinDbg 非托管調(diào)試器:雖然可以用于調(diào)試C#代碼,但在變量顯示等方面不是很直觀。

總的來說,各有利弊。接下來,我們將通過Visual Studio和Windbg實(shí)現(xiàn)各自的攔截。

三、調(diào)試器攔截實(shí)戰(zhàn)

1. WinDbg攔截

作為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。

2. 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)。

3. VS對ilc的啟動調(diào)試

每一次AOT編譯之前在native目錄下都會有一個xxx.ilc.rsp,這個文件是AOT Compiler的輸入來源。因此我們可以將它作為ilc.sln項(xiàng)目的啟動參數(shù)。將@xxx.ilc.rsp文件放到ILCompiler項(xiàng)目的command line中,配置好之后可以輕松成功調(diào)試。

四、總結(jié)

以劫持的方式對AOT Compiler自身進(jìn)行源碼級調(diào)試,這本身就是一個極具意義的話題。不斷的介入Compiler編譯的各個階段,相信能給大家深度學(xué)習(xí)AOT提供了一些不同以往的手段。

深度研究:AOT編譯器的源碼級調(diào)試

小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認(rèn)同期限觀點(diǎn)或證實(shí)其描述。

a 1.0
a 1.0
類型:休閑益智  運(yùn)營狀態(tài):正式運(yùn)營  語言:中文   

游戲攻略

游戲禮包

游戲視頻

游戲下載

游戲活動

《alittletotheleft》官網(wǎng)正版是一款備受歡迎的休閑益智整理游戲。玩家的任務(wù)是對日常生活中的各種雜亂物

相關(guān)視頻攻略

更多

掃二維碼進(jìn)入好特網(wǎng)手機(jī)版本!

掃二維碼進(jìn)入好特網(wǎng)微信公眾號!

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]

湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)