Visual Studio 支持外部源代碼調試和反編譯已經有一段時間了。然而,隨着 Visual Studio 17.7的發佈,調試器有了一個重大的飛躍,它爲 .NET 庫引入了自動反編譯功能,使得 Visual Studio 中的外部代碼調試變得更加流暢和輕鬆。它集成了反編譯器,可以實時反編譯外部代碼,並根據需要將其無縫地集成到調試器中。
在本文中,我們將研究 Visual Studio 的自動反編譯特性,強調其在調試和工程外部代碼中的重要性。
探索自動反編譯及其內部工作原理
Visual Studio 的調試器利用了 ILspy 反編譯器引擎。它有助於將編譯後的二進制代碼(機器代碼)轉換回更高級的編程語言,如 C#。這意味着開發人員可以輕鬆地檢查、排除故障並修復外部代碼中的問題,就像他們正在處理自己的代碼一樣。
當涉及到外部源代碼時,將自動反編譯想象成 Visual Studio 調試器的備份計劃:它首先在您的機器上搜索本地外部源代碼,然後使用來自 PDB 文件的 Source Link 或 Source Server 信息來加載源代碼。如果其他方法都失敗,則調試器反編譯代碼以供顯示。
雖然 Visual Studio 中的自動反編譯特性提高了調試的效率,但 .NET 包作者可以完全控制他們是否想要他們的工作成果被反編譯。這可以通過在程序集或模塊中實現 SuppressIldasmAttribute 屬性來實現,從而有效地防止 Visual Studio 啓動反編譯過程。雖然這個屬性在 .NET 6+中已經過時了,但 Visual Studio 還是支持該屬性。
再好的東西也有一定的侷限性。當試圖反編譯 .NET 程序集以獲得見解時,遇到限制並不罕見。如果你想了解更多,請參閱《Decompile .NET code while debugging 》
利用外部代碼的自動反編譯
還記得在 Visual Studio 中加載外部代碼有點像解謎的日子嗎?你不得不手動找出如何做到這一點,從“No Source Page”。但是現在,有了自動反編譯,調試器會替您思考。您可以專注於完善您的代碼,並且調試器確保您擁有所需的外部代碼片段,它們應該在解決方案資源管理器中。
現在,讓我們看看如何充分利用反編譯場景來提高效率和生產力。
爲了說明這一點,讓我們考慮一下這個簡單的 WPF 應用程序。我想引導您注意位於底部的調用堆棧窗口。目前,此窗口內的調用堆棧僅源自於代碼中高亮顯示的第12行相關的本地代碼。
現在,激動人心的部分來了。在調用堆棧的頂部菜單上,您將看到一個標記爲“show external code”的選項。選擇此選項後,調用堆棧不僅會顯示本地代碼堆棧,還會顯示外部代碼組件。這裏的外部代碼主要是框架代碼,如 PresentationCore.dll, WindowsBase.dll 等。
當我從外部代碼單擊這些調用堆棧時,它會在一瞬間自動爲我反編譯它。反編譯代碼雖然與原始源代碼不同,但仍提供了對各種函數和組件如何工作的見解。
通過外部代碼導航和調試
繼續我們的旅程,這一過程超出了其最初的能力。讓我們將焦點轉移到解決方案資源管理器上,當您處於調試模式時,一個名爲“External Sources”的特殊節點會出現在最頂部。
該節點充當虛擬文件瀏覽器,整齊地組織來自不同調用棧的反編譯外部代碼模塊。
此設置允許我研究這些外部模塊並檢查代碼的特定部分。通過在這段外部代碼中放置斷點,我可以再向前邁出重要的一步。這意味着,如果有必要,我可以在特定的點暫停代碼的執行,就像我對自己的代碼所做的那樣,使外部代碼調試儘可能無縫。
例如,在我的 WPF 應用程序中,我使用我的“MessageLibrary”來顯示點擊按鈕時的通知。如下面的視頻所示,我可以流暢地瀏覽外部代碼,就像我在解決方案資源管理器中處理自己的代碼一樣。如果有必要,我還可以設置斷點並通過這些文件進行調試。
當你使用一個嚴重依賴外部包和 dll 的應用程序時,這尤其方便。想象一下,您正在處理一個棘手的 bug,它可能隱藏在這些外部部件中。在這種情況下,深入瞭解這些外部部件將改變遊戲規則,從而提高調試效率。
自動反編譯非常有用,可以提高您的效率。但是,如果出於任何原因您想要關閉此自動功能,您可以通過設置選項 Debug > General> Automatically decompile to source when needed. (Managed only)
結論
總而言之,Visual Studio 中引入的自動反編譯功能徹底改變了我們調試外部代碼的方式。我們真的很想知道恁對這個新體驗的看法。如果您有任何想法或建議,請在開發者社區網站上與我們分享。您的意見對我們非常有價值!
原文鏈接:https://devblogs.microsoft.com/visualstudio/elevating-debugging-with-auto-decompilation-and-external-sources/