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