2017-01-25 88 views
1

由於堆棧轉向較小的addesses,使用gdb對它進行檢查對我來說很費力。到目前爲止我使用在gdb中檢查堆棧的正確方法是什麼?

x/64xw 0xffffd0e8-64*4 

如果我想看以下它在堆棧上位於0xffffd0e8(堆棧上)的值以及值(在這種情況下一個32位機器上的以下64個字)。

有沒有更簡單的方法?

此外,有沒有什麼辦法可以自動標記棧與相應的變量名稱上的內容?或者每行只顯示一個字,而不是四個?

+1

請考慮使用'x/64xw $ esp'來代替。 – Jester

+0

我知道。但有時我想檢查當前幀,它不在棧頂。 –

+0

定義一個輔助函數。 – Jester

回答

2

如果你沒有調試信息來幫助你,有沒有別的做的比知道ABI並用手閱讀它,用GDB的幫助,你在做其他的,已經可以做一個很好的集僅基於ABI的事物(如回溯,但未命名呼叫者)。

如果你有你的二進制文件的調試信息,您可以用info locals列出所選堆棧幀的局部變量,並在使用framebtinfo frameinfo frame <address>updownetc堆棧導航。

你不能真正的「註釋」的記憶,但你可以做的是創造convenience variables動態創建GDB的變量。

關於如何方便地讀取存儲大數組,我認爲非常有用只需使用print和鑄造地址。例如:print (char(*)[]) 0xdeadbeef。並且還使用artifical arrays來打印大區域。 GDB將聚合連續的相同值,使得讀取同類存儲區域(這不是堆棧的實際情況)非常清楚和容易。

相關問題