2012年11月26日 星期一

gdb 小技巧

很久沒用 gdb 了, 大多使用 printf 大法, 不過最近在 debug simple os 時, 意外發現 qemu/bochs + remote gdb 異常的好用。趕緊複習一下 gdb。

取得其他 architecture 的 gdb 版本, 才可以 debug arm 平台。

sudo apt-get install gdb-multiarch
set architecture i8086

layout asm 顯示組合語言 ctrl+x ctrl+a 切換為 TUI mode stepi (si) /nexti single for asm

在 c 和組合語言交互調試除錯時, 需要在這兩個畫面切換, 這個威力強大, 要成為底層工程師, 一定會要用這招。

20240229 補充:
在 tui mode 下如果開啟 mouse 支援, 無法在終端機用 mouse 複製/貼上, 可以按下 shift, 就可以複製貼上。我測試了 set tui mouse-events off 試圖關掉 mouse support, 但 gdb 回沒有這個指令。

ref:
trace system call 組合語言時, gdb layout asm 畫面


gdb.sh
1 file p_kernel.elf
2 target remote localhost:1234
3 b kernel_main 
4 b task_sys 
5 b restart
6 b proc_a 
7 b get_ticks
8 b sys_sendrec


這是在 debug simple os ipc 時, 我用的 script file。

gdb -x script
gdb -x gdb.sh
搞定。

指定某記憶體位址做反組譯
disassemble 0x00b068ea,0xb0695f


觀察某位址內容
2 (gdb) x/4xb 0x1459a0
3 0x1459a0 <ready_process>:       0xd4    0x5a    0x14    0x00
4 
5 (gdb) x/1xw 0x1459a0
6 0x1459a0 <ready_process>:       0x00145ad4


modify register, memory address, variable value
set $eax = 0
set {int}0x83040 = 4
set variable i = 10


在某個位址設定中斷點
(gdb) break *0x7c00


from Liao Wen Satoshi 這幾天的segmentation fault結束了。分享gdb指令 watch *0xxxxxxxxxx: 當該位址被寫入時break

rwatch *0xxxxxxxxxx: 當該位址被讀取時break

x/數量x: 顯示記憶體數量的16進位

define hook-指令: 當下指令的時候跑定義的行為 ex: define hook-next x/40x 0xxxxxxxx


找出所有的 source files: info sources 指定 source files path: source/directory source_file_path

使用 gdb 反組譯 gdb -batch -ex 'file exe_file' -ex 'disassemble main'

ref:

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。