C++ 專案的 [編輯並繼續] 會處理大部分類型的程式碼變更。 不過,某些變更無法在程式執行期間套用。 若要套用這些變更,您必須停止執行並建置程式碼的新版本。
如需在 Visual Studio 中使用 C++ 的編輯和繼續的相關資訊,請參閱編輯並繼續 (C++)。
需求
建置設定 (專案 > 屬性)
C/C++ > 一般 > 調試資訊格式:用於編輯和繼續的程式資料庫 (
/ZI)連結器 > 一般 > 啟用增量連結:是 (
/INCREMENTAL)任何不相容的連結器設定 (例如
/SAFESEH、 或/OPT:...) 都可能導致建置期間 LNK4075 警告。 範例:LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:ICF' specification
偵錯工具設定 (偵錯 > 選項)
開啟
開啟 偵錯(或工具)>對話方塊,然後展開 偵錯>.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) 檔案的選項會停用 [編輯並繼續],而不會發出特定警告。
自動重新連結限制
根據預設,「編輯並繼續」會在偵錯會話結束時重新連結您的程式,以建立最新執行檔。
如果您從非原始組建位置偵錯程式,則 [編輯並繼續] 無法重新連結程式。 一則訊息告訴您需要手動重建。
編輯並繼續不會重建靜態程式庫。 如果您使用「編輯並繼續」對靜態資料庫進行變更,則需要手動重建資料庫並使用它重新連結應用程式。
編輯並繼續不會叫用自訂建置步驟。 如果您的程式使用自訂建置步驟,您可能想要手動重建,以便可以叫用自訂建置步驟。 在此情況下,您可以在「編輯並繼續」之後停用重新連結,以確保系統提示您手動重建。
若要在「編輯並繼續」之後停用重新連結:
在 Debug (偵錯) 功能表上,選擇 Options and Settings (選項和設定)。
在 [選項] 對話方塊的 [偵錯] 節點下,選取 [編輯並繼續] 節點。
取消勾選 偵錯後重新連結程式碼變更核取方塊。
預先編譯的標頭限制
根據預設,「編輯並繼續」會在背景載入並處理預先編譯的標頭,以加快程式碼變更的處理速度。 載入預先編譯的標頭需要分配實體內存,如果您在 RAM 有限的機器上進行編譯,這可能會成為問題。 您可以使用 Windows 工作管理員來判斷偵錯時可用的實體記憶體數量,以判斷這是否可能是問題。 如果此數量大於預先編譯標頭的大小,則 [編輯並繼續] 應該沒有問題。 如果數量小於預先編譯標頭的大小,您可以防止 [編輯並繼續] 在背景載入預先編譯標頭。
若要停用 Edit and Continue 的預編譯標頭背景載入:
在 Debug (偵錯) 功能表上,選擇 Options and Settings (選項和設定)。
在 [選項] 對話方塊的 [偵錯] 節點下,選取 [編輯並繼續] 節點。
清除 [允許預先編譯 ] 核取方塊。
IDL 屬性限制
編輯並繼續不會重新產生介面定義語言 (IDL) 檔案。 因此,當您偵錯時,IDL 屬性的變更不會顯示。 若要查看 IDL 屬性變更的結果,您必須停止偵錯並重建應用程式。 如果 IDL 屬性已變更,則 [編輯並繼續] 不會產生錯誤或警告。 如需詳細資訊,請參閱 IDL 屬性。
診斷問題
如果您的案例不符合上述任何條件,您可以設定下列 DWORD 登錄值來收集進一步的詳細數據:
開啟開發人員命令提示字元。
執行以下命令:
VsRegEdit.exe set “C:\Program Files\Microsoft Visual Studio\[Version]\[YOUR EDITION]” HKCU Debugger NativeEncDiagnosticLoggingLevel DWORD 1VsRegEdit.exe set “C:\Program Files (x86)\Microsoft Visual Studio\[Version]\[YOUR EDITION]” HKCU Debugger NativeEncDiagnosticLoggingLevel DWORD 1
在偵錯工作階段開始時設定此值,會導致 Edit and Continue 的各個元件大量輸出詳細的記錄至 輸出視窗>偵錯窗格。