程式除錯的時候利用Call Stack視窗檢視函式呼叫資訊
http://blog.csdn.net/augusdi/article/details/6407422
http://blog.csdn.net/zhg598242449/article/details/7591123
首先介紹一下什麼叫呼叫堆疊:假設我們有幾個函式,分別是function1,function2,function3,funtion4,且function1呼叫function2,function2呼叫function3,function3呼叫function4。在function4執行過程中,我們可以從執行緒當前堆疊中瞭解到呼叫他的那幾個函式分別是誰。把函式的順序關係看,function4、function3、function2、function1呈現出一種“堆疊”的特徵,最後被呼叫的函數出現在最上方。因此稱呼這種關係為呼叫堆疊(call
stack)。
當故障發生時,如果程式被中斷,我們基本上只可以看到最後出錯的函式。利用call stack,我們可以知道當出錯函式被誰呼叫的時候出錯。這樣一層層的看上去,有時可以猜測出錯誤的原因。常見的這種中斷時ASSERT巨集導致的中斷。
在程式被中斷時,debug工具條的右側倒數第二個按鈕一般是call stack按鈕,這個按鈕被按下後,你就可以看到當前的呼叫堆疊。
另外程式出錯時你可以根據call stack的內容之後是哪個函式調用出錯了。程式出現錯誤中斷時,從呼叫堆疊上面往下看,雙擊第一個你自己的函式就可以跳轉到出錯的地方。
利用Call Stack視窗檢視函式呼叫資訊
Call Stack視窗能夠檢視當前方法的呼叫資訊。例如方法的引數資訊,呼叫當前方法的引數等。例項實現的是在按鈕的單擊事件方法內,呼叫自定義方法,在Call Stack視窗內可以顯示呼叫的過程,如圖1.75所示。
圖1.75 利用Call Stack視窗檢視函式呼叫資訊 |
Call Stack視窗在除錯期,通過選擇View→Debug Windows→Call Stack命令開啟,預設情況下編譯器是不會開啟該視窗的。在該視窗可以檢視函式呼叫的層次結構,這樣可以輔助開發人員分析程式碼,瞭解程式碼的層次結構。
(1)建立基於對話方塊的應用程式。
(2)在標頭檔案DebugProgramDlg.h中新增OutputResult方法。
(3)OutputResult方法的實現程式碼如下:
- void CDebugProgramDlg::OutputResult()
- {
- CString strResult;
- int iResult=0;
- //新增程式碼開始
- char *str = new char[100]; //定義字串變數
- strcpy(str,"Hello World!"); //給字串賦值
- int s,a,b; //定義整型變數
- a = 5; //賦初值
- b = 10;
- s = a + b; //求和
- strResult.Format("%s/r/n%d",str,s);
- GetDlgItem(IDC_ED_RESULT)->SetWindowText(strResult);
- }
(4)在OutputResult方法內設定一處斷點,按F5鍵進入除錯狀態,執行View→Debug Windows→Call Stack命令開啟Call Stack視窗進行檢視。
心法領悟027:Call Stack視窗的使用技巧。
Call Stack視窗只能進行檢視操作,不能進行任何修改操作,但該視窗配合F11鍵特別有用。當開發人員在除錯時按F11鍵時,Call Stack視窗的內容就會發生改變,注意F11鍵一定要在函式呼叫語句前按下。