問題簡述
我們在調試程序時,經常會遇到程序中斷的情況,就像下圖這樣。
我艹,這該怎么辦,我們一下子就懵逼了。我們選擇中斷,常常會跳到一個莫名其妙的地方去。
正是這個斷言 ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL)) 導致中斷的發生,ASSERT中的參數只要是false, 就會發生中斷。而且中斷的地方,基本上都是父類的內部,這就坑爹了,中斷把我們帶到坑里來了?我們怎么樣才能知道,自己寫的代碼哪里出現問題呢?
調試方法
我們知道,C++函數調用是一個壓棧和出棧的過程。應用程序維護這一個函數調用堆棧,就像下圖這樣
通過調用堆棧的棧頂開始,一直向下尋找,就能回溯函數的調用過程。
VS2010查看調用堆棧
VS2010在程序出現上述問題出現的調試中斷時,點一下中斷,讓程序跳到中斷處。然后可以
- 按鍵盤的 Alt + 7 ,程序會顯示調用堆棧。如下圖
- 或者直接點擊下面的 調用堆棧 也可以顯示該窗口,沒有的話可以在菜單中找到 調試 -> 窗口 -> 調用堆棧 就可以顯示調用堆棧窗口了。
雙擊調用堆棧的某一行,可以定位到此次調用的源代碼或匯編指令處。
總結
- VC調試中斷時可以查看調用堆棧定位中斷位置。
- 按 Alt + 7 可以查看調用堆棧