gdb 檢視記憶體

2022-05-04 19:30:22 字數 1519 閱讀 1154

曾經被電面到乙個題目,如何判斷乙個系統是大端還是小端, 方法其實很簡單

int main()
在linux 的執行結果

gcc test.c          

$./a.out

$echo $?

120

120 即 0x78, 證明低位放在了低位址,所以是小端系統(little endian )。

這樣說可能不夠直觀,而且記憶體中怎麼分布本來就比較抽象,所以這裡演示列印記憶體並畫個圖來表示

使用disassemble命令反彙編後,可見我們的i在 -0xc(%rbp) 位置,也就是 %rbp-0xc

│  >0x555555555150 movl   $0x12345678,-0xc(%rbp)
列印4個位元組的記憶體,用到x命令,方法是 x/fmt,若記不住,只需要在gdb內使用help x

(gdb) x/4xb $rbp - 0xc

0x7fffffffe7c4: 0x78 0x56 0x34 0x12

(gdb)

4 表示重複4次,x表示顯示為16進製制,b表示每次列印的長度為1位元組

(gdb) x/1xb $rbp - 0xc

0x7fffffffe7c4: 0x78

(gdb) x/1xb $rbp - 0xb

0x7fffffffe7c5: 0x56

(gdb) x/1xb $rbp - 0xa

0x7fffffffe7c6: 0x34

(gdb) x/1xb $rbp - 0x9

0x7fffffffe7c7: 0x12

(gdb)

畫個圖

c7c6

c5c4

0x12

0x34

0x56

0x78

而我們的i指標位址指的是 c4, 所以c4是,lsb處在端位置,所以是小端系統, little endian

(gdb) p $rbp - 0xc

$2 = (void *) 0x7fffffffe7c4

也可以看出,系統通過乙個位址取值是從低位址取到高位址。 c4 c5 c6 c7

搞清楚了,就很好判斷endian, 給兩個圖理解什麼是big endian

文章的第乙個字母都是比較大, 這叫big endian

linux 是乙個小端系統, windows也是, 可以順便說網路 位元組序是 大端

gdb檢視記憶體

格式 x nfu 說明 x 是 examine 的縮寫 n表示要顯示的記憶體單元的個數 f表示顯示方式,可取如下值 x 按十六進製制格式顯示變數。d 按十進位制格式顯示變數。u 按十進位制格式顯示無符號整型。o 按八進位制格式顯示變數。t 按二進位制格式顯示變數。a 按十六進製制格式顯示變數。i 指...

GDB教程 檢視記憶體)

先看 n f u是可選的引數,表示乙個記憶體位址 1 n 是乙個正整數,表示顯示記憶體的長度,也就是說從當前位址向後顯示幾個位址的內容 2 f 表示顯示的格式 3 u 表示將多少個位元組作為乙個值取出來,如果不指定的話,gdb預設是4個bytes,如果不指定的話,預設是4個bytes。當我們指定了位...

用gdb檢視記憶體

用gdb檢視記憶體 格式 x nfu 說明 x 是 examine 的縮寫 n表示要顯示的記憶體單元的個數 f表示顯示方式,可取如下值 x 按十六進製制格式顯示變數。d 按十進位制格式顯示變數。u 按十進位制格式顯示無符號整型。o 按八進位制格式顯示變數。t 按二進位制格式顯示變數。a 按十六進製制...