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

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

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

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

關鍵就在運用 debugger, 在下圖中按下 "重試" 來開啟 debugger

接下來會看到下列畫面, 按下 "取消"

然後會看到如下的偵錯畫面:

此時你會看到 dbggel.cpp 檔案的內容, 當然你不需要去了解這個函式, 你可以用滑鼠右鍵點選工具列空白的地方, 看到下列的選單, 選取 callstack (呼叫堆疊)

此時可以如下圖般看到 callstack 視窗裡出現系統呼叫堆疊的內容, 下圖代表目前執行到 main() 函式, 在 main.cpp 第 34 列處呼叫 Game::~Game() 解構元函式, 然後在 Game.cpp 的第 18 列處 Game::~Game() 函式呼叫 bag.cpp Bag::~Bag() 解構元函式, 並且執行到 bag.cpp 的第 16 列, 呼叫 delete

在下圖中 Bag::~Bag() 那一列上點兩下就可以看到 Bag.cpp 中的第 16 列, 也就是 delete m_balls[1]; 這個敘述, debugger 很快地告訴你, 你的程式執行到這裡發生錯誤了, 你可以專心地分析一下自己程式的邏輯, 看看為什麼會錯, 不要盲目地去找錯誤。

 

C++ 程式設計課程 首頁

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