Visual Studio 2008中的調(diào)試器是這個IDE中最龐大、最復雜的工具。這樣強大的一個工具,我們不可能逐一介紹所有場景。然而,我們希望能夠在這一節(jié)里展示最常用的特性。接下來,繼續(xù)將客戶資料這個場景作為我們的例子。
10.2.1 調(diào)試菜單和工具欄
Debug(調(diào)試)菜單和相關工具欄向你提供了第一層訪問啟動調(diào)試會話、逐語句調(diào)試代碼、管理斷點和訪問許多Visual Studio調(diào)試特性的功能。調(diào)試窗口有兩種狀態(tài):待機(不活動)和調(diào)試模式。在待機模式狀態(tài)下,Debug菜單允許你啟動一個調(diào)試會話、附加代碼到一個正在運行的進程,或者訪問一些調(diào)試窗口。圖10-12展示了待機狀態(tài)下的該菜單。
圖10-12 待機狀態(tài)的Debug菜單
在待機狀態(tài)下,Debug菜單提供了多個特性來啟動調(diào)試會話,它將代碼附加到正在運行的進程,或者訪問一些調(diào)試窗口。表10-1列出了待機狀態(tài)下的Debug菜單中所有可用的特性。
表10-1 待機狀態(tài)下的Debug菜單項
<DIV align=center>菜 單 項
描 述
Windows→Breakpoints(窗口→斷點)
在IDE中打開Breakpoints窗口。這個窗口能夠訪問該解決方案中的所有斷點
Windows→Output(窗口→輸出)
在IDE中顯示Output窗口。Output窗口是IDE、編譯器、調(diào)試器輸出的許多運行時的消息日志的窗口。因此,信息不僅僅是調(diào)試會話
Windows→Immediate(窗口→即時)
在IDE中打開Immediate窗口。這個窗口允許你執(zhí)行命令。比如,在設計的時候,你可以通過Immediate窗口直接調(diào)用方法。這會啟動應用程序,直接進入調(diào)試會話
Start Debugging(啟動調(diào)試)
在調(diào)試模式下啟動你的應用程序
</DIV>(續(xù))
<DIV align=center>菜 單 項
描 述
Start Without Debugging(不通過調(diào)試來啟動)
啟動應用程序。但它不把調(diào)試器連接到這個進程。在這種模式下,這接近(最終)用戶運行程序的時候所看到的情形(而不是因為錯誤和斷點進入IDE)
Attach to Process(附加到進程)
允許你將調(diào)試器(和你的代碼)附加到一個正在運行的進程(可執(zhí)行的程序)。舉個例子,假如你沒有經(jīng)過調(diào)試啟動了應用程序,那么你要附加到運行進程并開始調(diào)試
Exceptions(異常)
打開Exceptions選項對話框。這個對話框允許你選擇調(diào)試器如何中斷給定的異常
Step Into(逐語句)
將程序從設計模式啟動為調(diào)試模式。對于許多項目來說,點擊Step Into命令會在程序的第一行可執(zhí)行代碼上調(diào)用調(diào)試器。這樣,你可以從第一行逐語句進入程序。
Step Over(逐過程)
不在調(diào)試會話中的時候,逐過程命令僅開啟應用程序,與點擊“運行”按鈕的方式相同
Toggle Breakpoint(切換斷點)
在文本編輯器中,為當前活動代碼行打開或關閉斷點。如果你在IDE中沒有活動的代碼窗口,則該選項是非活動的
New Breakpoint→Break at Function(新建斷點→在函數(shù)處中斷)
指定函數(shù)名來為其定義來創(chuàng)建新斷點。這可能是有用的,如果你知道函數(shù)名但不想在代碼文件中搜索它
New Breakpoint→New Data Breakpoint(新建斷點→新建數(shù)據(jù)斷點)
這個選項僅對本地的C++應用程序有效。它允許你來定義一個斷點,在特定內(nèi)存位置的值改變時,中斷進入到IDE中
Delete All Breakpoints(刪除所有斷點)
從解決方案中刪除所有斷點
Disable All Breakpoints(禁用所有斷點)
在解決方案中,禁用(而不是移除)所有斷點
</DIV>當調(diào)試器正在使用并且正在進行一個調(diào)試會話時,Debug菜單的狀態(tài)就會發(fā)生改變。它現(xiàn)在提供了比待機狀態(tài)更多的選項。這些選項包括單步執(zhí)行代碼、重啟會話以及訪問更多調(diào)試相關的窗口。圖10-13顯示了調(diào)試會話中的Debug菜單。
圖10-13 調(diào)試會話中的Debug菜單
來看看Debug菜單在調(diào)試會話中提供的眾多選項。表10-2展示了在這種狀態(tài)下從調(diào)試菜單可找到的許多項。在瀏覽這個表的時候,可以參考前面的幾張圖來獲得給定項的上下文。
調(diào)試工具欄
Debug(調(diào)試)工具欄提供了快速訪問一些Debug菜單中的關鍵項的功能。使用這個工具欄,你可以管理調(diào)試會話。比如,可以啟動或繼續(xù)一個調(diào)試會話,停止一個執(zhí)行會話,逐語句(調(diào)試)代碼,等等。
圖10-14顯示了活動調(diào)試會話中的Debug工具欄。在設計模式中,Continue按鈕的標題是Start Debugging(啟動調(diào)試),還有很多項都被禁用了。我們給每個工具欄的每個項都做了標注??梢越徊鎱⒖歼@些標注與表10-2來獲取更多信息。
圖10-14 中斷模式中的Debug工具欄
表10-2 活動調(diào)試會話中的Debug菜單項
<DIV align=center>菜 單 項
描 述
Windows→Breakpoints(窗口→斷點)
允許你在調(diào)試會話過程中打開Breakpoints窗口
Windows→Output(窗口→輸出)
在活動的調(diào)試會話中打開Output窗口來讀出編譯器和調(diào)試器發(fā)送的輸出信息
Windows→Watch(窗口→監(jiān)視)
在IDE中打開可能有多個監(jiān)視窗口中的一個。在整個調(diào)試會話中都要仔細盯著Watch窗口中展示的項和表達式
Windows→Autos(窗口→自動窗口)
打開Autos窗口。這個窗口顯示代碼的當前行和上一行的變量(以及它們的值)
Windows→Locals(窗口→局部變量)
在IDE中打開Locals窗口。這個窗口顯示局部作用域(函數(shù))內(nèi)的變量
Windows→Immediate(窗口→即時)
打開Immediate窗口執(zhí)行命令
Windows→Call Stack(窗口→調(diào)用棧)
顯示棧中的函數(shù)列表。也指明了棧的當前幀(函數(shù))。就是這個選中的項定義了Locals、Watch和Auto窗口中的內(nèi)容
Windows→Threads(窗口→線程)
在IDE中顯示Threads窗口,你可以查看并控制你所調(diào)試的應用程序中的線程
Windows→Modules(窗口→模塊)
在IDE中顯示Modules窗口。這個窗口列出了你的應用程序使所用的DLL和EXE
Windows→Processes(窗口→進程)
在IDE中顯示Process窗口。這個窗口列出了調(diào)試會話中所附加的所有進程
Windows→Memory(窗口→內(nèi)存)
打開Memory窗口以查看你的應用程序所使用的內(nèi)存。只有在Options對話框中地址級(address-level)調(diào)試啟用時才有效
Windows→Disassembly(窗口→反匯編)
打開Disassembly窗口。這個窗口顯示與編譯器指令相符合的反匯編代碼。只有在Options對話框中地址級調(diào)試啟用時才有效
</DIV>(續(xù))
<DIV align=center>菜 單 項
描 述
Windows→Registers(窗口→寄存器)
打開Registers窗口,這樣單步執(zhí)行代碼時就可以看到寄存器值的變化。只有在Options對話框中地址級調(diào)試啟用時才有效
Continue
中斷IDE后繼續(xù)執(zhí)行應用程序。應用程序繼續(xù)在活動的代碼行(即斷點,指拋出錯誤的代碼行,或者是一個使用Set Next Statement的行設置)上運行
Break All(全部中斷)
允許你在調(diào)試會話中手動地中斷應用程序進入到調(diào)試器(無須命中斷點)。應用程序會跳到下一行執(zhí)行。這個功能在訪問諸如監(jiān)視窗口等調(diào)試信息時很有用。還可在你的應用程序可能處于掛起狀態(tài)時用來訪問調(diào)試會話
Stop Debugging(停止調(diào)試)
結束調(diào)試會話。如果這個進程由Visual Studio啟動,也同時結束調(diào)試的進程
Detech All(全部分離)
將調(diào)試器與正在執(zhí)行的進程分離。這允許你的應用程序在調(diào)試器結束后繼續(xù)執(zhí)行
Terminate All(全部終止)
停止調(diào)試并終止所有所附加的進程
Restart(重新啟動)
停止調(diào)試會話并重新啟動。相當于按順序點擊Stop Debugging和Start Debugging
Attach to Process(附加到進程)
允許你將活動的調(diào)試會話附加到一個或多個另外的進程,如,一個正在執(zhí)行的Web服務器,或一個Windows服務
Exceptions(異常)
打開Exceptions選項對話框。這個對話框允許你選擇IDE如何在.NET Framework以及其他庫中中斷給定的異常
Step Into(逐語句)
Step Into命令使調(diào)試器前進一行。如果你選擇Step Into調(diào)試一個函數(shù),調(diào)試器會進入這個函數(shù)一行一行的執(zhí)行
Step Over(逐過程)
功能和Step Into基本相同,但是有一個主要的差別:如果你選擇Step Over調(diào)試一個函數(shù),調(diào)用這個函數(shù)的行(和這個函數(shù))會被執(zhí)行,然后調(diào)試器會將下一行(函數(shù)調(diào)用之后)設置為要調(diào)試的下一行
Step Out(跳出)
告訴調(diào)試器執(zhí)行當前的函數(shù),然后在函數(shù)執(zhí)行完成后回到調(diào)試(中斷)狀態(tài)。在你逐語句進入一個函數(shù)后卻想只執(zhí)行這個函數(shù),然后在它完成后回到調(diào)試模式時,該功能可以派上用場
Quick Watch(快速監(jiān)視)
當調(diào)試器在中斷模式時打開Quick Watch窗口。Quick Watch窗口顯示你所監(jiān)視的一個變量或者表達式及其值
Toggle Breakpoint(切換斷點)
打開或關閉活動的斷點
New Breakpoint(新建斷點)
彈出New Breakpoint對話框(詳見表10-1)
Delete All Breakpoints(刪除所有斷點)
在解決方案中刪除所有斷點
Disable All Breakpoints(禁用所有斷點)
在解決方案中禁用所有斷點,但是不刪除它們。你也可以禁用個別斷點。如果你想保留這些斷點以方便以后使用,但是不希望在此刻命中它時,這個功能非常有用
Enable All Breakpoints(啟用所有斷點)
啟用所有因調(diào)用Disable All Breakpoints而被禁用的斷點
</DIV><DIV style="BORDER-BOTTOM: #999999 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 3pt; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: #999999 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">注解 在圖10-14右部的Breakpoints窗口圖標標記為“Debug windows”,實際上是一個下拉菜單。這個下拉菜單可供開發(fā)人員訪問許多調(diào)試窗口。參見圖10-13關于可從該工具欄項訪問的菜單的示例。
</DIV>10.2.2 調(diào)試選項
可以通過這個Options對話框控制Visual Studio的許多調(diào)試選項??梢酝ㄟ^選項樹中的Debugging節(jié)點訪問這些調(diào)試開關。圖10-15顯示了General調(diào)試設置。
圖10-15 調(diào)試選項對話框
可以通過常規(guī)設置列表打開和關閉許多調(diào)試選項。這些選項如下所示:
q 啟用和禁用斷點篩選器;
q 在刪除所有斷點時是否彈出警告對話框;
q 啟用或者禁用異常助手;
q 啟用或者禁用just-my-code調(diào)試;
q 要求源文件與原始版本完全匹配(或者不);
q 其他選項。
這些選項背后的特性都將在本章講到。
通過該選項對話框可以訪問更多的調(diào)試設置。舉個例子,你可以控制Edit and Continue如何工作(還可以關閉這個特性)。這里還可以設置在哪種類型代碼(Managed、Native、Script)上啟用實時調(diào)試。還可以選擇是否使用額外的調(diào)試符號文件(.pdb和.dbg)。當需要調(diào)試一個特殊的庫時,如果沒有它的源代碼,這些文件就能夠為你提供一些幫助,比如Windows的源代碼或者第三方組件。
這里有很多選項幫助你自定義調(diào)試體驗。不過,在本章中我們會使用默認設置來調(diào)試。
10.2.3 逐語句、跳出和逐過程代碼調(diào)試
也許對開發(fā)人員來說,最通常的調(diào)試操作是一行行地調(diào)試代碼,并檢查程序和調(diào)試器輸出的數(shù)據(jù)。單步調(diào)試代碼就是檢查一行,執(zhí)行一行,然后檢查結果(然后再重復這個過程)。正因為這個活動如此重要,因此掌握如何在Visual Studio中高效地執(zhí)行這些操作,是節(jié)省調(diào)試時間最重要的途徑。這里,我們會覆蓋每個單步操作并提供相應的示例。
1. 啟動一個調(diào)試會話(逐語句代碼調(diào)試)
Step Into(逐語句)命令在調(diào)試菜單和工具欄上都有(還可以通過F11快捷鍵調(diào)用)。調(diào)用這個命令有兩種相關行為。第一種是當程序不在調(diào)試模式時調(diào)用。這時,程序會被編譯、啟動,第一行會被顯示在調(diào)試窗口準備單步調(diào)試。這也就是逐語句調(diào)試程序。圖10-16顯示了調(diào)試模式下的一個窗口,這是調(diào)用逐語句命令的結果。
<DIV style="BORDER-BOTTOM: #999999 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 3pt; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: #999999 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">注解 對于Web應用程序,使用Step Into或Step Over不是同樣的效果。在站點這種情形中,你的應用程序運行在調(diào)試模式中。調(diào)試器不會在程序的第一行中斷。要達到同樣的效果,你必須設置斷點或者使用Run To Cursor選項(參看下一節(jié))。
</DIV>
圖10-16 使用Step Into啟動應用程序
在程序待機的時候調(diào)用Step Over命令(通過調(diào)試菜單、工具欄或者按F10)會產(chǎn)生和Step Into一樣的效果。換句話說程序(假設不是一個站點)會被編譯并在第一行代碼啟動調(diào)試。
l 運行到光標處
一個更方便(而且被忽略)的調(diào)試工具是Run To Cursor(運行到光標)處。該特性的工作方式正如其名。將你的光標定位在某行代碼上并調(diào)用這個命令,程序會被編譯并運行直到抵達光標定位的那行代碼。在這一點上,調(diào)試器中斷程序并呈現(xiàn)這行代碼,以便你能繼續(xù)單步執(zhí)行。這個特性非常方便,因為這正是許多開發(fā)人員的工作方式。他們觀察并指定了一行(或多行)代碼,并想調(diào)試這行代碼。他們不需要從第一行啟動,并常常不希望為斷點而費心。運行到光標處的有用之處在于它可以使得調(diào)試器和你在同一頁代碼上。圖10-17顯示了從上下文菜單調(diào)用這個特性的情形。
即使需要用戶在代碼執(zhí)行到光標位置之前激活部分代碼,Run To Cursor仍然是可以工作的。在這種情況下,它實際上成為了一個不可見的、臨時的斷點。比如,在這個例子中,它會向用戶顯示一個默認頁面。這里,他們可以選擇編輯他們的資料。如果你在編輯資料頁面代碼中某一行設置Run To Cursor命令,調(diào)試器會仍然執(zhí)行程序并等待用戶(測試者或開發(fā)人員)調(diào)用給定的那行代碼。
<DIV style="mso-element: footnote-list">
<DIV style="mso-element: footnote" id=ftn1>
圖10-17 調(diào)用Run To Cursor命令
l 開始調(diào)試
還可以通過選擇Debug菜單或者工具欄(或F5)上的Start Debugging(開始調(diào)試)選項(綠色的Play箭頭)啟動調(diào)試,但是不會中斷代碼,除非發(fā)生異?;蛎袛帱c。如果開發(fā)人員正在測試自己的代碼,而并不想一直單步執(zhí)行或者他使用了很多的斷點,這是一個非常常用的操作。
l 全部中斷
最后,如果程序正在運行,但是你想進入中斷模式,你可以在任何時候從Debug菜單或者工具欄(或Ctrl+Alt+Break)調(diào)用Break All(全部中斷)命令。全部中斷命令用一個暫停圖標表示。這樣允許你在任何位置停止程序的執(zhí)行并從調(diào)試器獲取信息。要在一個非常長的運行進程或循環(huán)(看起來已使你的應用程序停止)中暫停的時候,Break All命令尤其有用。
2. 單步執(zhí)行代碼
在調(diào)試過程中,執(zhí)行代碼有3個選項??梢灾鹫Z句執(zhí)行一行或一個函數(shù)、逐過程執(zhí)行一個給定函數(shù)和跳出一個函數(shù)。我們來看看這3個選項。
l 逐語句
Step Into(逐語句)命令(C#中使用F11,VB中使用F8)允許你逐行調(diào)試代碼。調(diào)用這個命令將會執(zhí)行當前指令,并設置光標到將要執(zhí)行的下一行代碼。逐語句命令跟其他相似命令最大的區(qū)別是如何處理包含函數(shù)調(diào)用的行代碼。如果你當前調(diào)試這樣的行代碼,逐語句命令將會運行到被調(diào)用函數(shù)內(nèi)部的第一行代碼處(如果相應的調(diào)試符號已經(jīng)加載了的話)。
舉個例子,如圖10-18所示。這里展示了Web服務例程中調(diào)用數(shù)據(jù)訪問庫中的函數(shù)Customer.GetById方法。在這種情況下,兩個項目都被加載到解決方案中;因此,你可以訪問兩個項目的調(diào)試符號。所以,使用逐語句命令,調(diào)試器將會執(zhí)行到ReturnDataTable函數(shù)的第一行。
圖10-19展示了跟蹤調(diào)試到這個函數(shù)內(nèi)部的情形。需要注意的是你已經(jīng)進入到逐行調(diào)試這個函數(shù)。當然,當你到達這個函數(shù)的結尾,調(diào)試器將會返回到調(diào)用函數(shù)結束后的下一行處(如圖10-18的Web Service中的第30行)。
圖10-18 逐語句調(diào)試代碼
圖10-19 逐語句調(diào)試進入函數(shù)內(nèi)部的結果
l 逐過程
Step Over(逐過程)命令(F10)幫助你保持焦點在當前過程而不進入任何調(diào)用的函數(shù)內(nèi)部。也就是說,逐過程命令將會逐行執(zhí)行代碼而不會進入到任何被調(diào)用函數(shù)、構造函數(shù)或者屬性函數(shù)的內(nèi)部。
舉個例子,考慮圖10-18。在這里,調(diào)試器位于調(diào)用函數(shù)ReturnDataTable處。如果你調(diào)用逐過程命令,將會執(zhí)行完函數(shù)ReturnDataTable而不會進入其內(nèi)部。也就是說,下一個將要執(zhí)行的行將會是調(diào)用函數(shù)ReturnDataTable的下一行代碼(第30行)。當然,如果函數(shù)內(nèi)部拋出異常,調(diào)試器仍然會進入你的代碼異常處。
l 跳出
Step Out(跳出)命令(Shift+F11)是另外一個有用的工具。它允許你告訴調(diào)試器執(zhí)行完當前調(diào)用的方法后立即返回到中斷模式。當你調(diào)試到一個代碼很長的方法中而又想跳出方法的時候,這個跳出命令將會給你帶來很多方便。另外,有時候你只想調(diào)試一個函數(shù)的一部分代碼的時候,調(diào)試完想快速跳出也可以使用這個命令。
舉個例子,如圖10-19所示?;叵雱偛拍阒鹫Z句進入的那個函數(shù),代碼如圖10-18。假設你已經(jīng)逐行執(zhí)行了幾行代碼。當你檢查了代碼,核實連接數(shù)據(jù)庫已經(jīng)成功后,你想立即完成函數(shù)的執(zhí)行,并且返回調(diào)用這個函數(shù)的斷點處(如圖10-18中的30行)。要達到這個目的,簡單地調(diào)用跳出命令即可。
3. 繼續(xù)執(zhí)行
當你在調(diào)試狀態(tài)下,Start Debugging(或者Run)命令將改變?yōu)镃ontinue命令。在調(diào)試器中,當你中斷在某一行代碼的時候,繼續(xù)命令按鈕將會變?yōu)榭捎脿顟B(tài)。這將允許你讓程序繼續(xù)運行而不需要單步執(zhí)行后面的每一行代碼。例如,假設你已經(jīng)單步走過了你感興趣的代碼行,現(xiàn)在你又想從一個用戶的觀點去檢查你的程序。使用繼續(xù)按鈕,告訴程序和編譯器繼續(xù)執(zhí)行,直到遇到下一個斷點或者發(fā)生異常的地方。
4. 結束調(diào)試
結束調(diào)試會話有好幾種方法。一種比較通常的做法是關閉當前可執(zhí)行程序。對于一個Web程序你可能通過關閉瀏覽器結束,而對于一個Windows程序你可以單擊了關閉(或者X)按鈕。在你的代碼中調(diào)用終止程序也可以結束一個調(diào)試會話。
在調(diào)試窗口中,還有很多其他的功能。Terminate All(全部終止)命令將終止所有被調(diào)試器附加上的進程,并且結束調(diào)試會話。還有一個命令叫做Detach All(全部分離)。圖10-20在工具欄上面顯示了這兩個按鈕。全部分離只是簡單地將調(diào)試器跟被調(diào)試進程分離而不中斷他們。當你只是臨時附加到一個運行中的進程,調(diào)試完后想讓它繼續(xù)運行的時候,這種功能是很有用的。
圖10-20 從進程中分離
10.2.4 在代碼中指定斷點
可以通過斷點和跟蹤點來控制調(diào)試器。有了這些,你就可以在想要中斷代碼或者接收程序信息的時候通知調(diào)試器。斷點允許你指明調(diào)試器何時必須在某一特定行中斷。跟蹤點是Visual Studio 2005第一次引入的。它是一種當調(diào)試器到達某特定行的時候執(zhí)行一種動作的斷點。這通常包含發(fā)送一些與應用程序相關的信息到輸出窗口。掌握這類斷點的用法可以減少定位和修復代碼錯誤的時間。
1. 設置斷點
設置斷點最通常的做法就是找到你想讓調(diào)試器中斷的代碼行,然后單擊代碼編輯器的指示器邊距。這樣操作后指定行的指示器邊距將會出現(xiàn)一個紅色的圓圈,并且指定代碼行會以紅色突出顯示。當然,這些都是默認顏色。你也可以在Tools→Options對話框的Environment節(jié)點的Fonts and Colors中調(diào)整。
還有一些設置斷點的其他方法。例如,你可以在指定行單擊右鍵,從右鍵的Breakpoints菜單中選擇Insert Breakpoint。你也可以從Debug菜單中選擇New Breakpoint(或者在C#中按Ctrl+D,N;也可在VB中按Ctrl+B)。這個選項將會彈出一個New Breakpoint對話框,在這里你可以設置一個函數(shù)斷點。
l 設置函數(shù)斷點
通過New Breakpoint(新建斷點)對話框設置的斷點稱之為函數(shù)斷點(function breakpoint)。之所以被稱為函數(shù)斷點僅僅是因為斷點被設置在函數(shù)的入口處而已(但是不一定要這樣)。在新建斷點對話框,你可以手動設置中斷的函數(shù)名稱和在函數(shù)的哪一行,甚至這一行的哪個字符中斷。
如果光標在某個函數(shù)內(nèi)部或者在調(diào)用某個函數(shù)的地方,當你調(diào)用新建斷點對話框的時候,函數(shù)名稱會自動填充到對話框中的中斷函數(shù)名稱中。你也可以手動敲入中斷函數(shù)的名稱。圖10-21顯示了使用新建斷點對話框的情形。記住你可以手動設置斷點所放置的行甚至該行中的特定字符。
<DIV style="BORDER-BOTTOM: #999999 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 3pt; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: #999999 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">注解 如果在新建斷點對話框中指定一個重載的函數(shù)時,你必須指定需要中斷的實際函數(shù)名稱。可以通過設置重載函數(shù)的參數(shù)類型來指定它。例如,當前函數(shù)LoadCustomer接受一個int類型的客戶ID參數(shù)。如果你有一個重載函數(shù)通過客戶名稱(string類型)來檢索客戶,必須在函數(shù)字段指定重載函數(shù)為LoadCustomer(string)。
</DIV>
圖10-21 新建斷點對話框
2. 識別Visual Studio的多種斷點
Visual Studio 2008有很多斷點圖標。通過這些圖標你可以很容易地識別出某代碼行的斷點類型。例如,一個實心圓表示一個普通斷點,反之空心圓則表示一個被禁止的普通斷點。我們提供了表10-3作為參考。它展示了一些比較常用的斷點類型的圖標及其描述。
表10-3 斷點圖標
<DIV align=center>圖 標
描 述
表示一個標準的、啟用的斷點。當調(diào)試器執(zhí)行到這一行時,將會停止應用程序并進入調(diào)試狀態(tài)
表示一個標準的跟蹤點。當調(diào)試器執(zhí)行到這一行時,它將執(zhí)行與該跟蹤點關聯(lián)的動作
斷點圖標中的加號表示這是一個高級斷點,它包含了條件、命中次數(shù)或者過濾器
跟蹤點圖標中的加號表示這是一個高級跟蹤點,它包含了條件、命中次數(shù)或者過濾器
中空的斷點圖標表示一個禁用的斷點。該斷點仍然與這行代碼關聯(lián),只是在它再次啟用之前調(diào)試器不會識別它
中空的圖標可以用于多種斷點圖標,比如跟蹤點高級項以及錯誤和含有警告的斷點。在這些情況下,中空的圖標表示該項已經(jīng)被禁用了
表示一個斷點警告,因為一個暫時的原因該斷點無法設置。這可能是由于沒有對網(wǎng)站啟用調(diào)試模式或者調(diào)試符號沒有加載。該圖標由Visual Studio設置
表示一個跟蹤點警告(參見上一條描述)
</DIV>3. 使用斷點窗口
Visual Studio的Breakpoints(斷點)窗口提供了一個方便的途徑來組織和管理那些你想中斷調(diào)試器的條件。通過點擊調(diào)試菜單或者工具欄(或者在C#中按Ctrl+D,B;也可以在VB中按Ctrl+Alt+B)都可以彈出斷點對話框。圖10-22顯示了Visual Studio的Breakpoints菜單。
圖10-22 斷點窗口
l 斷點窗口工具欄
斷點窗口有它自己的工具欄,可以使用這個工具欄管理窗口中的斷點。表10-4列出了該工具欄上有效的命令。
表10-4 Breakpoints窗口工具欄
<DIV align=center>項
描 述
打開新建斷點窗口,允許用戶對一個函數(shù)設置斷點
允許你刪除列表中的選中斷點
刪除窗口中的所有斷點
切換所有斷點的啟用狀態(tài)。如果所有斷點都是啟用的,點擊該圖標你可以保留這些斷點,并把它們一起禁用。如果所有斷點都是禁用的,該命令則可以將它們一起啟用
允許你跳到與選中斷點關聯(lián)的源代碼中
允許你跳到與選中斷點關聯(lián)的反編譯代碼中
允許你選擇你希望在斷點窗口中看到哪些列。每個列提供給定斷點的不同信息。例如,你可以看到和每個斷點相關聯(lián)的條件、文件名、函數(shù)、過濾器、進程等
</DIV>l 管理每個獨立的斷點
斷點窗口同時也提供了管理每個獨立斷點的方法。在這里你可以設置與斷點相關聯(lián)的各種屬性。例如,你可以通過切換和列表中斷點關聯(lián)的復選框來禁用或啟用某個斷點。圖10-23顯示了一個被禁止的跟蹤點和一個獨立斷點的關聯(lián)菜單。
圖10-23 管理獨立的斷點
注意,通過斷點的上下文菜單你可以刪除這個斷點或者跳轉到斷點所在的代碼。然而,更重要的是設置斷點條件和過濾器。我們將在下一節(jié)講解這兩種操作。
4. 條件斷點
設置一個簡單的斷點經(jīng)常是不夠的(或者效率太低)。例如,如果你要在代碼中測試一個特定條件是否為真——一個看起來會導致異常的條件,就可以使用條件斷點。這將為你的調(diào)試節(jié)省很多時間,而不需要經(jīng)常地中斷到函數(shù)內(nèi)部,然后判斷是不是沒有到達你指定的條件。
可以在斷點中添加5種條件:位置、條件、命中次數(shù)、篩選器、命中時間??梢詮腂reakpoints窗口給斷點添加條件。選擇給定的斷點,然后右擊。這會彈出給定斷點的上下文菜單。圖10-24給出了一個示例。從中可以看到列出的斷點的各種條件。后面幾節(jié)重點講解可以在斷點中添加的這幾種條件。
圖10-24 訪問斷點的條件特性
l 設置斷點條件
當某個條件被測試為真或者改變的時候,斷點條件允許你中斷調(diào)試器或者執(zhí)行一個動作(跟蹤點)。通常,你知道你正在調(diào)查的bug只有在某一個非常特定的條件下才會出現(xiàn)。對于查找一個偶發(fā)的bug,斷點條件是一個非常好的解決方案。
要設置條件,首先選擇一個你想設置條件的斷點。你可以在右鍵菜單中選擇Condition選項,這時彈出一個Breakpoint Condition(斷點條件)對話框,如圖10-25所示。注意當設置一個條件的時候,你可以使用智能感知特性(通過輸入一個點或者按Ctrl+Space來調(diào)用智能感知)。
當設置一個條件時,你有兩種選擇:Is True(為真)或者Has Changed(已改變)。Is True選項允許你設置一個布爾類型的條件;當調(diào)試器計算條件為真的時候,會自動中斷到指定代碼行。
比如,來看一個簡單的例子。假設只有某特定客戶才會發(fā)生一個錯誤。你可能想在Customer服務類的Get函數(shù)中設置一個斷點。然后,你可能會為添加Is Ture的條件id=1234(id是函數(shù)的參數(shù))。這將告訴編譯器,如果函數(shù)參數(shù)的表達式不滿足,調(diào)試器就不會在斷點處停止。圖10-26的對話框中顯示了設置的條件。對話框同時也顯示了可用于條件的兩個選項。
<DIV align=center>圖10-25 設置斷點條件
圖10-26 設置斷點條件對話框
</DIV>“已更改”(Has Changed)選項告訴調(diào)試器在調(diào)試中當表達式的值發(fā)生改變時,調(diào)試器將會在斷點處停住。編譯器第一次編譯時,為表達式賦初值。如果在這之后,表達式的值改變了,編譯器會在斷點處中斷。當某個字段或是某個屬性有初值,同時你想跟蹤這個初值什么時候被改變了,這個功能將很有用。另外,“已更改”選項對于循環(huán)和if...then關系語句很有用,因為使用這兩種關系的語句,你只關心你代碼的結果是不是改變了一個特定的值。
<DIV style="BORDER-BOTTOM: #999999 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 3pt; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: #999999 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">提示 斷點的信息將被永久保存在調(diào)試會話中。也就是說,當你在設置斷點信息后關閉Visual Studio,你的斷點在下次打開Visual Studio時依然存在。這樣就不會每次都在設置一些復雜的調(diào)試選項上面浪費時間。斷點保存在程序中,你隨時可按照需要啟用或者禁用。
</DIV>l 位置中斷
你可以基于文件中特定位置來編輯斷點以設置中斷。大多數(shù)斷點都是位置斷點。也就是說,它們自動知道文件、行數(shù)和中斷特征。然而,還有很多時候你可能想編輯該信息。例如,假設你的代碼和運行中的生成稍微不同步。你需要編輯斷點來在不同的代碼行上中斷。
圖10-27顯示了文件斷點窗口,該問來自斷點上下文菜單的位置選項。你也許使用這項功能來快速設置斷點在特定行上,而不用搜索你的源代碼。
l 設置斷點過濾器
Breakpoint Filter(斷點過濾器)允許你指定斷點在某個具體的機器、處理器或是線程上有效。例如,如果你的錯誤有可能只發(fā)生在某臺特定的機器或是某種特定的處理器上,那么你可以通過篩選器指定這種具體情況來調(diào)試錯誤。篩選器在高度分布式的復雜調(diào)試環(huán)境下是極其有用的。
使用這種特性的方法是,你可以指定機器的名稱、處理器的名稱或是編號,或者進程的名稱或編號。也可以&(與)、||(或)、和!(非)等符號來進行組合。這種指定合集的方法允許你指定特定機器的特定進程上的某個特定的線程。圖10-28顯示了設置斷點篩選器的對話框。圖中假定正在運行的進程是開發(fā)Web服務器(WebDev.WebServer.EXE),斷點狀態(tài)被配置為停止。
<DIV align=center>圖10-27 文件斷點位置對話框
圖10-28 斷點篩選器對話框
</DIV>l 使用斷點命中次數(shù)
使用Hit Count(命中次數(shù))命令,你可以告訴調(diào)試器在給定的代碼行被執(zhí)行過多少次之后中斷。一般來說,你可以找到比基于命中次數(shù)中斷更好的條件。但是,當你無法確定一個恰當?shù)臈l件,但是你知道你的代碼在執(zhí)行了多少次之后將會出現(xiàn)錯誤時,這個特性很有用。此外,設置命中次數(shù)選項可能在使用跟蹤點的情況下更有用,這種情況下你會輸出與你代碼中發(fā)生問題有關的數(shù)據(jù)。你可能只想定期輸出這樣的數(shù)據(jù)。
圖10-29顯示了Breakpoint Hit Count(斷點命中次數(shù))對話框。注意這個屏幕截圖是在調(diào)試會話運行過程中獲取的??梢栽诨顒拥恼{(diào)試會話中為斷點添加任何條件。另外,需要注意的是當前命中次數(shù)被設置為1。可以通過單擊Reset(重置)按鈕來設置命中次數(shù)為0,再從那一點繼續(xù)調(diào)試。
圖10-29 設置斷點命中次數(shù)
這個對話框同樣提供了一些設置實際命中次數(shù)的選項。在When the breakpoint is hit下面的下拉框列表中包含這些選項:
q Break Always(總是中斷)(默認,不會調(diào)用命中次數(shù)選項);
q Break When the hit count is eqral to(中斷,條件是命中次數(shù)等于);
q Break When the hit count is a multiple of(中斷,條件是命中次數(shù)幾倍于);
q Break When the hit count is greater than or equal to(中斷,條件是命中次數(shù)大于或等于)。
<DIV style="BORDER-BOTTOM: #999999 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 3pt; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: #999999 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">提示 可以將以上我們討論過的所有的斷點條件組合到一個斷點上。例如,可以為給定的斷點添加條件和篩選器,由此可以創(chuàng)建更為具體的場景來使用斷點調(diào)試應用程序。
</DIV>10.2.5 使用跟蹤點
通過跟蹤點可以在執(zhí)行到某個斷點時,向Output(輸出)窗口發(fā)送數(shù)據(jù),或者運行一段Visual Studio宏。然后你就可以選擇中斷調(diào)試器(比如一個常規(guī)斷點),處理另外一個條件,或僅僅是繼續(xù)執(zhí)行應用程序。如果需要你的應用程序在調(diào)試模式下運行,并且在遇到斷點的時候記錄一些運行日志,該功能就非常適用。這樣你就可以從這個日志中獲得很多有價值的信息,比如異常拋出時的特定條件和執(zhí)行順序。
可以顯式地設置跟蹤點,右擊一行代碼,然后從Breakpoint菜單中選擇Insert Tracepoint(插入跟蹤點)。還應從斷點(斷點窗口中)的上下文菜單中選擇When hit命令(見圖10-24),打開跟蹤點對話框,該對話框的標題為When Breakpoint Is Hit,如圖10-30所示。
圖10-30 設置跟蹤點
When Breakpoint Is Hit對話框中的選項包括向輸出窗口Print a message(打印消息)、Run a macro(運行宏)和Continue execution(繼續(xù)執(zhí)行)。你可以任意組合這些選項。首先,通過打印消息,你可以輸出有關函數(shù)的數(shù)據(jù)。你可以使用多個關鍵字來輸出數(shù)據(jù),比如$FUNCTION代表函數(shù)名字,$CALLER代表調(diào)用者的名字。圖10-28中顯示了完整的列表。你還可以輸出某個變量的值,只要把變量名放在大括號中。
通過繼續(xù)執(zhí)行選項,你可以決定這是一個真正的跟蹤點還是一個包含跟蹤點的斷點。如果你選擇繼續(xù),你就只能使用跟蹤動作(消息或者宏)。如果你不選擇繼續(xù),除了能夠使用跟蹤動作外,調(diào)試器將會在執(zhí)行到該行的時候停止,就跟一個簡單的斷點一樣。這從本質上就是給一個標準的斷點使用When Hit動作。
最后,如果你選擇運行宏選項,對話框將會列出你的環(huán)境中加載的所有的宏,你可以選擇自己要執(zhí)行哪個。
也可以對跟蹤點動作使用條件。這樣,僅當滿足條件時才會執(zhí)行跟蹤點動作。
舉例來說,在Web服務GetCustomerProfile中,我們設置了一個跟蹤點(如圖10-30所示)。該跟蹤點在執(zhí)行到該行代碼的時候向輸出窗口打印一條消息,然后程序繼續(xù)執(zhí)行。我們要打印的消息如下所示:
Function: $FUNCTION, Thread: $TID $TNAME, Id: {id}
消息中包括函數(shù)名、線程ID和名字(如果有的話),以及變量customerId的值。圖10-31在Output(輸出)窗口中顯示了該跟蹤點被執(zhí)行過兩次后的結果。
圖10-31 跟蹤點的結果
10.2.6 在調(diào)試器中查看數(shù)據(jù)
在調(diào)試器進入中斷模式后,接下來的挑戰(zhàn)就是過濾程序中的數(shù)據(jù)了。找到正確的數(shù)據(jù)可以幫助你更快地發(fā)現(xiàn)問題和修復問題。Visual Studio試圖在你想要查看數(shù)據(jù)的時候,把所有的數(shù)據(jù)都準備好。比如,數(shù)據(jù)提示顯示了代碼編輯器中變量的值。關于Visual Studio何時何地顯示需要調(diào)試數(shù)據(jù)的方式有很多相似的例子,我們會在隨后的幾節(jié)中闡述。
1. 觀察變量
在調(diào)試會話中,一個常見的活動是觀察與程序中眾多類型相關聯(lián)的值。這有多個窗口可以帶來幫助。最明顯的兩個是Locals(局部變量)窗口和Autos(自動)窗口。
l 局部變量窗口
局部變量窗口顯示當前調(diào)試范圍內(nèi)的所有變量和它們的值。這就為你呈現(xiàn)了當前正在執(zhí)行的方法中所有的值。調(diào)試器自動設置該窗口中變量的值,這些變量根據(jù)名字按照字母順序出現(xiàn)在列表中。并且這里也顯示了一些層級結構。例如,某個變量對應于一個對象類型,那么該對象的成員會列在該變量的下面(以樹的形式)。
圖10-32顯示了一個局部變量窗口的例子。這里你可以看到,示例程序暫停在Customer.Get服務方法中。注意,customer變量(c)處于展開狀態(tài),下面顯示了和該對象相關的各個屬性和字段。它們的值顯示在Value列中。
圖10-32 局部變量窗口
<DIV style="BORDER-BOTTOM: #999999 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 3pt; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: #999999 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">提示 可以在局部變量或自動窗口中編輯變量的值。右擊變量,從上下文菜單中選擇Edit Value(編輯值)。然后,就可以像在即時窗口中那樣修改變量的值了。
</DIV>l 自動窗口
通常局部變量窗口中提供的變量顯得太多了,尤其是給定進程或者函數(shù)中包含的變量過多的時候。為了限制你所能看到的變量數(shù)量,你可以使用自動窗口。該窗口顯示當前執(zhí)行行和前一行代碼中的變量和表達式的值。這樣你就可以專注于正在調(diào)試的變量了。
圖10-33顯示了與圖10-32中顯示的同一行代碼所對應的自動窗口。這里你應該注意,它們顯示的內(nèi)容有哪些差別。同時,你還應該注意Visual Studio甚至添加了一些與代碼不同的表達式。比如,對dt.Rows[O]["contact_via_email"]的調(diào)用出現(xiàn)在觀察項中。
圖10-33 自動窗口
l 監(jiān)視窗口
可以將想要觀察的變量和表達式添加到Visual Studio的監(jiān)視窗口中。這樣,你就可以決定你對哪些項目感興趣。監(jiān)視窗口的外觀和行為與局部變量和自動窗口很相似。此外,你放到監(jiān)視窗口中的項從一個調(diào)試會話到另一個調(diào)試會話始終保持不變的。
可以從調(diào)試菜單或者工具欄來訪問每個監(jiān)視窗口。4個監(jiān)視窗口分別命名為Watch 1到Watch 4。你可以使用4個監(jiān)視窗口來構建4個自定義的觀察列表。該功能尤其適用于每個自定義列表對應于應用程序中一個獨立范圍的情況。
可以從代碼編輯器或者QuickWatch窗口向監(jiān)視窗口添加變量或者表達式。如果是從代碼編輯器中,首先選擇一個變量或者突出顯示一個表達式,單擊鼠標右鍵,選擇Add Watch(添加監(jiān)視)菜單項。這將會將突出顯示的變量或者表達式放到監(jiān)視窗口中去。你也可以將突出顯示的項拖到監(jiān)視窗口。
l 快速監(jiān)視
QuickWatch(快速監(jiān)視)窗口和其他監(jiān)視窗口非常相似。你可以通過它關注一個單獨的變量或者表達式。由于DataTips的存在,快速監(jiān)視窗口用得非常少。從快速監(jiān)視窗口,你可以寫一些表達式,然后將其添加到監(jiān)視窗口。在寫表達式的時候,你會用到智能感知特性。圖10-34顯示了快速監(jiān)視窗口。
在快速監(jiān)視窗口中點擊Reevaluate,窗口中的項會被重新求值。點擊Add Watch按鈕,相應的變量會被添加到Watch 1窗口中。
2. 數(shù)據(jù)提示
可以使用數(shù)據(jù)提示突出顯示代碼編輯器中的一個變量或者表達式,并且不離開編輯器就能夠獲得觀察信息。這個特性正是開發(fā)人員所期望的行為。例如,如果正在查看某一行代碼,那么可以突出顯示該行中的部分代碼,對其進行求值。以前,這需要創(chuàng)建快速監(jiān)視。但現(xiàn)在你也可以懸停在項之上,其數(shù)據(jù)會在數(shù)據(jù)提示中展開。
圖10-35提供了一個例子。這里光標位于變量customer的位置,變量類型為Customer。單擊加號打開這個變量,你會看到該對象的眾多成員??梢允褂么翱诘撞康募^滾動查看該列表。也可以右擊列表中的某個成員,編輯它的值、復制或者將其添加到監(jiān)視窗口。有些項旁邊有一個放大鏡圖標,可以使用它來給給定的項選擇一個特定的Visualizer(可視化工具)(馬上會講到)。
<DIV style="mso-element: footnote-list">
<DIV style="mso-element: footnote" id=ftn1>
</DIV><DIV style="mso-element: footnote">圖10-35 數(shù)據(jù)提示窗口
也可以選擇一個表達式,然后對其以數(shù)據(jù)提示的形式求值。例如,可以選擇圖10-35中第39行(bool)dt.Rows[O]["contanct_via_email"],數(shù)據(jù)提示會顯示該變量,其值為true。
<DIV style="BORDER-BOTTOM: #999999 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 3pt; PADDING-LEFT: 0cm; PADDING-RIGHT: 0cm; BORDER-TOP: #999999 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">提示 數(shù)據(jù)提示窗口經(jīng)常會擋住下面的代碼。有時候,可能需要看到下面的代碼,而又不希望離開當前的數(shù)據(jù)提示。這時,可以按住Control(Ctrl)鍵,在按住該鍵的時間內(nèi)數(shù)據(jù)提示是透明的。
</DIV>3. 可視化數(shù)據(jù)
在觀察變量的值時,你真正想要的其實是對象背后的數(shù)據(jù)。有時候對象模型本身反而使得數(shù)據(jù)看上去晦澀難懂。例如,假設要查看一個DataSet對象中的數(shù)據(jù)。要找到想要的數(shù)據(jù),需要在監(jiān)視窗口或者數(shù)據(jù)提示中挖掘很多層。僅僅為了獲得對象中包含的一個數(shù)據(jù),你不得不在對象模型內(nèi)部來回地查找。如果使用過Visual Studio之前的版本一段時間,你就知道這是多么讓人厭倦了。
為此,Visual Studio提供了一個快速、便捷的訪問對象中包含數(shù)據(jù)的方式。這是通過一個新工具可視化工具實現(xiàn)的??梢暬ぞ咧傅氖菍ο髷?shù)據(jù)以一個有意義的形式展現(xiàn)出來。
默認情況下,Visual Studio已經(jīng)自帶了幾個可視化工具。它們包括:
q HTML——將HTML數(shù)據(jù)以類似瀏覽器的對話框顯示出來,就跟用戶真正看到的一樣;
q XML——將XML顯示為結構化的格式;
q Text——將字符串顯示為容易閱讀的格式;
q DataSet——用于顯示DataSet、DataView和DataTable對象的內(nèi)容。
Visual Studio中還包含了一個編寫和安裝可視化工具的框架??梢宰约簩懸粋€可視化工具,然后將其插入到調(diào)試器中。也可以下載別的可視化工具并安裝到Visual Studio中。數(shù)據(jù)結構和檢視數(shù)據(jù)的方式有多少種,可視化工具就有多少種可能。比如,可以以樹的形式來展示層級結構的數(shù)據(jù);以圖形工具來顯示圖像數(shù)據(jù)結構。
可以從很多數(shù)據(jù)觀測點來調(diào)用可視化工具。包括監(jiān)測窗口和數(shù)據(jù)提示??梢暬ぞ哂靡粋€放大鏡圖標表示。圖10-35顯示了使用該圖標啟動可視化工具的情形?,F(xiàn)在可以從數(shù)據(jù)提示中啟動可視化工具來檢視DataSet,而無需為了得到數(shù)據(jù)而在一個復雜的對象層級結構中挖掘很多層。圖10-36顯示了在示例程序中使用可視化工具檢視DataSet對象的例子。
圖10-36 DataSet可視化工具
10.2.7 使用編輯并繼續(xù)特性
使用Edit and Continue(編輯并繼續(xù)),你可以在調(diào)試的過程中修改代碼,而不必停止調(diào)試會話??梢跃庉嬕恍写a,甚至修復一個bug,而不需要離開中斷模式。那些用過早于.NET版本Visual Basic的開發(fā)人員應該記得這一強大的工具。.NET中對于這一特性的需求特別強烈。幸好,在VS 2005中Visual Basic和C#都支持編輯并繼續(xù)特性。在VS 2008中,這一特性也添加到了Visual C++中。
調(diào)用編輯并繼續(xù)特性沒有什么技巧。只需要在一個調(diào)試對話中修改你的代碼,然后使用Step命令或者Continue命令運行完你的代碼就可以了。
這一特性默認是啟用的。如果它被關閉了,可以從Tools菜單中的Options對話框重新啟用它。
并不是所有的代碼修改都可以使用編輯并繼續(xù)功能,實際上它只能用于很小的修改。作為最佳實踐,你不應該在調(diào)試狀態(tài)下大幅地調(diào)整代碼。如果你的修改在方法體內(nèi),通過編輯并繼續(xù)的可能性會高得多。否則,如果修改是在方法體外,絕大多數(shù)情況下都需要重啟調(diào)試器。一些常見的不適用于編輯并繼續(xù)的修改包括:
q 編輯當前活動的語句;
q 修改通向當前活動語句的堆棧的調(diào)用;
q 添加新的類型、方法、域、事件或屬性;
q 改變函數(shù)簽名。
更詳盡的列表,請在MSDN中搜索Edit and Continue(編輯并繼續(xù))。在那里你可以鏈接到所選語言的編輯并繼續(xù)文檔。然后可以選擇“Supported Cole Changes”(支持的代碼改動)鏈接。在此可得到所選語言的支持改動的列表和不支持改動的列表。
</DIV></DIV></DIV></DIV>