官术网_书友最值得收藏!

8.1 初級調試技巧

8.1.1 基礎操作

首先介紹的是最基礎的調試操作,已經具備了調試基礎的讀者可以直接跳過本節。在debug模式下,可以單擊工具欄中的“調試”按鈕啟動調試,設置斷點,并使用相應的調試快捷鍵進行調試。如表8-1介紹了Visual Studio和Xcode這兩個IDE最基礎的調試快捷鍵(Xcode一般在筆記本鍵盤下才需要按Fn),通過斷點以及逐語句和逐方法的調試,可以觀察到程序運行的流程,結合對變量的監視,可以分析出程序執行錯誤流程的原因。

表8-1 調試快捷鍵

設置斷點的方式是在代碼界面左側的斷點欄單擊或按斷點快捷鍵,Visual Studio為F9,在斷點欄上會出現紅色的圓形斷點,如圖8-1所示。Xcode為cmd+\,在斷點欄上會出現藍色的書簽形斷點,如圖8-2所示。

圖8-1 Visual Studio斷點調試

圖8-2 Xcode斷點調試

調試時程序運行到斷點處會停下,程序當前執行到的代碼行對應的斷點欄會有一個小箭頭標識,可以通過拖曳這個小箭頭強制改變程序的運行流程,例如,希望再次執行一遍,可以將小箭頭往回拖,如果希望跳過某些代碼,也可以直接拖曳小箭頭跳過那些代碼。這個操作最好不要跳過當前正在執行的函數,如拖曳到另外一個函數中。

除了單步調試之外,還可以將鼠標指針懸停在當前堆棧中的變量上查看、修改當前堆棧中的變量,也可以是一些全局變量,修改后按Enter鍵即可生效,如圖8-3和圖8-4所示。

圖8-3 Visual Studio修改變量

圖8-4 Xcode修改變量

查看當前堆棧也是最常用的基礎操作,因為雖然問題出現在這里,但是問題的根源可能是由于調用者傳入了錯誤的參數,那么就需要通過堆棧來分析上層調用者的問題。Visual Studio可以通過調用堆棧窗口來查看當前的堆棧,雙擊堆棧上的函數可以跳轉至對應的函數,并查看對應函數的執行情況以及相關變量等,如圖8-5所示。

圖8-5 調用堆棧

Xcode則需要通過左側的調試導航欄來觀察當前堆棧,Xcode的調試導航欄還可以觀察到當前的內存、CPU、網絡I/O和磁盤等資源的占用情況,如圖8-6所示。

圖8-6 Xcode的調試導航欄

8.1.2 啟動調試

除了從調試器中啟動調試之外,還有其他的一些開始調試的技巧。可以動態附加到進程中,這意味著當程序在不處于調試狀態下發生錯誤或崩潰時,可以動態附加到進程中進行調試。Visual Studio可以通過選擇“調試”→“附加到進程”命令,然后在彈出的對話框中選擇要附加的進程。Xcode則是通過選擇Debug→Attach to Process命令,再選擇要附加的進程。

在Visual Studio下,還可以利用其多啟動項目特性來同時調試多個項目,在開發多個協同工作的程序時可以用到,如同時調試客戶端和服務端程序。在解決方案的屬性頁面中,可以選擇要啟動的項目,并指定哪些項目是調試啟動,哪些是不調試啟動,如圖8-7所示。

圖8-7 多啟動項目

Xcode并不支持此特性,但可以通過打開多個IDE來同時調試多個項目。

此外Visual Studio還支持強大的遠程調試功能,該功能在后面的高級技巧中會介紹。

8.1.3 條件斷點

當斷點被執行多次時,使用條件斷點可以大大提高調試效率,例如,當在一個for循環中設置了一個斷點,希望在for循環執行到100次的時候觀察循環內部的變量,如果沒有條件斷點,那么就需要在這里中斷100次。

Visual Studio可以在斷點上右擊,在彈出的快捷菜單中選擇條件,然后在彈出的對話框中設置條件,可以設置表達式為條件,也可以設置當表達式的值被修改才命中該斷點,如圖8-8所示。

圖8-8 設置斷點條件

右鍵快捷菜單中的命中次數允許設置指定的次數,當斷點的命中次數達到設定的條件時才命中該斷點,對話框中的“重置”按鈕可以重置當前的命中次數為0,如圖8-9所示。

圖8-9 命中次數

Xcode可以在斷點上右擊,在彈出的快捷菜單中選擇Edit Breakpoint,在彈出的界面中,可以在Condition中設置條件表達式,在Ignore中設置命中次數,如圖8-10所示。

圖8-10 Xcode的斷點編輯菜單

8.1.4 監視技巧

通過監視窗口可以很方便地觀察當前堆棧中變量的情況,在Visual Studio中,有4個監視窗口,通過選擇“調試”→“窗口”→“監視”命令,或按Ctrl+Alt+W快捷鍵,再輸入監視窗口的編號(1~4)可以切換它們。Visual Studio還提供了自動窗口來自動顯示當前有效的變量信息,以及局部變量窗口來自動顯示當前函數中的局部變量信息。在Xcode中則是整合為一個監視窗口,位于IDE的下方。

1.添加監視

在Visual Studio中可以在變量或變量的懸浮信息框上右擊,在彈出的快捷菜單中選擇“添加監視”命令,如圖8-11所示,也可以直接在監視窗口中輸入表達式。而在Xcode中只能在監視窗口輸入表達式。

圖8-11 添加監視

2.特殊監視

圖8-12演示了如何輸入表達式來添加監視,除了監視變量,還可以監視地址,例如,我們new了一個對象,即使當前函數中無法訪問該對象,也可以監視這個對象,這對于觀察指定對象的變化非常有用,通過監視,可以觀察對象是否被修改了,如圖8-12所示。

圖8-12 監視地址

通過輸入Director::getInstance()方法、director變量,以及地址強制轉換為指針,都可以觀察到指定的變量,如圖8-13所示。只不過調用方法會有一些副作用,因為方法會被執行,這可能導致程序出現意料之外的問題,直接監視局部變量director則只會在該函數內生效,只有監視地址的方式才會一直生效。

圖8-13 監視函數返回值

Xcode可以在監視窗口上右鍵選擇Add Expression來添加要監視的表達式,如圖8-14所示。

圖8-14 Xcode添加監視

3.Visual Studio內置變量

除了可以輸入普通的表達式以外,Visual Studio還提供了很多內置變量以供監視,如下所示。

? $tid:當前線程的線程ID。

? $pid:進程ID。

? $cmdline:啟動程序的命令行字符串。

? $user:正在運行程序的用戶。

? $err:顯示最后一個錯誤的錯誤碼。

? $err, hr:顯示最后一個錯誤的錯誤信息。

更多的內置變量可以參考https://msdn.microsoft.com/en-us/library/ms164891.aspx

主站蜘蛛池模板: 双牌县| 平顶山市| 民乐县| 称多县| 新晃| 邯郸县| 托克逊县| 十堰市| 合川市| 金塔县| 邢台市| 鄢陵县| 融水| 石柱| 册亨县| 裕民县| 壶关县| 武宣县| 瑞金市| 通化县| 临澧县| 友谊县| 全椒县| 鹤庆县| 海门市| 沙雅县| 遂溪县| 永平县| 上高县| 拉萨市| 姜堰市| 云龙县| 青河县| 隆化县| 龙口市| 丁青县| 山阳县| 京山县| 高青县| 兴化市| 井陉县|