共用方式為


支援的程式碼變更 (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 ,您仍然可以使用 [編輯並繼續]。

[偵錯 (或工具) >選項] 對話方塊中,展開 [偵錯一般>] 區段,然後選取 [啟用原生編輯並繼續] 核取方塊。

任何不相容的編譯器或連結器設定都會在 [編輯並繼續] 期間造成錯誤。
範例:Edit and Continue : error : ‘file.cpp’ in ‘MyApp.exe’ was not compiled with Edit and Continue enabled. Ensure that the file is compiled with the Program Database for Edit and Continue (/ZI) option.

不支援的變動

下列 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 的工具集應該使用舊版偵錯工具,方法是核取 [偵錯 > 選項 > 一般 > 使用原生相容模式],才能使用 [編輯並繼續]。

連結限制

會停用 [編輯並繼續] 功能的連結器選項

下列連結器選項會停用「編輯及繼續」功能:

  • 設定 /OPT:REF/OPT:ICF/INCREMENTAL:NO 會停用 [編輯並繼續] ,並顯示下列警告:
    LINK : warning LNK4075: ignoring /EDITANDCONTINUE due to /OPT specification

  • 設定 /ORDER、/RELEASE/FORCE 會停用 [編輯並繼續],並顯示下列警告:
    LINK : warning LNK4075: ignoring /INCREMENTAL due to /option specification

  • 設定任何防止建立程式資料庫 (.pdb) 檔案的選項會停用 [編輯並繼續],而不會發出特定警告。

自動重新連結限制

根據預設,「編輯並繼續」會在偵錯會話結束時重新連結您的程式,以建立最新執行檔。

如果您從非原始組建位置偵錯程式,則 [編輯並繼續] 無法重新連結程式。 一則訊息告訴您需要手動重建。

編輯並繼續不會重建靜態程式庫。 如果您使用「編輯並繼續」對靜態資料庫進行變更,則需要手動重建資料庫並使用它重新連結應用程式。

編輯並繼續不會叫用自訂建置步驟。 如果您的程式使用自訂建置步驟,您可能想要手動重建,以便可以叫用自訂建置步驟。 在此情況下,您可以在「編輯並繼續」之後停用重新連結,以確保系統提示您手動重建。

若要在「編輯並繼續」之後停用重新連結

  1. Debug (偵錯) 功能表上,選擇 Options and Settings (選項和設定)。

  2. [選項] 對話方塊的 [偵錯] 節點下,選取 [編輯並繼續] 節點。

  3. 取消勾選 偵錯後重新連結程式碼變更核取方塊。

預先編譯的標頭限制

根據預設,「編輯並繼續」會在背景載入並處理預先編譯的標頭,以加快程式碼變更的處理速度。 載入預先編譯的標頭需要分配實體內存,如果您在 RAM 有限的機器上進行編譯,這可能會成為問題。 您可以使用 Windows 工作管理員來判斷偵錯時可用的實體記憶體數量,以判斷這是否可能是問題。 如果此數量大於預先編譯標頭的大小,則 [編輯並繼續] 應該沒有問題。 如果數量小於預先編譯標頭的大小,您可以防止 [編輯並繼續] 在背景載入預先編譯標頭。

若要停用 Edit and Continue 的預編譯標頭背景載入

  1. Debug (偵錯) 功能表上,選擇 Options and Settings (選項和設定)。

  2. [選項] 對話方塊的 [偵錯] 節點下,選取 [編輯並繼續] 節點。

  3. 清除 [允許預先編譯 ] 核取方塊。

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

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

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