IDE (Integrated Development Environment, 例如 Visual Studio, Borland C++, Dev C++, Turbo C 等等) 環境中 Source Code Debugger (原始程式碼偵錯器) 是一個很好用的工具, 正確使用的情況下你可以很快地能夠看到程式執行時的錯誤,很快地找到你的程式中可能有錯誤的地方,尤其是對於電腦系統工程師來說, 必須和很多別人寫的程式一起工作, 遇見記憶體存取相關的錯誤時這個工具更是不可或缺。
在初學時很多同學也會覺得它可以一列一列顯示程式的動作, 可以讓你了解你自己寫的敘述究竟是如何執行的,對於所學到的新語法能夠更有體會。
不過這個工具對初學者不是沒有缺點的, 有時太依賴這樣的工具來偵錯, 使得製作程式的過程變成
如此的程式變成用 "拼湊" 起來的了, 最常看到的現象是好不容易更正出希望要的答案出來以後, 所使用的語法與邏輯到底是哪裡出錯了, 哪裡和你腦中想像的不太一樣, 卻忘記了...如此辛辛苦苦偵錯完畢, 但是卻常常沒有得到l練習設計的效果。
另外透過 Source Code Debugger 偵錯的過程裡, 常常只需要看到局部的邏輯, 反正可以看到資料的數值, 就可以省掉預測你的程式會如何處理資料的這一個步驟, 你對於程式敘述的掌握能力也就會建立不起來。
所以這也是我們一直沒有急著告訴大家 Source Code Debugger 該如何使用的原因。另一個理由是本來以為大家都很快地會發現 Visual Studio 2005 的偵錯功能, 不過不幸的是 Visual Studio 2005 剛安裝好的時候, 預設的參數其實是沒有辦法偵錯的, 於是很多同學發現選擇 "偵錯 / 開始偵錯" 以後, 程式迅速結束, 根本不會在執行的過程中停下來。
以下我們由最開始簡單介紹 Visual Studio 2005 Source Code Debugger 的基本功能。
對了, 如果你等一下看到你自己的 Visual Studio 的介面和網頁裡顯示的配置不太一樣的話, 請選擇
"工具 / 匯入和匯出設定 /
重設所有的設定 / 否,直接重設設定並複寫目前的設定 / Visual C++ 開發設定"
#pragma warning (disable:4996) // scanf #include <stdio.h> double square(double x); int main() { double data, result; scanf("%lf", &data); result = square(data); printf("The square of %f is %f\n", data, result); return 0; } double square(double x) { double sq; sq = x * x; return sq; }
下載 testSourceDebugger 專案
下載 runtimeError 專案
選擇 "是", 使用 VS 2005 進行偵錯
上圖中只說 "發生存取違規", 基本上是說程式打算寫資料到不允許它存取的記憶體去, 比較討厭的是錯誤 0xC00000005 不曉得是指程式碼的什麼地方, 請按下 "中斷"
選擇 "呼叫堆疊" 視窗, 看到程式在 main() 函式第 13 列呼叫 square() 函式, square() 函式在第 23 列呼叫 scanf() 此時發生記憶體的錯誤, 以滑鼠左鍵點選 square() 那一列, 如下圖, Visual Studio 就顯示第 23 列的地方, 果然是呼叫 scanf(), .... 看出哪裡有錯了嗎?
看到這一系列的函式呼叫, 你也許會懷疑錯誤明明就發生在 _fassign_l() 這個函式裡面, 點一下那一列就看到一個根本不是你寫的函式, .... 所以 "函式庫有錯, 微軟好爛...."
不能這樣說, 當 scanf 要求你在用它的時候要給它變數對應的記憶體位址, 如果你不聽話, 那它當然死給你看...
!---------------------------------------------------------------->