共用方式為


JIT 優化和除錯

如果您嘗試偵錯程式碼,當該程式碼 最佳化時,會更容易。 優化程式碼時,編譯器和執行階段會變更發出的 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 最佳化 (僅限受管理)」選項:

抑制 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"
    }
  }
}