由於堆棧轉向較小的addesses,使用gdb對它進行檢查對我來說很費力。到目前爲止我使用在gdb中檢查堆棧的正確方法是什麼?
x/64xw 0xffffd0e8-64*4
如果我想看以下它在堆棧上位於0xffffd0e8(堆棧上)的值以及值(在這種情況下一個32位機器上的以下64個字)。
有沒有更簡單的方法?
此外,有沒有什麼辦法可以自動標記棧與相應的變量名稱上的內容?或者每行只顯示一個字,而不是四個?
由於堆棧轉向較小的addesses,使用gdb對它進行檢查對我來說很費力。到目前爲止我使用在gdb中檢查堆棧的正確方法是什麼?
x/64xw 0xffffd0e8-64*4
如果我想看以下它在堆棧上位於0xffffd0e8(堆棧上)的值以及值(在這種情況下一個32位機器上的以下64個字)。
有沒有更簡單的方法?
此外,有沒有什麼辦法可以自動標記棧與相應的變量名稱上的內容?或者每行只顯示一個字,而不是四個?
如果你沒有調試信息來幫助你,有沒有別的做的比知道ABI並用手閱讀它,用GDB的幫助,你在做其他的,已經可以做一個很好的集僅基於ABI的事物(如回溯,但未命名呼叫者)。
如果你有你的二進制文件的調試信息,您可以用info locals
列出所選堆棧幀的局部變量,並在使用frame
,bt
,info frame
,info frame <address>
,up
,down
,etc堆棧導航。
你不能真正的「註釋」的記憶,但你可以做的是創造convenience variables動態創建GDB的變量。
關於如何方便地讀取存儲大數組,我認爲非常有用只需使用print
和鑄造地址。例如:print (char(*)[]) 0xdeadbeef
。並且還使用artifical arrays來打印大區域。 GDB將聚合連續的相同值,使得讀取同類存儲區域(這不是堆棧的實際情況)非常清楚和容易。
請考慮使用'x/64xw $ esp'來代替。 – Jester
我知道。但有時我想檢查當前幀,它不在棧頂。 –
定義一個輔助函數。 – Jester