gdb 工具的使用之棧變量查詢

服務接收出現卡死情況(可能是查詢的數據太大,或者死循環),進程被掛住,希望通過 gdb 指令獲取服務入口參數(主體獲取服務接收到的服務報文內容),模擬請求方式寫了一個 demo,運用指令找到變量參數。

例子代碼:

https://github.com/youvskobe/coding_test.git

例子很簡單,就是 main->test1->test2->test3

下面在 test3 設置斷點,並在 run 傳入參數,然後通過跟蹤棧變量,查看調用 test1 中的 a.c 變量值。

1)啓動

2)設置斷點——這個是爲了防止程序直接執行完

3)運行程序

程序默認在斷點停止
4)顯示棧的 frame

5)移動到調用 test1 的地方
注意:這裏需要要把棧移到 #3 這個地方,而不是 #2 這個地方

此時把 IP 指針指到了 0x0000000000400bc3,就是 main 函數中,調用 test1 的地方
6)獲得的堆棧指針

此時 0x7fffffffd310 開始的地址,就是調用 test1 的棧變量地址

7)查看內存

8)查看內存地址讀取內容

65 'A' 66 'B' 67 'C' 0 '\000'

101 'e' 102 'f' 0 '\000' 0 '\000'

就是我們希望看到的變量參數

附:查看內容命令說明

格式: x /nfu
說明
x 是 examine 的縮寫
n 表示要顯示的內存單元的個數
f 表示顯示方式, 可取如下值
x 按十六進制格式顯示變量。
d 按十進制格式顯示變量。
u 按十進制格式顯示無符號整型。
o 按八進制格式顯示變量。
t 按二進制格式顯示變量。
a 按十六進制格式顯示變量。
i 指令地址格式
c 按字符格式顯示變量。
f 按浮點數格式顯示變量。
u 表示一個地址單元的長度
b 表示單字節,
h 表示雙字節,
w 表示四字節,
g 表示八字節

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Y3lFsCI6bzrktrpHm4ud-w