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)查看內存地址讀取內容
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