VC調試篇:ASSERT(FALSE)時怎么辦?查看調用堆棧


問題簡述

我們在調試程序時,經常會遇到程序中斷的情況,就像下圖這樣。

程序調試中斷

我艹,這該怎么辦,我們一下子就懵逼了。我們選擇中斷,常常會跳到一個莫名其妙的地方去。

發生中斷的地方

正是這個斷言 ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL)) 導致中斷的發生,ASSERT中的參數只要是false, 就會發生中斷。而且中斷的地方,基本上都是父類的內部,這就坑爹了,中斷把我們帶到坑里來了?我們怎么樣才能知道,自己寫的代碼哪里出現問題呢?

調試方法

我們知道,C++函數調用是一個壓棧和出棧的過程。應用程序維護這一個函數調用堆棧,就像下圖這樣

C++函數調用堆棧

通過調用堆棧的棧頂開始,一直向下尋找,就能回溯函數的調用過程。

VS2010查看調用堆棧

VS2010在程序出現上述問題出現的調試中斷時,點一下中斷,讓程序跳到中斷處。然后可以

  1. 按鍵盤的 Alt + 7 ,程序會顯示調用堆棧。如下圖

調用堆棧

  1. 或者直接點擊下面的 調用堆棧 也可以顯示該窗口,沒有的話可以在菜單中找到 調試 -> 窗口 -> 調用堆棧 就可以顯示調用堆棧窗口了。

雙擊調用堆棧的某一行,可以定位到此次調用的源代碼或匯編指令處。

總結

  1. VC調試中斷時可以查看調用堆棧定位中斷位置。
  2. 按 Alt + 7 可以查看調用堆棧

參考

  1. http://bbs.csdn.net/topics/390096855


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM