close

這篇講的是要怎麼使用Code::Blocks的debugger功能

如果你還沒用過C::B,可以先看這篇《Code::Blocks入門

今天要抓蟲的程式是這隻:

#include <stdio.h>

int sum(int num)
{
    int i, sum;
    for (i = 0; i <= num; i++)
        sum += i;
    return sum;
}

int main()
{
    int i, num, s;
    printf("Input a number : ");
    scanf("%d", &num);
    s = sum(num);
    printf("The sum is %d\n", s);
    return 0;
}


讓使用者輸入一個數字,然後計算 1 + 2 + ... + sum 的值

不過程式總是跑出莫名其妙的結果,怎麼辦呢?

cb1.jpg 


看半天好像看不出錯誤,那就祭出 debugger 吧!

debugger 簡單來說,提供了功能會有:

1. 可讓程式執行到一半暫停,並觀察當時的變數

2. 可以一步一步的執行程式,以尋找可能的錯誤


這麼講起來很抽象,那我們就來看看這隻程式吧。

首先,我希望程式執行到 s = sum(num); 這行的時候可以停下來

這個時候,我們需要插入一個「break point」,中文叫做「中斷點」

cb2.jpg 


插完中斷點之後,仍然執行程式

但這次要用的並不是「Build and Run」,而要選另一個

cb3.jpg 


接下來,神奇的事情發生了

程式不是一口氣跑出結果,而停下來了

cb4.jpg  


程式停下來,好像沒什麼用

但是我們可以開始檢查,譬如說 num 這個變數,現在的值真的是 10 嗎?

首先,要先弄出一個叫做「Watches」的視窗

cb5.jpg 


別忘了我們是為了看看 num 的值,才把這個視窗弄出來的

那麼 num 的值到底要怎麼看呢?

cb6.jpg 


在 Edit Watch 視窗出現後

cb7.jpg


現在,我們就可以在 Watches 裡看到 num 目前的值了

可以看到值跟我們輸入的 10 是一致的,並沒有問題

cb8.jpg


暫時看不出問題在哪裡,不管了,先繼續執行下一行程式吧

如下圖

cb9.jpg


可以看到黃色三角形往下移動了,代表程式已經跑完 s = sum(num); 這行

這個時候在 Watches 裡加入 s,檢查看看 s 的數值對不對

cb10.jpg


既然抓到嫌疑犯應該是 sum 函式,那我們重新再跑一次吧

這次的目標是看看 sum 裡面的每一步是怎麼運作的

cb11.jpg


重新開始,輸入 10,這次仍然會停在 s = sum(num); 中斷點的地方

這次我們不按 F7 往下,而是改用 Step into

 cb12.jpg 


可以發現,三角形跑到 sum 函式裡了

現在就可以在 Watches 裡,觀看 i, sum 區域變數的值

可以發現,在迴圈執行之前, sum 已經是個垃圾數值了

cb13.jpg


既然這樣,那在迴圈之前,我們先把 sum 初始為 0

是不是就能解決這個問題呢?

改完之後,可以再確認一下:

cb14.jpg 

 

其實所謂的 debugger 大概就是這樣

1. 先鎖定程式最有可能造成問題的地方

2. 一步一步的運用 Watches 與 Step into/ Next Line 找出問題所在

 

當然這篇文章能講的東西並不夠,詳情就要請讀者自行摸索囉

arrow
arrow
    全站熱搜

    james803 發表在 痞客邦 留言(2) 人氣()