天天看點

gdb中檢視記憶體方法總結

出自計組第三次上機附加題第二題

用gdb運作程式b,輸出中相應位址究竟指向了什麼?
請貼上你是如何找到的(使用了什麼gdb指令等等)
           
gdb中檢視記憶體方法總結
gdb中檢視記憶體方法總結
gdb中檢視記憶體方法總結
gdb中檢視記憶體方法總結
gdb中檢視記憶體方法總結
gdb中檢視記憶體方法總結

在檢視位址前首先需要斷點定位到需要檢視的位置

顯示代碼内容

(gdb) l
           

在第八行設定斷點

(gdb) break 8
           

運作

(gdb) run
           

将會在斷點處停下

Starting program: /Users/xujiaxing/Downloads/lab3_補充題目/b/b/b
[New Thread 0x1e03 of process 905]
warning: unhandled dyld version (15)
 
Thread 2 hit Breakpoint 1, main () at b.c:8
8        printf(format, &magic);
           

接下來就要檢視記憶體了

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) x/9db 0x00001fa4
           

從記憶體位址0x00001fa4讀取内容,b表示以單位元組為一個機關,9表示九個機關,d表示按十進制顯示。

還有另外一種方法是直接print,由于0xBFFFFAA0是指針的指針所指向的位址,是以檢視其内容即為

(gdb) p/d**(char**) [email protected]
           

從記憶體位址0xBFFFFAA0讀取内容,d表示以十進制顯示,@9表示讀取一片連續的長度為9的位址

繼續閱讀