2011-04-16 26 views
12

我正在調試由於無限遞歸導致的堆棧溢出。當堆棧調用700次深度時,程序失敗。如何根據gdb中的函數名稱跳轉到堆棧跟蹤中的幀?

我想跳轉到最初調用函數的框架。但是,gdb向我展示了堆棧頂部的堆棧跟蹤,每次大約有20個條目,我想知道如果不查看堆棧跟蹤以找到其號碼,我是否可以直接跳到調用函數。

爲此,我希望能夠根據名稱而不是號碼跳轉到堆棧幀。

這可以在gdb中完成嗎?

回答

13

兩個選項:

  • up 200會爲你帶來了200幅
  • 如果您知道遞歸過程的初始調用者,你可以做f[rame] <caller-func> - 這將跳轉到地址caller-func的框架。

參見手冊中的Frame Selection

13

您必須使用bt並減號。它與bt類似,但首先打印最外面的n個幀。
例如:
bt -100

,很可能你會發現你需要在第一或第二屏幕上檢查框。
一旦使用bt -100檢測到堆棧跟蹤,就可以幫助我輕鬆地修復具有大量遞歸調用的問題。

,然後發出命令
f <here the number of your frame you need to inspect>

+0

太棒了。一直在尋找一種方法來做到這一點。令人困惑的是,「框架」不支持這種表示法,但「bt」的確如此。 – Marenz 2014-01-31 17:09:49