用GDB查看大小端
link
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 摘要:
- 一、大小端
- 二、用GDB查看大小端
- 2.1 源程序如下:
- 2.2 編譯進(jìn)入調(diào)試
- 2.3 查看內(nèi)存,判斷大小端
- 三、GDB查看內(nèi)存x命令用法
摘要:
寫這篇博文一來重溫下大小端,二來學(xué)習(xí)下GDB查看內(nèi)存的相關(guān)命令。本文簡要介紹大小端,并通過用GDB查看內(nèi)存的方式判斷大小端,最后詳細(xì)介紹了GDB查看內(nèi)存詳細(xì)用法。
一、大小端
? ? ? ?Endian表示數(shù)據(jù)在存儲器中的存放順序,大端將高字節(jié)存放在低地址,小端將低字節(jié)存放在低地址。可以這樣記憶,將高低字節(jié)存放在低地址對應(yīng)于大小端。采用大端方式進(jìn)行數(shù)據(jù)存放符合人類的正常思維,而采用小端方式進(jìn)行數(shù)據(jù)存放利于計(jì)算機(jī)處理[1]。
例:整數(shù)0x12345678,78為低字節(jié),12為高字節(jié),其大小端表示如下圖:
圖1 整型0x12345678大小端表示[2]
二、用GDB查看大小端
? ? ? ?判斷大小端有很多種方法。可以參考處理器手冊,一般來說,DEC、Inter X86屬于小端,Sun、PowerPC屬于大端,ARM則可以自主選擇大小端。也可以寫程序測試,這里介紹一種用GDB查看大小端方法,即聲明一個變量,通過GDB查看其存放方式來判斷大小端。
2.1 源程序如下:
//filename:endian_test.c #include <stdio.h> int main() {int test = 0x12345678;return 0; }2.2 編譯進(jìn)入調(diào)試
gcc -o endian_test -g endian_test.c gdb endian_test2.3 查看內(nèi)存,判斷大小端
gdb endian_test (gdb) l 1 //filename:endian_test.c 2 #include <stdio.h> 3 int main() 4 { 5 int test = 0x12345678; 6 return 0; 7 }(gdb) b 6 Breakpoint 1 at 0x555555554605: file endian_test.c, line 6. (gdb) r Starting program: /home/ledi/桌面/data/CSAPP-master/chapter02/show_bytes/endian_test Breakpoint 1, main () at endian_test.c:6 6 return 0; (gdb) p test $1 = 305419896 (gdb) p &test $2 = (int *) 0x7fffffffd77c (gdb) x/4xb &test 0x7fffffffd77c: 0x78 0x56 0x34 0x12(gdb) quit三、GDB查看內(nèi)存x命令用法
print命令可以打印表達(dá)式的值,但只能指定打印格式f,不能指定打印數(shù)目n以及字節(jié)大小。而x命令可以,其表達(dá)式[3]:x/[n/f/u] ADDRESS,其中[n/f/u]是可選的,各參數(shù)意義如下:
n:指定顯示內(nèi)存長度,以字節(jié)為單位
默認(rèn)值為1
f:指定顯示地址內(nèi)容的格式
o(octal)
x(hex)
d(decimal)
u(unsigned decimal),
t(binary)
f(float)
a(address)
i(instruction)
c(char)
s(string)
默認(rèn)值為上一次操作指定的值
u:指定字節(jié)長度,即以幾個字節(jié)作為一組顯示,并取決于格式
b(byte)
h(halfword)
w(word)
g(giant, 8 bytes)
默認(rèn)值為上一次操作指定的值
ADDRESS:指定內(nèi)存地址
默認(rèn)值為最后執(zhí)行命令print的地址值
總結(jié)
- 上一篇: 借助联合体union的特性实现检测当前计
- 下一篇: gdb 调试core 文件