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

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

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

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

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

調(diào)試器介紹

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

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

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

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

1. WinDbg攔截

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

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

3. VS對(duì)ilc的啟動(dòng)調(diào)試

每一次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)試。

四、總結(jié)

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

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

小編推薦閱讀

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

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

游戲攻略

游戲禮包

游戲視頻

游戲下載

游戲活動(dòng)

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

相關(guān)視頻攻略

更多

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

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

本站所有軟件,都由網(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)