2012-09-15 220 views
2

當我在做「學習C硬路」的例子時,我心想:如何在內存hexdump中找到變量的地址?

我設置int a = 10;但是實際上這個值是10呢?我可以在程序運行時從外部手動訪問它嗎?

這裏是爲了演示一個小的C代碼片段:

int main (int argc, char const* argv[]) {         

    int a = 10; 
    int b = 5; 
    int c = a + b; 

    return 0; 
} 

我打開了The GNU Project Debugger(GDB),並進入:

break main 
run 
next 2 

從我的理解0x7fff5bffb04內存地址int c。然後我用hexdump -C/dev/mem系統調用將整個內存轉儲到終端。

現在的問題是我在哪裏尋找變量c在這個巨大的十六進制轉儲?我的希望是,鑑於地址0x7fff5bffb04我可以找到它的價值,這是15。另外,獎勵問題,hexdump -C中的每一列代表什麼? (我知道,最後一列是ASCII表示)

gdb

hex dump

+2

的'0x7f的...'地址是虛擬的。除非您知道虛擬 - >物理映射,否則不能使用它來查找物理內存轉儲中的內容。 (第一列是「地址」(自文件開始以來的字節數),最後是ascii表示,中間是數據。) – Mat

+0

@Mat:謝謝。我可以打印物理內存地址,還是可以用十六進制轉儲虛擬內存而不是物理內存?什麼是可能的解決方案? –

+0

爲什麼你將'argv'定義爲'char const * []'? – oldrinb

回答

1

然後我使用hexdump -C/dev/mem系統調用將整個內存轉儲到終端中。

你的hexdump轉儲了物理內存地址。地址0x7fff5bffb04虛擬您正在調試的過程中變量的地址。它被映射到一些物理地址地址,但是如果沒有檢查內核映射表(就像Mat已經在評論中告訴你的那樣),你將無法找到它。

要檢查虛擬地址空間,請使用/proc/<pid>/mem(因爲Barmar已在評論中告訴您)。

但是這整個演習是毫無意義,因爲你已經可以檢查GDB的虛擬內存,而你不會看到任何你看一下虛擬內存GDB尚未告訴你更方便[1]。

[1]除非你可以看到GDB插入斷點,但預計不會明白:-)

1

首先,沒有理由爲什麼值將甚至在RAM存在。除了Likly,這個程序的機器代碼只有cpu寄存器中的值。你將不得不有更多的字節(嘗試至少512),並將它們設置爲隨機值,然後您可以在內存轉儲中搜索。

你更好看看c編譯器生成的彙編代碼。

+0

「沒有理由爲什麼價值甚至會存在於公羊中」 - 是的,有。當程序在沒有優化的情況下生成時(這裏就是這種情況),大多數編譯器會在堆棧上保留空間,並且會實際保存這些值。如果程序是用*優化構建的,那麼沒有理由在寄存器中存在這些值:任何體面的編譯器都會優化所有的分配,因爲它們的結果不被使用。 –