“編輯並繼續”是一種省時的功能,使您能夠在程序處於中斷模式時更改源代碼。 當您通過選擇一條類似 Continue 或 Step 的執行命令繼續執行程序時,“編輯並繼續”有限制地自動應用代碼更改。 這允許您在調試會話期間更改代碼,而不是停止程序,重新編譯整個程序,再重新啟動調試會話。
顯式應用代碼更改
在 Visual C++ 中,“編輯並繼續”可以以兩種方法應用代碼更改。 代碼更改可在選擇執行命令時隱式應用,也可使用“應用代碼更改”命令顯式應用。當顯式應用代碼更改時,程序保持在中斷模式下,不會執行。
在“調試”菜單中選擇“應用代碼更改”。安裝 Visual Studio 時,“編輯並繼續”在默認情況下是打開的。
啟用和禁用“編輯並繼續”
可以在“選項”對話框中禁用或啟用“編輯並繼續”。 無法在調試過程中更改此設置。“編輯並繼續”僅在調試版本中起作用。 對於本機 C++,“編輯並繼續”需要使用 /INCREMENTAL 選項,Visual C++ 環境中調試,如果設置了 /ZI 選項,仍可以使用“編輯並繼續”。
啟用/禁用“編輯並繼續”
-
在“工具”菜單上,單擊“選項”。
-
在“選項”對話框中打開“調試”節點,然后選擇“編輯並繼續”類別。
-
若要啟用,請選擇“啟用‘編輯並繼續’”復選框。 若要禁用,則清除該復選框。
提示
如果啟用了 IntelliTrace 並且收集 IntelliTrace 事件和調用信息,則禁用編輯和繼續。
-
單擊“確定”。
停止代碼更改
當“編輯並繼續”處於應用代碼更改的過程中時,您可以停止該操作。在托管代碼中停止代碼更改可能產生意外結果。 將更改應用到托管代碼通常是一個很迅速的過程,因此極少需要在托管代碼中停止代碼更改。
停止應用代碼更改
- 從“調試”菜單中選擇“停止應用代碼更改”。
該菜單項僅在應用代碼更改時才可見。如果選擇了改選項,就不會進行任何代碼更改。
執行點
“編輯並繼續”應用更改時,一些代碼的更改會使執行點移動到新的位置。 “編輯並繼續”盡可能正確地放置執行點,但是並非所有情況下的結果都正確。在 Visual C++ 中,當執行點更改時,會有一個對話框通知您。 在繼續調試之前,應驗證位置是否正確。 如果不正確,請使用“設置下一語句”命令。
Visual C++的編輯並繼續
受支持的代碼更改
“編輯並繼續”處理大多數類型的代碼更改。 但是,在程序執行期間,某些更改無法應用。 若要應用這些更改,必須停止執行並生成新版本的代碼。
在調試會話期間不能應用下列 C/C++ 更改:
-
大多數的全局或靜態數據的更改。
-
從其他計算機復制並且未在本地生成的可執行文件的更改。
-
影響一個對象(如類的數據成員)布局的數據類型的更改。
-
添加超過 64k 字節的新代碼或數據。
-
添加要求在指令指針前存在構造函數的變量。
-
影響需要運行時初始化的代碼的更改。
-
在某些實例中,添加異常處理程序。
-
資源文件的更改。
-
只讀文件中的代碼更改。
-
沒有相應 PDB 文件的代碼的更改。
-
沒有對象文件的代碼的更改。
如果進行了上面某項更改,然后嘗試應用代碼更改,“輸出”窗口中就會出現錯誤或警告信息。
- “編輯並繼續”不更新靜態庫。 如果您更改了靜態庫,仍會繼續執行老版本,且不顯示任何警告。
不支持的方案
在以下調試方案中,“編輯並繼續”不可用:
-
在 Windows 98 上調試。
-
混合模式(本機/托管)調試。
-
SQL 調試。
-
調試 Dr. Watson 轉儲。
-
在未選擇“在未經處理的異常上展開調用堆棧”選項的情況下,在發生未經處理的異常之后編輯代碼。
-
使用“附加到”來調試應用程序,而不是單擊“調試”菜單上的“開始”來運行應用程序。
-
調試優化后的代碼。
-
當目標為 64 位應用程序時,調試托管代碼。 如果希望使用“編輯並繼續”,必須將目標平台設置為 x86 (“項目屬性”對話框->“編譯”選項卡->“高級編譯器”設置。)
-
如果由於生成錯誤無法生成新版本的代碼,則對舊版本的代碼進行調試。
使用陳舊代碼
在某些情況下,“編輯並繼續”無法將代碼更改立即應用於可執行文件,但如果您繼續調試,則可能會在稍后應用代碼更改。 當編輯某個調用當前函數的函數,或將多於 64 個字節的新變量添加到調用堆棧上的函數時,就會發生這種情況。
在這種情況下,調試器會繼續執行原始代碼(稱為“陳舊代碼”),直至可以應用更改。 陳舊的代碼在單獨的源窗口中作為臨時源文件窗口顯示,並帶有一個類似 enc25.tmp 的標題。 編輯過的源繼續在原始源窗口中顯示。 當您嘗試編輯陳舊的代碼時,會顯示一條警告信息。
啟用/禁用陳舊代碼警告
-
在“工具”菜單上,單擊“選項”。
-
在“選項”對話框中選擇“調試”文件夾。
-
在“編輯並繼續”組中,選擇或清除“就陳舊的代碼發出警告”復選框。
-
單擊“確定”。
鏈接限制
“編輯並繼續”有兩種類型的鏈接器限制:
-
默認情況下,“編輯並繼續”在調試會話結束時重新鏈接到程序,以創建最新的可執行文件。 自動重新鏈接方面有一些限制。
-
有些鏈接器選項禁用“編輯並繼續”。
下列鏈接器選項可禁用“編輯並繼續”:
-
設置 /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 NT 或 Windows 2000 下,可以使用 Windows NT 任務管理器確定調試時可用的物理內存量,從而確定這是否會成為問題。 如果此數量大於預編譯頭的大小,則“編輯並繼續”應沒有問題。 如果此數量小於預編譯頭的大小,可以禁止“編輯並繼續”在后台加載預編譯頭。
對“編輯並繼續”禁用預編譯頭的后台加載
-
在“工具”菜單上,單擊“選項”。
-
在“選項”對話框中選擇“調試”節點,然后選擇“編輯並繼續”組。
-
清除“允許預編譯”復選框。
-
單擊“確定”。
特性限制
“編輯並繼續”不重新生成接口定義 (IDL) 文件。 因此,調試時不反映對 IDL 特性的更改。 若要查看對 IDL 特性更改的結果,必須停止調試並重新生成應用程序。 如果 IDL 特性已更改,“編輯並繼續”不生成錯誤或警告。
Visual C#的編輯並繼續
使用 C# 的“編輯並繼續”,可以一邊進行調試一邊在中斷模式下更改代碼。 不必停止並重新啟動調試會話即可應用更改。 在運行模式下,源編輯器是只讀的。“編輯並繼續”支持在調試會話期間可能做出的大多數更改,但有某些例外。如果啟用了“編輯並繼續”,在使用調試器執行命令(如“繼續”、“單步執行”、“設置下一語句”,或在調試器窗口中執行函數求值)時,會自動應用受支持的更改。
使用“編輯並繼續”(C#)
使用 C# 的“編輯並繼續”,可以一邊進行調試一邊在中斷模式下更改代碼。 不必停止並重新啟動調試會話即可應用更改。在中斷模式下進行更改時,將自動調用“編輯並繼續”,然后選擇調試器執行命令(如“繼續”、“單步執行”或“設置下一語句”),或在調試器窗口中計算函數。在調試 64 位代碼、Compact Framework、優化代碼、本機/托管混合代碼或 SQL Server 公共語言運行時 (CLR) 集成代碼時不支持“編輯並繼續”。 如果嘗試在以上任何一種情況下應用代碼更改,則調試器將顯示一個對話框,其中說明不支持“編輯並繼續”。
-
在中斷模式下,對源代碼進行修改。
-
在“調試”菜單中,單擊“繼續”、“單步執行”或“設置下一語句”,或在調試器窗口中計算函數。
這會編譯新代碼並繼續調試新的代碼。 有些更改不受“編輯並繼續”支持。
啟用/禁用“編輯並繼續”跟VC++一樣。
受支持的代碼更改
“編輯並繼續”處理方法體內的大多數類型的代碼更改。 但是,方法體外的大多數更改以及方法體內的小部分更改在調試期間不能應用。 若要應用不受支持的更改,必須停止調試,重新開始修改后的代碼。
在調試會話期間不能對 C# 代碼應用下列更改:
-
對當前語句或任何其他活動語句的更改。
活動語句包括調用堆棧中的函數中為轉至當前語句而調用過的任何語句。
當前語句在源窗口中以黃色背景標記。 其他活動語句以陰影背景標記,並且是只讀的。 這些默認顏色可在“選項”對話框中更改。
-
對全局符號的更改,包括:
-
添加新類型。
-
在類型中添加方法。
-
更改類型的簽名。
-
在類型中添加字段、事件或屬性。
-
-
編輯匿名方法或任何包含匿名方法的方法。 這些方法以陰影背景標記。
-
添加新的匿名方法。
-
添加、移除或更改特性。
-
添加、移除或更改 using 指令。
-
移除或更改局部變量。 允許添加局部變量。
-
在活動語句前后添加 foreach、using 或 lock。
-
修改包含 yield return 或 yield break 語句的方法。
-
更改具有由匿名方法初始化的字段的構造函數。
不安全代碼
對不安全代碼的更改與對安全代碼的更改有相同的限制,但它還包含一條附加的限制:
- “編輯並繼續”不支持更改存在於包含 stackalloc 運算符的方法內的不安全代碼。 這僅僅適用於活動方法。 當進行調試時,當前處於調用堆棧上的任何函數都是活動函數。
異常
“編輯並繼續”支持對 catch、finally和 try 塊的更改,但活動方法(比如當前處於調用堆棧中的方法)中的塊除外。
-
如果活動函數是調用堆棧中最近使用的函數,則在該函數中“編輯並繼續”不支持:
-
在活動語句的前后添加 catch 或 finally塊。
-
添加嵌套級別大於六的嵌套異常處理程序。
-
-
如果活動函數不是調用堆棧中最近使用的函數,則在該函數中“編輯並繼續”不支持:
-
在活動語句的前后添加 catch、finally 或 try塊。
-
添加嵌套級別大於六的嵌套異常處理程序。
-
更改包含活動語句的 try塊內的代碼。
-
不支持的方案
在以下調試方案中,“編輯並繼續”不可用:
-
調試 LINQ 代碼。
-
混合模式(本機/托管)調試。
-
SQL 調試。
-
調試 Dr. Watson 轉儲。
-
在未選擇“在未經處理的異常上展開調用堆棧”選項的情況下,在發生未經處理的異常之后編輯代碼。
-
調試嵌入式運行時應用程序。
-
使用“附加到”來調試應用程序,而不是通過選擇“調試”菜單上的“啟動”來運行應用程序。
-
調試優化后的代碼。
-
當目標為 64 位應用程序時,調試托管代碼。 如果希望使用“編輯並繼續”,必須將目標平台設置為 x86 (“項目 屬性”對話框 ->“編譯”選項卡 ->“高級編譯器”設置。)
-
如果由於生成錯誤無法生成新版本的代碼,則對舊版本的代碼進行調試。