共用方式為


支援的程式碼變更 (C++)

C++ 專案的 [編輯並繼續] 會處理大部分類型的程式碼變更。 不過,某些變更無法在程式執行期間套用。 若要套用這些變更,您必須停止執行並建置程式碼的新版本。

如需在 Visual Studio 中使用 C++ 的編輯和繼續的相關資訊,請參閱編輯並繼續 (C++)。

需求

建置設定 (專案 > 屬性)

  • C/C++ > 一般 > 調試資訊格式:用於編輯和繼續的程式資料庫 (/ZI

  • 連結器 > 一般 > 啟用增量連結:是 (/INCREMENTAL

    任何不相容的連結器設定 (例如 /SAFESEH、 或 /OPT:...) 都可能導致建置期間 LNK4075 警告。 範例:LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:ICF' specification

偵錯工具設定 (偵錯 > 選項)

開啟 除錯 (或 工具) 選項 窗格,然後展開 所有設定除錯.NET/C++ 熱重新載入 區段。

開啟 偵錯(或工具)>對話方塊,然後展開 偵錯.NET/C++ 熱重載>。

選取下列一或所有選項以啟用此功能:

  • 啟用熱重新載入:在連接偵錯工具 (F5) 的情況下啟動時啟用熱重新載入。

  • 啟動時若未連接偵錯工具,啟用熱重新載入Ctrl + )。

  • 檔案儲存時啟用熱重新載入:儲存檔案時啟用熱重新載入。

  • 記錄冗長度:設定啟用熱重新載入時的記錄層級。 從 [最小 ] (預設)、[ 詳細] 或 [ 診斷] 中進行選擇。

變更這些設定會影響您處理的所有專案。 變更設定後,您不需要重建應用程式。 如果您從命令列或 makefile 建置應用程式,但您在 Visual Studio 環境中進行偵錯,如果您設定選項 /ZI ,您仍然可以使用 [編輯並繼續]。

不支援的變動

下列 C/C++ 變更無法在偵錯工作階段期間套用。 如果您進行任何這些變更,然後嘗試套用程式碼變更,則 「輸出」 視窗中會出現錯誤或警告訊息。

  • 全域或靜態資料的多數變更。

  • 對從另一部電腦複製且未在本機建置的可執行檔的變更。

  • 影響物件配置的資料類型變更,例如類別的資料成員。

  • 添加超過 64k 位元組的新代碼或數據。

  • 在指令指標之前的某個點新增需要建構函式的變數。

  • 影響需要執行階段初始化之程式碼的變更。

  • 在某些情況下,新增例外狀況處理常式。

  • 資源檔案的變更。

  • 唯讀檔案中程式碼的變更。

  • 在沒有對應 PDB 檔案的情況下變更程式碼。

  • 對沒有物件檔案的程式碼進行變更。

  • 在下列情境中修改 lambda:

    • 當 lambda 具有靜態或全域成員時。
    • 當您將 lambda 表達式傳遞給 std::function。 此方法會導致真正的 ODR 違規並導致 C1092。
  • [編輯並繼續] 不會更新靜態程式庫。 如果您在靜態程式庫中進行變更,則會繼續使用舊版本執行,且不會發出警告。

不支援的場景

在下列偵錯案例中,無法使用 C/C++ 的編輯並繼續:

  • 偵錯使用 /Zo 編譯的原生應用程式 (增強最佳化偵錯)

  • 使用 MSVC v120 工具集和 C/C++ /bigobj 選項的專案。 使用 /bigobj 的 Edit and Continue 僅在 MSVC v140 和更新版本的編譯工具中支援。

  • 混合模式 (原生/受控) 偵錯。

  • JavaScript 偵錯。

  • SQL 偵錯。

  • 除錯傾印檔案。

  • 在未處理的例外狀況之後編輯程式碼,當未選取 [在 未處理的例外狀況上回復呼叫堆疊 ] 選項時。

  • 使用 [附加至] 來偵錯應用程式,而不是在 [偵錯] 功能表上選擇 [開始] 來執行應用程式。

  • 偵錯最佳化程式碼。

  • 在新版本因建置錯誤而無法建置之後,偵錯舊版程式碼。

  • 使用自訂編譯器 (cl.exe) 路徑。 基於安全性理由,若要在 [編輯並繼續] 期間重新編譯檔案,Visual Studio 一律會使用已安裝的編譯器。 如果您使用自訂編譯器路徑 (例如,透過檔案中的$(ExecutablePath)自訂*.props變數) ,則會顯示警告,且 Visual Studio 會回復為使用相同版本/架構的已安裝編譯器。

  • 舊版架構/MSVC 工具集。 使用 MSVC v140 工具組時,預設偵錯工具支援 X86 和 X64 應用程式的 [編輯和繼續]。 舊版工具集僅支援 X86 應用程式。 早於 MSVC v120 的工具集應該使用舊版偵錯工具,方法是核取 [偵錯 > 選項 > 一般 > 使用原生相容模式],才能使用 [編輯並繼續]。

IDL 屬性限制

編輯並繼續不會重新產生介面定義語言 (IDL) 檔案。 因此,當您偵錯時,IDL 屬性的變更不會顯示。 若要查看 IDL 屬性變更的結果,您必須停止偵錯並重建應用程式。 如果 IDL 屬性已變更,則 [編輯並繼續] 不會產生錯誤或警告。 如需詳細資訊,請參閱 IDL 屬性

診斷問題

如果您的案例不符合上述任何條件,您可以設定下列 DWORD 登錄值來收集進一步的詳細數據:

  1. 開啟開發人員命令提示字元。

  2. 執行以下命令:

    VsRegEdit.exe set “C:\Program Files\Microsoft Visual Studio\[Version]\[YOUR EDITION]” HKCU Debugger NativeEncDiagnosticLoggingLevel DWORD 1

在偵錯工作階段開始時設定此值,會導致 Edit and Continue 的各個元件大量輸出詳細的記錄至 輸出視窗>偵錯窗格