2011-05-11 87 views
6

我知道,你可以用gdb在正從$ EBP抵消尋找發現任何參數:如何用gdb讀取局部變量?

(gdb) x/4wx $ebp 

然後,我會看在第3和第4地址使用x/s,因爲他們將是第一個和第二參數。那麼局部變量呢?我如何看待$ ebp的負偏移值? 另外,無論如何看看$ eax的價值嗎? 每當我嘗試使用x/s $eax打印$ eax的值時,地址超出限制或值爲0,我相信這不是因爲我只是在寄存器中放置了一個常量值。

我試過info locals但我收到消息「沒有符號表信息可用」。

回答

6

首先,您需要將調試符號編譯到您的二進制文件中。使用當前命令在gcc上使用-g選項來執行此操作。如果您使用的是其他編譯器,則需要查閱其文檔。在此之後,'info locals'和打印命令將起作用。

要查看任何局部變量,您只需使用'print'命令。例如,查看局部變量'i'就像'打印i'一樣簡單。

您應該能夠像$ ebp一樣處理$ eax。我懷疑你有問題,因爲你使用的是x/s。 x/s會嘗試打印出一個字符串,所以它會一直持續下去,直到遇到一個空字符。如果這種情況很長時間沒有發生,那麼字符串的長度將超出界限。試試'x/d $ eax'。你甚至可以'打印$ eax'。您也可以使用'信息寄存器'來獲取所有的寄存器數據。

0

我知道,你可以用gdb

這隻適用於一些處理器和一些調用約定在正從$ EBP抵消尋找發現任何參數,並且絕不是普遍的。

假設你只關心x86,並且你的代碼是用幀指針編譯的(這是默認的,但不再是選擇模式下GCC 4.6的默認值),本地被分配一個固定的負偏移量從%ebp

顯然,如果你可以使用調試符號重新編譯你的代碼(使用-g),那麼GDB將能夠打印它們的值,而且你不需要關心GDB如何發現它們。

如果你不能(例如因爲代碼來自第三方),你必須仔細研究反彙編,並猜測。如果您猜測某個值存儲在%ebp-8處,則可以使用GDB檢查該值,與檢查正偏移量的方式完全相同:(gdb) x/wx $ebp-8

當心:編譯器可以自由奠定了當地就是了任何方式,所以如果你聲明

int x, y, z; 

編譯器是免費的存儲x%ebp-16y%ebp-20z%ebp-12