2013-09-27 29 views
3

我遇到了一個核心,無法從中獲得回溯。我有兩個問題。如何使用gdb在無法確定堆棧大小的情況下進行回溯?

  1. 我可以從 list命令輸出中找到導致崩潰或發生崩潰的行嗎?
  2. 如何處理它否則。我應該設置啓發式fence-post來獲得一些有意義的數據。我試圖將其設置爲0,但沒有運氣。

(GDB)BT

0 0x00e67a24 ?? ()

警告:GDB無法在0xe67a24處找到該函數的開頭。

GDB is unable to find the start of the function at 0xe67a24 

因此無法確定該函數的堆棧幀的大小。 這意味着GDB可能無法訪問該堆棧幀或其下面的幀。 此問題很可能是由無效的程序計數器或 堆棧指針引起的。 但是,如果您認爲GDB應該從0xe67a24開始搜索更遠的 以查找類似於 函數開頭的代碼,則可以使用`set heuristic-fence-post'命令來增加搜索範圍。 (GDB)

+0

你能得到註冊信息嗎? –

+0

@kumar_m_kiran,是的,我可以得到註冊信息。 –

回答

7

,當我看到這個問題的命令,往往工作的一種解決方法:

X/100A $ SP

這將轉儲與符號棧和很可能是在最近的回溯部分將會在那裏。它仍然不會找到實際的當前堆棧幀,但應該找到最新的符號。

根據目標體系結構,$ sp可能需要其他東西 - 無論寄存器是堆棧指針。

我看到gdb無法找到調用堆棧的最常見情況是在OpenGL驅動程序中發生崩潰,該驅動程序不使用預期的ARM ABI調用約定。

相關問題