gdb 如何除錯記憶體位址

2021-08-03 23:56:05 字數 2278 閱讀 9808

int age= 20;

int *p_age = &age;

nslog(@"p_age = %p", p_age); //輸出指標變數p_age指向值20所在記憶體的位址

nslog(@"&p_age = %p", &p_age); //輸出指標變數p_age本身的位址

2017-07-19 15:54:07.048 test0719[27387:858079] p_age       =0x7fff5313f65c

2017-07-19 15:54:07.050 test0719[27387:858079] &p_age = 0x7fff5313f650

能不能通過位址0x7fff5313f65c0x7fff5313f650檢視記憶體位址中的值?

如何去驗證:0x7fff5313f650記憶體位址的值是:0x7fff5313f65c,而0x7fff5313f65c記憶體位址的值是20?

2017-07-19

16:06:54.160 test0719[27514:863331] p_age = 0x7fff5c8d965c

2017-07-19

16:06:54.162 test0719[27514:863331] &p_age = 0x7fff5c8d9650

(lldb) x/d 0x7fff5c8d965c

//檢視0x7fff5c8d965c記憶體位址的值,並以十進位制方式輸出。

0x7fff5c8d965c: 20

//輸出結果是20

(lldb) x/x 0x7fff5c8d9650

//檢視0x7fff5c8d9650記憶體位址的值,並以十六進製制方式輸出。

0x7fff5c8d9650: 0x5c8d965c

//輸出結果是乙個4位元組大小的類似指標位址的值,而指標變數型別大小應該是8個位元組

(lldb) x/g 0x7fff5c8d9650

//所以,這裡使用g引數來表示位元組8個位元組,重新輸出8個位元組的記憶體位址的值

0x7fff5c8d9650: 0x00007fff5c8d965c

//8個位元組大小的記憶體位址的值,它是乙個位址

(lldb) x/d 0x00007fff5c8d965c

//檢視0x00007fff5c8d965c 記憶體位址的值,並以十進位制方式輸出。

0x7fff5c8d965c: 6669152202784768020

//因為,不指定輸出位元組大小,預設應該輸出4個位元組記憶體大小,所以其值非常大

(lldb) x/1db 0x00007fff5c8d965c

//所以,調整為輸出1個位元組的記憶體大小的值,並以十進位制方式輸出

0x7fff5c8d965c: 20

x/

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

n是乙個正整數,表示需要顯示的記憶體單元的個數,也就是說從當前位址向後顯示幾個記憶體單元的內容,乙個記憶體單元的大小由後面的u定義。

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

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

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

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

d按十進位制格式顯示變數。

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

o按八進位制格式顯示變數。

t按二進位制格式顯示變數。

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

c按字元格式顯示變數。

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

Linux程式除錯 記憶體位址對齊

改編自 一,記憶體位址對齊的概念 計算機記憶體中排列 訪問資料的一種方式,包含基本資料對齊和結構體資料對齊。32位系統中,資料匯流排寬度為32,每次能夠讀取4位元組資料。位址匯流排為32,最大定址空間為4gb。但是由於最低位a 0 a 1 是不用於定址的,因此只能訪問4的倍數的位址空間,但是定址空間...

GDB檢視指定記憶體位址處的內容

命令格式 x nfu如 gdb x 1xb 0x7fffffffd708 x examine 的縮寫 n 表示要顯示的記憶體單元個數 f 表示顯示方式,可取如下值 x 按十六進製制格式顯示變數。d 按十進位制格式顯示變數。u 按十進位制格式顯示無符號整型。o 按八進位制格式顯示變數。t 按二進位制格...

記憶體位址分配

inti 1 intj 1 cout i endl j endl 2 函式引數列表的存放方式是,先對最右邊的形參分配位址,後對最左邊的形參分配位址。3 little endian模式的cpu對運算元的存放方式是從低位元組到高位元組的 0x1234的存放方式入下 0x4000 0x34 0x4001 ...