gdb如何確定記憶體 已經釋放 gdb 檢視記憶體

2021-10-13 08:00:19 字數 1309 閱讀 2263

難記的大端小端

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

int main(){

int i = 0x12345678; // 注意必須是16進製制,否則難以判斷

return *(char*)&i;

在linux 的執行結果

gcc test.c

$./a.out

$echo $?

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

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

用gdb 列印記憶體位址

使用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)

畫個圖c7

c6c5

c40x12

0x34

0x56

0x78

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

(gdb) p $rbp - 0xc

$2 = (void *) 0x7fffffffe7c4

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

區分endian

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

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

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

如何釋放記憶體

現在手機的各種認證,對記憶體的要求越來越高,也越來越嚴格。很多情況下 因為記憶體的原因導致gts過不來。下面介紹下解決方法。1 其實手機軟體本身也會釋放記憶體,即gc。gc後很多無用的物件釋放後,應用的記憶體也會相應的降低。2 但是有些時候在測試cts的時候,獲取meminfo的時候,因為系統沒有觸...

如何確定Apache是 否已經安裝?

如果您正在執行linux系統,則預設情況下已經安裝了apache的高概率。萬一您可以使用以下命令來確定是否已安裝apache。發出httpd v或 usr sbin httpd v 發出apache2 v或 usr local apache bin apachectl v mkyong mkyong...

c vector 如何釋放記憶體

1.vector容器的記憶體自增長 與其他容器不同,其記憶體空間只會增長,不會減小。先來看看 c primer 中怎麼說 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空...