通過GDB除錯理解指標

2021-10-06 21:25:08 字數 2040 閱讀 9176

源**:

#include

intmain()

編譯上面的**之後進行除錯。

在初始化之前,a、pon、ppon的值各為:(可以使用info locals命令進行檢視區域性變數)

0x0執行結束退出main之前,a、pon、ppon的值各為:

a =

0xapon =

0x7ffeefbff94c

ppon =

0x7ffeefbff940

通過上面的輸出結果,以及printf輸出的值:

pon = efbff94c,

*pon =10,

&a = efbff94c,

&pon = efbff940

ppon = efbff940,

*ppon = efbff94c,

**ppon =10,

&ppon = efbff938

通過這裡可以看出如下的關係:

對上圖的解釋:

ppon 是乙個 指向指標的指標,指標指向pon;pon是乙個指標,指向a;int **ppon = &pon;等價於int **ppon; *pon = pon;

其他:

上圖中,可以看到 ppon和pon位址是挨著的,差了8位是因為我的是64位機器,但是:pon和a之間差了12,本來只應該差8的,但這裡多出了4位元組,在gdb中可以看到0x7ffeefbff948 存放的是 『%p』,但是怎麼來得,沒有分析出來。

在gdb中使用x/1i 0x7ffeefbff948命令檢視,得到0x7ffeefbff948: and eax,0xa000050的結果,見下圖,

ida中進行檢視,可以看到,在這裡加了4位元組才開始放a值。

但是,這裡為什麼加4位元組,還不知道原因。

update~

關於為什麼加4位元組,想清楚了,是因為int是4位元組,自己的是64位機器,這裡多的4位元組是因為位元組對齊的原因才新增的

0xa00005025進行分析,拆分為0xa0x00005025,位元組對齊是低位對齊,所以,高位padding0x00005025,為什麼padding0x00005025,暫時還未找到原因。其記憶體布局如下所示,為什麼是這麼布局的,涉及到大小端機,個人電腦一般都是小端位元組序:低位放低位址

如果最開始將a設定為int a = 0x12345678;,可以得出下面的布局情況,上面的分析得到驗證。

通過 GDB 除錯理解 GOT PLT

關於 linux 中 elf 檔案格式可參考詳細文件 elf format 本文僅記錄筆者理解got plt的過程。got global offset table 全域性偏移表用於記錄在 elf 檔案中所用到的共享庫中符號的絕對位址。在程式剛開始執行時,got 表項是空的,當符號第一次被呼叫時會動態...

Linux學習 gdb除錯(指標的指標)

昨天遇到乙個很奇怪的問題,如下 按照理論,最後 p的值應該是99,不知為什麼是15了,所以今天記錄用gdb除錯的過程,並熟悉gdb的使用。除錯過程參考 開始 1.2.用list從第1行開始列出原始碼 3.一次只列10行,如果要從第11行開始繼續列源 可以輸入list 4.也可以什麼都不輸直接敲回車,...

gdb 除錯 vs除錯

一 先要生成二進位制檔案 g g 1.cpp o 1.out g引數不要省,不然 gdb l 引數用不了 二 引數 設定斷點 設定 函式斷點break func 在某行設定斷點break 7 檢視斷點資訊 info break 刪除斷點 d 刪除所有斷點 d 3 刪除第三個 執行 r 下一步 n 逐...