讓映射更容易在 .NET 中偵錯

當編譯 Unmanaged 程式碼時,您可以設定 IDE 參數或命令列選項,設定可執行映像進行偵錯。 例如,您可以在 Visual C++ 中使用 /Zi 命令列選項,要求它發出偵錯符號檔 (副檔名為 .pdb)。 同樣地,/Od 命令列選項會通知編譯器停用最佳化。 產生的程式碼執行速度較慢,但偵錯會比較容易,這應該是必要的。

編譯.NET Framework Managed 程式碼時,Visual C++、Visual Basic 和 C# 等編譯器會將其來來源程式編譯成 Microsoft 中繼語言 (MSIL) 。 MSIL 接著會在執行之前先編譯 JIT 編譯成機器碼。 如同使用 Unmanaged 程式碼一樣,您可以設定 IDE 參數或命令列選項,設定可執行映像進行偵錯。 您也可以以非常相同的方式設定 JIT 編譯以進行偵錯。

JIT 組態有兩個層面:

  • 您可以要求 JIT 編譯程式產生追蹤資訊。 這可讓偵錯工具的機器碼對應項目對應上 MSIL 鏈結,追蹤本機變數和函式引數的儲存位置。 在 .NET Framework 2.0 版和更新版本中,JIT 編譯程式一律會產生追蹤資訊,因此不需要要求它。

  • 您可以要求 JIT 編譯程式不優化產生的機器碼。

一般而言,產生 MSIL 的編譯器會根據您指定的 IDE 參數或命令列選項,適當地設定這些 JIT 編譯程式選項,例如 /Od

在某些情況下,您可能想要變更 JIT 編譯器的行為,以便更容易偵錯它產生的機器碼。 例如,您可能想要產生零售組建的 JIT 追蹤資訊,或控制最佳化。 您可以使用初始設定 (.ini) 檔案完成此作業。

例如,如果您想要偵錯的元件稱為MyApp.exe,則可以在包含這三行的相同MyApp.exe資料夾中,建立名為MyApp.ini的文字檔:

[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0

每個選項的值可以設成 0 或 1,任何不存在的選項預設值皆為 0。 將 GenerateTrackingInfo 設為 1、AllowOptimize 設為 0,會提供最簡單的偵錯。

從 .NET Framework 2.0 開始,JIT 編譯程式一律會產生追蹤資訊,而不論 的值 GenerateTrackingInfo 為何;不過, AllowOptimize 值仍然有作用。 當使用 Ngen.exe (原生映像產生器) 先行編譯未最佳化的原生映像時,在執行 Ngen.exe 時,.ini 檔案中必須位在目標資料夾中且附有 AllowOptimize=0。 如果您已先行編譯元件而不進行優化,您必須先使用 NGen.exe /uninstall 選項移除先行編譯器代碼,然後再重新執行Ngen.exe,才能將程式碼預先編譯為優化。 如果資料夾中沒有.ini檔案,預設Ngen.exe會將程式碼預先編譯為優化。

System.Diagnostics.DebuggableAttribute 控制組件的設定。 DebuggableAttribute 包含兩個欄位,可控制 JIT 編譯程式是否應該優化和/或產生追蹤資訊。 在 .NET Framework 2.0 和更新版本中,JIT 編譯程式一律會產生追蹤資訊。

針對零售組建,編譯器不會設定任何 DebuggableAttribute。 根據預設,JIT 編譯程式會產生最高效能,最難以偵錯機器碼。 啟用 JIT 追蹤會略降低效能,而停用最佳化則會大幅降低效能。

DebuggableAttribute 是一次套用至整個組件,不是一一套用到組件中的個別模組。 因此,開發工具必須將自訂屬性附加至組件中繼資料權杖 (如已建立組件),或附加至稱為 System.Runtime.CompilerServices.AssemblyAttributesGoHere 的類別。 然後,ALink 工具會將這些 DebuggableAttribute 屬性從每個模組升階到它們成為其一部分的元件。 如果發生衝突,ALink 作業就會失敗。

注意

在 .NET Framework 1.0 版中,當指定 /clr/Zi 編譯器選項時,Microsoft Visual C++ 編譯器會新增 DebuggableAttribute。 在 .NET Framework 1.1 版中,您必須在程式碼中手動新增DebuggableAttribute,或使用/ASSEMBLYDEBUG連結器選項。

另請參閱