en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

11.25.2011

關於 Xcode 中使用中斷點除錯的一些基本技巧

只要是程式通常都會有 Bug,有些 Bug 可以透過編譯器很快的被發現,像是一些型態或是程式語法上的錯誤等等,而有些 Bug 必須等到特定的時機才會發生,像是進行程式上的整合或是特殊的輸入與操作等等。當有 Bug 產生時不外乎就是使用中斷點 Breakpoint 來進行 Debug 的動作,程式會在執行到設有中斷點的程式碼處時停止,我們就可以藉機觀察當前的程式執行狀態。

以下是一個簡單的範例程式,其中 i 從 0 執行到 50 的 for 迴圈,當 i 可以被 50 整除時,就在 Console 中印出 i 的數值,而當 i 恰巧等於 44 時,就將變數 x 設成 10。

int x = 0;

for (int i=0; i<=50; i++) {
    if ((i%5) == 0) {
        NSLog(@"%d", i);
    }

    if (i == 44) {
        x = 10;
    }
}

如果我們想要為這段程式碼建立中斷點除錯,只要在該行程式碼的行號上點下滑鼠左鍵,就可以為其建立中斷點,方便觀察程式目前的執行狀態,如下圖。


上圖是程式暫停在第一個中斷點的結果,可以在 Debugger 中觀察程式內的相關變數運作情況,在按下 Debugger 中的繼續時,程式就會執行至下一個中斷點,這種方法來除錯很直覺,也很簡單,但是卻很瑣碎,試想當你的中斷點如果設定在 for 迴圈之中(如上圖所設立的第二個中斷點),而它又恰巧會在執行到第 49 次才出錯,那你可能就會為了按下那 48 次的「繼續」而感到厭煩,遇到這種情況我們就可以給中斷點加些規則,好讓程式可以真正停在我們想要的地方。

設定中斷點規則的方法也很容易,只要在中斷點上按下滑鼠右件並選擇 Edit Breakpoint 即可,如下圖。


上圖中我們設定忽略中斷點的前 49 次中斷,意思就是當此中斷點發生第 50 次時,程式才會真正停止並且發出一個警告聲音,如果你不確定你的程式到底會執行幾次,你也可以透過設定 Condition 的方式來控制你的中斷點,不過 Condition 最好不要包括太複雜的邏輯,帶來不必要的困擾。


在設定完 Breakpoint 規則之後,第二個中斷點也的確讓程式暫停在我們想要的地方。


在設定中斷點規則時除了使用提示聲來警告,也可以設定在 Console 中顯示相關的訊息,為什麼要特別提這項功能,因為通常新手在撰寫程式時為了保險起見,都會在程式中寫上 NSLog 印出某參數或是字串來確認自己實做的功能是否正確,這其實是個很不妥當的做法,不但程式碼看起來很混亂,而且當程式發佈時若是沒有清掉這些註解,很有可能會影響程式執行的效能,一個比較好的做法是設定一個可以被自動跳過的程式中斷點,例如我們想要判斷上述程式碼在 i 等於 44 時,x 是否有被設定為 10,只要在本來要寫上 NSLog 的地方設定一個中斷點,並做以下設定,如下圖,同樣也可以做出類似於使用 NSLog 註記的效果。



另一個類似上述的做法可以使用 assert 指令,當程式的當前的狀態與 assert 的敘述不相符時,程式也會隨即中斷。另一方面當很多隻程式做整合時,可以使用 assert 指令在函式的開始處,來確保函式所輸入的參數都是在正確的範圍之內,藉此來釐清問題的所在,尤其是你已經為所寫的程式碼做足了單元測試的時候。

最後要介紹的一個技巧是變數監視 watchpoint 的功能,它的作用是在當監視的變數值發生改變時,程式就會暫停執行,設定的方法是在 Debugger 對想要觀察的變數按下滑鼠右件並選擇 Watch 即可。下圖是在程式宣告 int x = 0; 處設下中斷點,並且在 Debugger 中設定監視變數 x 的情形。


下圖是當完成 x 變數監視的設定之後繼續執行程式的結果,可以發現程式暫停的位置剛好是 x 變數值被改變的當下,註解處也提示 x 由數值 0 變成數值 10。


ps:有關文章中所提及的「單元測試」,可以參考單元測試 Unit Test 簡單設置一文。






1 則留言:

  1. Using IOS one can able to build views. user can handle user interaction via controls such as buttons, switches, and sliders etc. user can create alert boxes, handle navigation and transition between views. follow iOS Swift Online Course India

    回覆刪除