備註
本文專屬於 .NET Framework。 它不適用於較新的 .NET 實作,包括 .NET 6 和更新版本。
編譯 Unmanaged 程式代碼時,您可以藉由設定 IDE 參數或命令行選項來設定可執行映射以進行偵錯。 例如,您可以使用 Visual C++ 中的 /Zi 命令行選項,要求它發出偵錯符號檔 (擴展名 .pdb)。 同樣地,/Od 命令行選項會指示編譯程式停用優化。 產生的程式代碼執行速度會比較慢,但如果有必要,就更容易進行偵錯。
編譯 .NET Framework Managed 程式代碼時,Visual C++、Visual Basic 和 C# 等編譯程式會將其來源程式編譯成通用中繼語言 (CIL)。 CIL 接著會在執行之前,透過即時編譯(JIT)轉譯成本機機器碼。 如同 Unmanaged 程式代碼,您可以藉由設定 IDE 參數或命令行選項來設定可執行映射以進行偵錯。 您也可以以完全相同的方式設定 JIT 編譯以進行偵錯。
此 JIT 組態有兩個層面:
您可以要求 JIT 編譯程式產生追蹤資訊。 這讓偵錯工具能夠將 CIL 鏈結與其機器碼對應起來,並追蹤儲存局部變數和函式參數的位置。 在 .NET Framework 2.0 版和更新版本中,JIT 編譯程式一律會產生追蹤資訊,因此不需要要求它。
您可以要求 JIT 編譯程式不要將產生的機器程式代碼優化。
一般而言,產生 CIL 的編譯程式會根據您指定的 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 (本機映像產生器) 在未經優化的情況下預先編譯本機映像時,.ini 檔案必須在 Ngen.exe 執行時存在於目標資料夾中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 連結器選項。