支援的程式碼變更 (C++)
C++ 專案的 [編輯後繼續] 可處理大多數的程式碼變更類型。 不過,有些變更無法在程式執行期間套用。 若要套用這些變更,您必須停止執行,並建置新版的程式碼。
如需在 Visual Studio 中使用 C++ 專案的 [編輯後繼續] 的相關資訊,請參閱 [編輯後繼續 (C++)]。
需求
建置設定 (專案 > 屬性):
C/C++ > 一般 > 偵錯資訊格式: 適用於 [編輯和繼續] 的程式資料庫 (
/ZI
)連結器 > 一般 > 啟用累加連結: 是 (
/INCREMENTAL
)任何不相容的連結器設定 (例如
/SAFESEH
,或/OPT:
...) 都應該在建置期間造成警告 LNK4075。
範例:LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:ICF' specification
偵錯工具設定 (偵錯 > 選項 > 一般):
啟用 [原生編輯後繼續]
任何不相容的編譯器或連結器設定會在 [編輯後繼續] 期間造成錯誤。
範例: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:
- 具有靜態或全域成員。
- 會傳遞至 std::function。 這會導致真正的 ODR 違規,並導致 C1092。
- [編輯後繼續] 不會更新靜態程式庫。 如果您變更靜態程式庫,執行仍會使用舊版繼續進行,而且不會發出任何警告。
不支援的情節
C/C++ 的 [編輯後繼續] 無法用於下列偵錯案例中:
偵錯以 /Zo (增強最佳化偵錯)編譯的原生應用程式
使用 VC 120 工具組和 C/C++
/bigobj
參數的專案。 只有在 VC 140 工具組中才支援使用/bigobj
進行 [編輯後繼續]。混合模式 (原生/Managed) 偵錯。
Javascript 偵錯。
SQL 偵錯
對傾印檔偵錯。
在未選取 [ 發生未處理的例外狀況時回溯呼叫堆疊 ] 選項的情況下,於發生未處理的例外狀況後編輯程式碼。
使用 [附加至] 來進行應用程式偵錯,而不要選擇 [偵錯] 功能表上的 [啟動] 來執行應用程式。
偵錯最佳化程式碼
由於建置錯誤以致新版本建置失敗之後,對舊版程式碼進行偵錯。
使用自訂編譯器 (cl.exe) 路徑。 基於安全性考量,為了在 [編輯後繼續] 期間重新編譯檔案,Visual Studio 一律會使用已安裝的編譯器。 如果您使用自訂編譯器路徑 (例如,透過
*.props
檔案中的自訂$(ExecutablePath)
變數),則會顯示警告,Visual Studio 會回復為使用相同版本/架構的已安裝編譯器。舊版架構/VC 工具組。 使用 VC 140 工具組,預設偵錯工具支援使用 X86 和 X64 應用程式進行 [編輯後繼續]。 舊版工具組僅支援 X86 應用程式。 VC 120 之前的工具組應該藉由檢查 [偵錯 > 選項 > 一般 > 使用原生相容性模式] 以使用 [編輯後繼續] 來使用舊版偵錯工具。
連結的限制
停用 [編輯後繼續] 的連結器選項
下列連結器選項停用 [編輯後繼續]:
設定 /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) 檔的選項,即可停用 [編輯後繼續] 並且不顯示任何特定警告。
自動重新連結的限制
根據預設,[編輯後繼續] 會在偵錯工作階段結束後重新連結程式,建立最新的執行檔。
如果您不是在原來的組建位置上偵錯,[編輯後繼續] 無法重新連結您的程式。 會有一則訊息告訴您必須手動重建。
[編輯後繼續] 不重建靜態程式庫。 如果您使用 [編輯後繼續] 來變更靜態程式庫,則必須手動重建程式庫,再用它重新連結應用程式。
[編輯後繼續] 不會叫用自訂組建步驟。 如果您的程式使用自訂的建置步驟,您應當以手動方式重建,讓自訂的建置步驟能夠被叫用。 在那情況下,您可以在 [編輯後繼續] 之後停用重新連結,確保您會被提示以手動重建。
若要在編輯後繼續後停用重新連結
在 [ 偵錯 ] 功能表上選擇 [ 選項和設定]。
在 [選項] 對話方塊的 [偵錯] 節點下,選取 [編輯後繼續] 節點。
清除 [ 偵錯後重新連結程式碼變更 ] 核取方塊。
先行編譯標頭檔的限制
根據預設,[編輯後繼續] 會在背景載入並處理預先編譯的標頭,以加速程式碼變更的處理。 載入預先編譯的標頭檔須配置實體記憶體,如果您是在一部 RAM 不足的電腦上進行編譯,這可能會是個問題。 您可以在偵錯時,使用 [Windows 工作管理員] 判斷可用的實體記憶體數量,來判斷這樣是否會發生問題。 如果此一數量大於預先編譯的標頭檔的大小,[編輯後繼續] 應該不會有問題。 如果數量小於您先行編譯的標頭大小,您可以防止 [編輯後繼續] 在背景中載入先行編譯的標頭。
若要停用編輯後繼續的先行編譯標頭的背景載入
在 [ 偵錯 ] 功能表上選擇 [ 選項和設定]。
在 [選項] 對話方塊的 [偵錯] 節點下,選取 [編輯後繼續] 節點。
清除 [ 允許先行編譯 ] 核取方塊。
IDL 屬性的限制
[編輯後繼續] 不會重新產生介面定義語言 (IDL) 檔案。 所以您偵錯時並不會反映出 IDL 屬性的變更。 若要看到 IDL 屬性的變更結果,就必須停止偵錯並重建應用程式。 如果 IDL 屬性有所變更,[編輯後繼續] 並不會產生錯誤或警告。 如需詳細資訊,請參閱 IDL 屬性。
診斷問題
如果您的案例不符合上述提及的任何條件,您可以藉由設定下列 DWORD 登錄值來收集進一步的詳細資料:
- 開啟開發人員命令提示字元。
- 執行以下命令:
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
在偵錯工作階段開始時設定此值會導致 [編輯後繼續] 的各種元件將詳細資訊記錄滲出至 [輸出視窗]>[偵錯] 窗格。