調試技巧之調用堆棧


1.  調用堆棧理解

首先介紹一下什么叫調用堆棧:假設我們有幾個函數,分別是function1,function2,function3,funtion4,且function1調用function2,function2調用function3,function3調用function4。在function4運行過程中,我們可以從線程當前堆棧中了解到調用他的那幾個函數分別是誰。把函數的順序關系看,function4、function3、function2、function1呈現出一種“堆棧”的特征,最后被調用的函數出現在最上方。因此稱呼這種關系為調用堆棧(call stack)。

2.  作用

  • 調用堆棧”窗口可以查看當前堆棧上的函數或過程調用。
  • “調用堆棧”窗口顯示每個函數的名稱和編寫它所用的編程語言。函數或過程名可能伴隨有可選信息,如模塊名、行號、字節偏移量以及參數的名稱、類型和值。 可以打開或關閉這些可選信息的顯示。
  • 一個黃色箭頭標識執行指針當前所位於的堆棧幀。 默認情況下,該幀的信息顯示在源、“反匯編”、“局部變量”、“監視”和“自動”窗口中。 如果想將上下文更改為堆棧上的另一個幀,可以在“調用堆棧”窗口中執行相應的操作。
  • 當調試符號對部分調用堆棧不可用時,“調用堆棧”窗口也許就不能顯示那部分堆棧的正確信息。

 

常用的場景:

當故障發生時,如果程序被中斷,我們基本上只可以看到最后出錯的函數

利用call stack,我們可以知道當出錯函數被誰調用的時候出錯。這樣一層層的看上去,有時可以猜測出錯誤的原因。

在程序被中斷時,debug工具條的右側倒數第二個按鈕一般是call stack按鈕,這個按鈕被按下后,你就可以看到當前的調用堆棧。

 

3. 實例之堆棧演示

首先我們創建一個工程添加如下代碼:        代碼中test_c()函數被test_b()函數調用,test_b()被test_a()調用

 
         

#include <iostream>
using namespace std;

 
         


int test_c()//在此函數中設置斷點
{
int k=9;
return k;
}

 
         


int test_b()
{
int k=test_c();
return k;
}

 
         

int test_a()
{
int k=test_b();
return k;
}
int main()
{
int k=test_a();
int t=0;
getchar();

 
         

return 0;
}

 

我們按F5開始調試程序。程序運行后,點擊OK按鈕,程序就會被中斷。這時查看call stack窗口如下所示

 

 

圖中,test_c()函數作為整個調用鏈中最后被調用的函數出現在call stack的最上方,緊接着就是test_b()、 test_a()等一些內部函數。

詳細的可以直接看說明手冊(最后一個鏈接)

 

 

參考 :

  • http://blog.sina.cn/dpool/blog/s/blog_65cab32d01015d7d.html
  • https://msdn.microsoft.com/zh-cn/library/a3694ts5(v=vs.90).aspx


免責聲明!

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



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