- 精通Cocos2d-x游戲開發(進階卷)
- 王永寶
- 2108字
- 2020-11-28 22:37:04
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。