整合程式開發環境 (Integrated Development Environment, IDE, 例如 Visual Studio, Borland C++, Dev C++, Turbo C 等等) 環境中原始程式碼除錯器 (Source Code Debugger) 是一個很好用的工具, 正確使用的情況下你可以很快地能夠看到程式執行時的錯誤,很快地找到你的程式中可能有錯誤的地方,尤其是對於電腦系統工程師來說, 必須和很多別人寫的程式一起工作, 遇見記憶體存取相關的錯誤時這個工具更是不可或缺。
在初學時很多同學也會覺得它一列一列顯示程式的動作, 可以讓你了解你自己寫的敘述究竟CPU是如何執行的,對於所學到的新語法能夠更有體會。
不過這個工具對初學者不是沒有缺點的, 有時太依賴這樣的工具來偵錯, 使得製作程式的過程變成
如此的程式變成用 "拼湊" 起來的了, 最常看到的現象是好不容易更正出希望要的答案出來以後, "所使用的語法與邏輯到底是哪裡出錯了, 哪些語法和你腦中認知的不太一樣" 卻忘記了...如此辛辛苦苦除錯完畢, 但是卻常常沒有得到l練習設計的效果。
另外透過除錯器偵錯的過程裡, 常常只需要看到局部的邏輯, 反正可以直接看到資料的數值, 就可以省掉預測你的程式會如何處理資料的這一個步驟, 你對於程式敘述的掌握能力也就會建立不起來。
所以這也是我們一直沒有急著告訴大家原始程式碼除錯器該如何使用的原因。
以下我們由最開始簡單介紹 dev C++ 4.9.9.2 原始程式碼除錯器的基本功能。
dev C++ 4.9.9.2 的除錯器是基於 GNU gdb 作出來的免費軟體, 在功能上其實比起商用的軟體, 例如 M$ 的 Visual Studio, 有一些差距, 不要太苛求。
另外當 dev C++ 執行程式遇見程式的記憶體存取錯誤 (segmentation fault) 時, 就出現下面的視窗
作業系統希望執行 Just-in-Time 原始碼除錯, 但是目前只有 Visual Studio 2008 的選項, 你可以由 Visual Studio / 工具 / 選項 / 偵錯 / Just-in-Time 把所有的都取消, 但是 dev c++ 好像沒有提供 Just-in-Time 偵錯, 所以你還是得關掉視窗, 只知道程式執行時發生嚴重的記憶體存取錯誤, 卻不知道是執行哪一段程式時發生的。如果你用 Visual Studio 的話, 就可以很快地在 JIT 除錯器中看到程式執行到哪裡發生這個錯誤了
這裡我們盡量簡化, 如果你新增一個專案, 然後在裡面加入新的原始碼也是可以的
#include <stdio.h> #include <stdlib.h> double square(double x); int main(void) { double data, result; int i; printf("請輸入正方形的邊長:"); scanf("%lf", &data); result = square(data); printf("邊長 %f 的正方形, 面積是 %f\n", data, result); for (i=0; i<5; i++) { result = result / 2; printf("%d %f\n", i, result); } system("pause"); return 0; } double square(double x) { double sq; sq = x * x; return sq; }上面這個程式有用到自己定義的函式 square() 還有迴圈 for ..., 雖然在課堂裡都還沒有講到, 但是這裡你有編譯器還有除錯器, 等一下藉由除錯器一步一步的動作, 你應該可以很快看出來它們在程式裡的作用, 以下我們先編譯執行一下程式 :
原始程式碼除錯器最主要兩個功能是
我們以剛才這個 testDebug.c 程式為例
或是在工具列上按除錯按鈕
最簡單的方法是把滑鼠移到想要看的變數上方, 例如下圖中的 data, 稍微等後一下, 左邊視窗裡就會出現 data = ... 的顯示, 由於 scanf 函數還沒有執行, 所以 data 變數裡的資料是先前執行其他程式時記憶體裡殘存的數值, 對這個程式而言沒有太大意義
i < 5 是迴圈執行時測試是否要繼續的條件敘述, 當你輸入為監看式的時候, 除錯器根據程式執行時變數 i 的數值來計算 i < 5 的數值, 目前 i 是 20 (其它程式執行後殘留在記憶體裡的數值), 計算的結果 i 並不小於 5, 所以數值為 0 (代表邏輯敘述為偽), 如果小於 5 的話, 數值為 1(代表邏輯敘述為真)