天天看點

GDB檢視記憶體指令(x指令) 用gdb檢視指定位址的記憶體内容

 可以使用examine指令(簡寫是x)來檢視記憶體位址中的值。x指令的文法如下所示:

x/<n/f/u> <addr>

n、f、u是可選的參數。

n 是一個正整數,表示顯示記憶體的長度,也就是說從目前位址向後顯示幾個位址的内容。

f 表示顯示的格式,參見上面。如果位址所指的是字元串,那麼格式可以是s,如果地十是指令位址,那麼格式可以是i。

u 表示從目前位址往後請求的位元組數,如果不指定的話,GDB預設是4個bytes。u參數可以用下面的字元來代替,b表示單位元組,h表示雙位元組,w表示四字 節,g表示八位元組。當我們指定了位元組長度後,GDB會從指記憶體定的記憶體位址開始,讀寫指定位元組,并把其當作一個值取出來。

<addr>表示一個記憶體位址。

n/f/u三個參數可以一起使用。例如:

指令:x/3uh 0x54320 表示,從記憶體位址0x54320讀取内容,h表示以雙位元組為一個機關,3表示輸出三個機關,u表示按十六進制顯示。

輸出格式

一般來說,GDB會根據變量的類型輸出變量的值。但你也可以自定義GDB的輸出的格式。例如,你想輸出一個整數的十六進制,或是二進制來檢視這個整型變量的中的位的情況。要做到這樣,你可以使用GDB的資料顯示格式:

x 按十六進制格式顯示變量。

d 按十進制格式顯示變量。

u 按十六進制格式顯示無符号整型。

o 按八進制格式顯示變量。

t 按二進制格式顯示變量。

a 按十六進制格式顯示變量。

c 按字元格式顯示變量。

f 按浮點數格式顯示變量。

(gdb) p record

$10 = {12, 76, 48, 62, 94, 17, 32, 37, 52, 69}

(gdb) p &record

$11 = (int (*)[10]) 0x8049740

(gdb) x/4uw 0x8049740

0x8049740 <record>:    12    76    48    62

(gdb) x/6ow 0x8049740

0x8049740 <record>:    014    0114    060    076

0x8049750 <record+16>:    0136    021

說明

x 是 examine 的縮寫

n表示要顯示的記憶體單元的個數

f表示顯示方式, 可取如下值

u 按十進制格式顯示無符号整型。

i 指令位址格式

u表示一個位址單元的長度

b表示單位元組,

h表示雙位元組,

w表示四位元組,

g表示八位元組

Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),

t(binary), f(float), a(address), i(instruction), c(char) and s(string).

Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes)

舉例

x/3uh buf

表示從記憶體位址buf讀取内容,

h表示以雙位元組為一個機關,

3表示三個機關,