電子計算機概論 電腦網路與通訊 程式設計 資料庫系統 自動分類與索引
圖書館統計學 索引與摘要 書目計量學 資料結構 引文分析與實務

如何trace code & debug

 

假設有底下這段code,編譯可以通過,沒有語法錯誤,但是我希望最後印出來的答案是9,結果卻印出了7,我想找出到底是哪裡出了錯。如果說用看的無法一眼就看出錯誤在哪裡,那麼就只好一行一行trace。

#include 

int main(void)
{
    int i=2;
    int j=3;
    int k;
    
    k = 1+i*j;
    
    printf( "i = %d \n", i ); 
    printf( "j = %d \n", j ); 
    printf( "k = %d \n", k ); 

    system( "pause" ); 
    return 0;    
} 

首先我們開啟Dev-C++,然後開啟一個新的C source code。將上面的code輸入,存檔。接下來就可以開始編繹了。編譯完成後我們在希望程式停下來的那一行前面黑色區塊點一下,Dev-C++就會將那一行用紅色標起來,並且在前方有個紅色的小圓。這個小圓稱之為breakpoint,中斷點程式如果以除錯模式來執行的話,就會在中斷點的地方停下來。通常我們把中斷點設在懷疑程式開始出錯的地方,如果你不知道要從那一行開始懷疑,也可以從main的第一行就設中斷點。

接下來我們開始執行程式選擇除錯然後就會像平常執行程式一樣,跑出了命令提示字元的視窗,只不過一下子就又跳回Dev-C++的視窗了。我們可以看到原本設中斷點的那一行變成了藍色,代表程式目前跑到這一行暫停了下來,等待你的指示。特別注意的一點,程式停在這一行的意思包含著這一行程式碼還沒有被執行由上圖可以看到,程式停下來時Dev-C++底下會跑出許多按鈕,假設我現在想要知道某些變數的值,我就可以按底下的新增監看式(A)就可以監看某個變數。按下按鈕後會跳出一個對話框問你要監看哪一個變數,輸入變數名稱。例如我現在想監看i這個變數,就輸入i按OK。就可以在左邊看到它顯示出i=2。藉由監看式,我們就可以隨時注意觀察某些變數的值是否符合我們的希望在變動。

我們再將變數j,k加入監看式,可以看到目前i跟j都和前幾行所初始化的值一樣。因為前面的程式碼未將k初始化,所以k的值是一個奇怪的數字(不懂何謂初始化沒有關係,課堂上會教,這裡先不用懂)。接下來我們讓程式執行一行,再來檢查i j k的值。按一下單步執行(N)我們可以看到藍色跑到下一行了,代表目前程式暫停在藍色那一行,而紅色那行剛剛被執行過。同時也可以觀察到k的值改變了,變成了7。所以我們可以得知這一行程式碼運算出來的結果是7而不是9,如果我希望運算出來是9,應該將此行程式碼改成k = (1+i)*j;

底下除錯/監看還有幾個按鈕沒有介紹,但是它們的使用就跟它們的名稱一樣直觀,可以自行嘗試玩玩看。其中的中斷執行按鈕可以讓你直接正在除錯的程式。

Debug是一門藝術,希望這些trace code的方法以及小技巧可以幫助各位debug順利。

 

電子計算機概論 電腦網路與通訊 程式設計 資料庫系統 自動分類與索引
圖書館統計學 索引與摘要 書目計量學 資料結構 引文分析與實務