最近打算系統地學習一下C#語言,在看Professional C#。不知道各位關於如何學好系統地C#語言有沒有好的提議,如有還請賜教:)
工欲善其事,必先厲其器,要想做好軟體開發,掌握好的調試工具和技巧是很必要的!在看書的過程中發現了一些我以前不知道的VS.NET有用的調試功能(可能很多人都已經知道這些功能了,如果誰有相關的使用經驗希望能夠分享),這裡做個很簡單的介紹:
一、斷點設定(Breakpoints)
我們平時使用斷點的功能一般就是在某行代碼的前面的灰色地區單擊一下滑鼠,或者按F9,從而給那行設定了斷點,然後在偵錯工具的時候就等著在斷點處中斷。但是有沒有遇到過這樣的情況,就是:假如你在某個迴圈語句for(int i = 0; i < count; i++)裡,你希望當迴圈計數器i達到某個值的時候你再中斷,而不是從0開始每次都中斷,因為很有可能這個迴圈的count很大,或者你希望中斷的那個i值很大;還有就是有時你希望某個運算式達到某個條件的時候你再中斷那個斷點,這樣可以很明確地捕獲調試問題的所在。
那麼其實上面的功能在VS.NET中已經提供了,而且相當靈活,我可以設定或修改斷點的屬性。在進行斷點設定前,首先需要調出斷點屬性對話方塊,你可以選菜單"Debug->New Breakpoint...",或者按下Ctrl+B,就彈出了斷點設定框:
如果是要對已經存在的breakpoint進行設定可以選菜單"Debug->Windows->Breakpoints"或Ctrl+Alt+B來開啟Breakpoints表單:
選中你要修改的breakpoint,然後單擊右上的帶有小手的按鈕或者是從右鍵菜單中選擇properties,就會彈出上面的斷點設定對話方塊了。
斷點設定框上面的幾個標籤分別允許你通過不同的方式設定斷點,前面三個標籤沒有什麼好說的分別是:
Function:允許你從函數的位置來定義斷點;File:可以指定在源檔案的某個地方定義斷點,Address:可以通過記憶體中的代碼地址來設定斷點;
關於第四個標籤Data我有點疑惑(還請高手指教一下):
據說它可以監視某個變數的值,甚至可以是數組或指標某個位移處的值(通過Items設定內部位移),一旦這個變數的值發生了改變就中斷這個斷點。這個功能看似十分強大,但是我自己試了一下,發現C#和CLR不支援這種功能的斷點,可能和託管模式下變數地址無法確定有關吧,遺憾啊~~
強行選擇Language為C++,也會報錯:
算了,對這個原本很有誘惑力的功能只能死心了:)
下面來看斷點中斷條件的設定,
點擊斷點設定框下面的Condition...按鈕就會出現下面的對話方塊:
這裡你指定當某個運算式或變數達到為真或值發生改變的時候才中斷這個斷點。(其實這裡的變數值改變作為中斷條件與上面的變數監測功能是不一樣的)
點擊斷點設定框下面的HitCount...按鈕就可以針對斷點被觸發的次數來設定中斷條件:
有四種條件設定:
1,始終中斷(也就是預設的斷點設定);2,當觸發次數等於某個數值的時候中斷;3,當觸發次數是某個數值的整數倍的時候中斷;4,當觸發次數大於或等於某個數值的時候中斷。
利用這個特性對於大迴圈裡某個語句的中斷調試會很有用。
二、監視(Watches)
關於監視的功能主要是由幾個表單組成,這些功能大家都很熟悉了不用多講,分別是:
Autos,程式最後訪問的變數的內容;Locals,堆棧中當前函數範圍內的局部變數的內容;This,當前執行個體對象的內容;CallStack,當前程式呼叫堆疊的情況;Treads,可以提供當前應用程式的所有線程的情況。還有就是Watch和Memory表單,VS.NET 2003同時支援4個Watches表單和4個Memory表單,允許你同時查看多個變數或多片記憶體地區的情況,尤其是Watches表單對我們監視變數的內容很有作用,支援拖拉操作,可以在調試的時候直接把代碼的變數字串拖到watch表單中顯示。
上邊所有的監視相關的表單只有在調試的時候才可以出現,通過"Debug->Windows"菜單可以找到所有的表單。
另外還有一些調試相關的表單有:Modules,Disassembly,Register,Running Documents。其中Running Documents不知道是做什麼用的?希望知道的高手請高知,多謝了!
三、異常捕獲(Exceptions)
關於程式中拋出的異常,VS.NET也可以很靈活的捕獲,以往我以為只有程式沒有捕獲(也就是沒有寫相關處理常式)的異常才可以最終被調試器捕獲,其實VS.NET允許你靈活地捕獲各種異常並進行調試。通過"Debug->Exceptions",或按Ctrl+Alt+E可以開啟下面的異常捕獲對話方塊:
在這裡你可以看到VS.NET的調試器在運行時能夠識別出所有的異常,不僅包括CLR的異常,還可以是C++異常,Native的異常和Win32的異常。展開這四個異常的根節點,你可以看到所有代表各種異常的子類:
上面預設列出的都是.net framework中的異常,當然你也可以添加自己代碼中定義的異常,單擊右邊的Add按鈕,
在文字框中輸入異常類的全名稱就可以了。
當你選種了某個異常之後,就可以指定調試器對這個異常採取的動作了:
有兩種情況分別是:當異常拋出時,也就是throw語句的地方;還有就是當最終拋出的、應用程式沒有做處理的異常。
針對這這兩種情況的異常都可以採取三種動作:中斷並進入調試器;忽略異常繼續執行代碼;使用父節點(基類異常)的設定。
按照預設設定,以前只要是程式中catch了的異常,調試器是不會捕獲的,現在通過上面對話方塊中的設定,可以很方便地捕獲並調試個中異常了。
另外在Debug菜單下還有好多關於調試的功能,本人沒有看過,也就不多說了。
好了,關於VS.NET中調試功能我就簡單的說這麼多,其中說不定也有我理解錯誤的地方,請大家指正。並希望大家能夠分享你們自己調試的經驗技巧,大家互相學習,共同進步!:)