如果您嘗試偵錯程式碼,當該程式碼 未 最佳化時,會更容易。 優化程式碼時,編譯器和執行階段會變更發出的 CPU 程式碼,使其執行速度更快,但與原始原始程式碼的直接對應較少。 如果映射較不直接,除錯器通常無法提供局部變數的值,而且程式碼單步執行和斷點可能無法如預期般運作。
備註
如需 JIT (Just-In-Time) 偵錯的詳細資訊,請參閱 在 Visual Studio 中使用 Just-In-Time 偵錯工具進行偵錯。
在 .NET 中,優化如何運作
通常,發行組建組態會建立最佳化的程式碼,而偵錯組建組態則不會。
Optimize MSBuild 屬性會控制編譯程式是否被告知要優化程序代碼。
在 .NET 生態系統中,程式代碼會在雙步驟程式中從來源轉換成 CPU 指令:首先,C# 編譯程式會將您輸入的文字轉換成稱為 MSIL 的中繼二進位格式,並將 MSIL 寫出至 .dll 檔案。 稍後,.NET 運行時間會將此 MSIL 轉換為 CPU 指示。 這兩個步驟都可以優化到某種程度,但 .NET 運行時間所執行的第二個步驟會執行更顯著的優化。
[抑制模組載入時的 JIT 優化(僅限於受控程式碼)] 選項
偵錯工具會公開一個選項,以控制在目標進程內載入已啟用優化的 DLL 時所發生的情況。 如果此選項未核取 (預設狀態),則當 .NET 運行時間將 MSIL 程式代碼編譯為 CPU 程式代碼時,它會讓優化保持啟用狀態。 如果已核取此選項,調試程式會要求停用優化。
您可以在 [工具>] 窗格的 [所有設定>>區段中設定 [在模組載入時隱藏 JIT 最佳化 (僅限受管理)] 選項:
您可以在「工具>」對話方塊的「一般>」區段中配置「在模組載入時隱藏 JIT 最佳化 (僅限受管理)」選項:
何時應該檢查 [隱藏 JIT 優化] 選項?
當您從其他來源 (例如 NuGet 套件) 下載 DLL 時,核取此選項,而且您想要偵錯此 DLL 中的程式碼。 若要讓抑制運作,您也必須找到此 DLL 的(.pdb)符號檔案。
如果您只對偵錯在本機建置的程式碼感興趣,最好不要勾選此選項,因為在某些情況下,啟用此選項會顯著減慢偵錯速度。 放緩的原因有兩個:
- 優化程式代碼的執行速度較快。 如果您關閉大量程式碼的最佳化,效能影響可能會增加。
- 如果您已啟用 [只我的程式碼],偵錯工具甚至不會嘗試載入已優化 DLL 的符號。 尋找符號可能需要很長的時間。
[隱藏 JIT 優化] 選項的限制
在兩種情況下,啟用此選項 不起作用 :
- 如果您將偵錯工具附加至已執行的進程,則此選項不會影響在附加偵錯工具時已載入的模組。
此選項不會影響已預編譯(或 ngen'ed)至本機程式碼的 DLL。 但是,您可以透過啟動環境變數 「COMPlus_ReadyToRun」 設定為 「0」的進程來停用預編譯程式碼的使用。 此方法會告知 .NET Core 執行階段停用預先編譯的映像,這會強制執行階段對架構程式碼進行 JIT 編譯。
如果您以 .NET Framework 為目標,請新增環境變數 'COMPlus_ZapDisable' 並將其設定為 '1'。
在檔案 "COMPlus_ReadyToRun": "0" 上的每個設定檔中新增 來進行設定。
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:59694/",
"sslPort": 44320
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"COMPlus_ReadyToRun": "0"
}
},
"HttpLoggingSample": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"COMPlus_ReadyToRun": "0"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}