2012-07-26 57 views
3

有沒有辦法在Visual Studio中監視調用堆棧的大小?調用堆棧窗口在運行時提供,但不顯示堆棧的大小。我正在使用C++並面臨堆棧溢出問題。我知道我正在使用的一些遞歸函數可能是錯誤的,但在解決這些問題之前,我想監視調用堆棧大小以查看發生了什麼。在Visual Studio中監視調用堆棧大小

回答

4

使用數據斷點在這裏可能會有幫助。無論您身在何處,只要您在正確的線程上,都可以使用Debug + New Breakpoint + New Data Breakpoint。地址欄中輸入@esp - 250000。按F5繼續運行,當可用堆棧空間消耗了四分之一時,它將在遞歸內部的某處斷開。來自esp的確切偏差並不重要。

+0

@esp - 250000它總是保證四分之一的可用堆棧空間的消耗是多少?我的意思是我的設置可能有不同的堆棧大小。那麼,我的結局也會一樣嗎?有沒有地方可以查看這些信息? – Pavan 2013-11-17 05:58:45

+0

在64位機器上,該寄存器被稱爲'rsp'。 – 2015-03-07 02:17:11

4

有幾種方法:

  1. 檢查ESP在監視窗口。您可以在觀察窗口觀看@esp。比較一下ESP在這個過程的開始。
  2. 同樣,檢查第一個/最後一個堆棧幀中堆棧分配變量的地址。

請注意,堆棧通常是向後分配的,所以隨着堆棧的增長,ESP越來越小。

+0

請注意,對於Windows,這似乎不起作用(請參閱:http://stackoverflow.com/questions/7490095/getting-the-size-of-the-callstack) – 2012-12-13 15:45:21

0

「Microsoft推薦的本機規則」代碼分析可以查看您的代碼,並查找可能會使您的堆棧溢出的代碼問題。我不確定找到遞歸問題有多好,但是它在我的代碼中發現了一個問題,我使用了一個非常大的類(1MB)的本地實例。在運行時,唯一的錯誤是堆棧溢出。當然,在棧上使用大對象是一個壞主意;你應該只使用小物件和物品,將大部分髒衣物存放在堆上。

在VS2012,該項目右鍵單擊屬性,並選擇代碼分析,然後點擊複選框啓用代碼分析。運行需要幾分鐘的時間。

相關問題