如何運用 debugger 了解程式錯誤的位置

在這一次實習裡, 很多同學遇見下圖這樣的錯誤, 第一個反應就是, dbgdel.cpp 是什麼東西啊? 又不是我寫的, 怎麼會錯了呢? 那錯誤應該和我沒有關係吧... 也許老師原來給的程式有錯...

其實像這樣的錯誤常常會發生, 我們寫一個程式的時候常常需要用到系統提供的一些函式, 例如 new, delete 這些記憶體的處理函式, 或是 vector, string 這類的工具, 或是 cin >> , cout <<, getline 等等 io 的工具,當這些函式裡出現錯誤時常常就會在一個你不認得的檔案裡...

那麼我們怎麼在最短的時間裡找到到底是我們程式裡哪一列的使用造成這樣的錯誤呢?

關鍵就在運用 debugger, 在下圖中按下 "重試" 來開啟 debugger (有時候會跳過這一個畫面)

接下來會看到下列畫面, 按下 "除錯"

然後會看到如下的選擇偵錯工具畫面:

然後會看到如下的存取違規錯誤畫面:

按下繼續後 (有時需要按中斷) 此時你會看到下列偵錯畫面

此時可以看到上圖中 callstack 視窗裡出現系統呼叫堆疊的內容, 代表目前執行到 3bags4.exe!main() 函式, 在 main.cpp 第 34 列處呼叫 3bags4.exe!Game::~Game() 解構元函式, 然後在 Game.cpp 的第 17 列處 Game::~Game() 函式呼叫 bag.cpp 的第 17 列處3bags4.exe!Bag::~Bag() 解構元函式, 並且執行到 ball.cpp 的第 10 列 3bags4.exe!Ball::isRed() 函式內發生上述存取違規錯誤, 不過 isRed() 函式內看不出來有什麼錯, 也許發生在呼叫這個函式的地方

在上圖中 3bags4.exe!Bag::~Bag() 那一列上點兩下就可以看到 Bag.cpp 中的第 17 列, 也就是 m_balls[0]->isRed(); 這個敘述, debugger 很快地告訴你, 你的程式執行到這裡發生錯誤了, 你可以專心地分析一下自己程式的邏輯, 看看為什麼會錯, 不需要盲目地去找錯誤或是向別人求助。

 

C++ 物件導向程式設計課程 首頁

製作日期: 04/12/2011 by 丁培毅 (Pei-yih Ting)
E-mail: pyting@mail.ntou.edu.tw TEL: 02 24622192x6615
海洋大學 電機資訊學院 資訊工程學系 Lagoon