2011-05-24 198 views
3

我遇到了堆棧溢出的問題,並希望看到堆棧中的內容是什麼。檢查堆棧

How can I examine the stack frame with GDB?是一種相同的問題,但info locals看起來很好(很少變量,其中大多數std :: vectors和std :: maps),所以我不希望堆棧溢出。此外,我已經將堆棧限制設置爲32MB,所以這應該足夠多,並且不使用遞歸函數。

是否有一個工具可以顯示堆棧的完整內容,可能按大小排序?

+1

這聽起來像你實際上沒有堆棧溢出。你認爲你做了什麼? – 2011-05-24 21:24:45

+0

@Neil:請看看我的相關問題:http://stackoverflow.com/questions/6084901/stackoverflow-and-function-pointers。增加堆棧大小有助於確實,但並不能真正解決問題的根源 – bbtrb 2011-05-25 00:27:43

回答

5

堆棧溢出更容易被特殊分析器捕獲,而不是手動查看gdb中的變量。更有可能你有緩衝區溢出而不是堆棧溢出。在這兩種情況下,這裏是一些廓線儀,可以幫助你指出問題的列表:

祝你好運!

+0

喜歡在該列表中添加「電子圍欄」http://en.wikipedia.org/wiki/Electric_Fence – 2011-05-24 22:02:06

+0

@Fredrik:已添加。謝謝。 – 2011-05-24 23:28:51

+0

謝謝,我會看看這些... – bbtrb 2011-05-25 00:28:14

0

您可以使用backtrace命令檢查當前堆棧幀。

1

即使您沒有自稱的功能,也可能創建了兩個或多個函數爲相互爲遞歸的情況。

一個好的起點是不用檢查當前的堆棧幀,而是使用「backtrace」(或簡稱爲「bt」)命令檢查堆棧幀列表。如果你看到兩個或多個函數互相調用的重複模式,那麼你就有了相互遞歸。

+0

謝謝你的提示,但不幸的是我沒有看到這樣的事情... – bbtrb 2011-05-25 00:28:55

0

您還可以在gdb中獲取當前堆棧指針(例如,通過運行'info registers'),然後使用examine(或'x')命令在該位置周圍轉儲內存。請注意堆棧指針指向下方的堆棧,因此您需要從堆棧指針-N開始轉儲以查看堆棧中的前N個字節。