1. 程式人生 > >程式除錯的時候利用Call Stack視窗檢視函式呼叫資訊

程式除錯的時候利用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方法的實現程式碼如下:

  1. void CDebugProgramDlg::OutputResult()  
  2. {  
  3. CString strResult;  
  4. int iResult=0;  
  5. //新增程式碼開始  
  6. char *str = new char[100];                  //定義字串變數  
  7. strcpy(str,"Hello World!");                 //給字串賦值  
  8. int s,a,b;                          //定義整型變數  
  9. a = 5;                              //賦初值  
  10. b = 10;  
  11. s = a + b;                          //求和  
  12. strResult.Format("%s/r/n%d",str,s);  
  13. GetDlgItem(IDC_ED_RESULT)->SetWindowText(strResult);  
  14. }  

(4)在OutputResult方法內設定一處斷點,按F5鍵進入除錯狀態,執行View→Debug Windows→Call Stack命令開啟Call Stack視窗進行檢視。

心法領悟027:Call Stack視窗的使用技巧。

Call Stack視窗只能進行檢視操作,不能進行任何修改操作,但該視窗配合F11鍵特別有用。當開發人員在除錯時按F11鍵時,Call Stack視窗的內容就會發生改變,注意F11鍵一定要在函式呼叫語句前按下。