這篇講的是要怎麼使用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 的值
不過程式總是跑出莫名其妙的結果,怎麼辦呢?
看半天好像看不出錯誤,那就祭出 debugger 吧!
debugger 簡單來說,提供了功能會有:
1. 可讓程式執行到一半暫停,並觀察當時的變數
2. 可以一步一步的執行程式,以尋找可能的錯誤
這麼講起來很抽象,那我們就來看看這隻程式吧。
首先,我希望程式執行到 s = sum(num); 這行的時候可以停下來
這個時候,我們需要插入一個「break point」,中文叫做「中斷點」
插完中斷點之後,仍然執行程式
但這次要用的並不是「Build and Run」,而要選另一個
接下來,神奇的事情發生了
程式不是一口氣跑出結果,而停下來了
程式停下來,好像沒什麼用
但是我們可以開始檢查,譬如說 num 這個變數,現在的值真的是 10 嗎?
首先,要先弄出一個叫做「Watches」的視窗
別忘了我們是為了看看 num 的值,才把這個視窗弄出來的
那麼 num 的值到底要怎麼看呢?
在 Edit Watch 視窗出現後
現在,我們就可以在 Watches 裡看到 num 目前的值了
可以看到值跟我們輸入的 10 是一致的,並沒有問題
暫時看不出問題在哪裡,不管了,先繼續執行下一行程式吧
如下圖
可以看到黃色三角形往下移動了,代表程式已經跑完 s = sum(num); 這行
這個時候在 Watches 裡加入 s,檢查看看 s 的數值對不對
既然抓到嫌疑犯應該是 sum 函式,那我們重新再跑一次吧
這次的目標是看看 sum 裡面的每一步是怎麼運作的
重新開始,輸入 10,這次仍然會停在 s = sum(num); 中斷點的地方
這次我們不按 F7 往下,而是改用 Step into
可以發現,三角形跑到 sum 函式裡了
現在就可以在 Watches 裡,觀看 i, sum 區域變數的值
可以發現,在迴圈執行之前, sum 已經是個垃圾數值了
既然這樣,那在迴圈之前,我們先把 sum 初始為 0
是不是就能解決這個問題呢?
改完之後,可以再確認一下:
其實所謂的 debugger 大概就是這樣
1. 先鎖定程式最有可能造成問題的地方
2. 一步一步的運用 Watches 與 Step into/ Next Line 找出問題所在
當然這篇文章能講的東西並不夠,詳情就要請讀者自行摸索囉