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 和組合語言交互調試除錯時, 需要在這兩個畫面切換。

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

ref:

沒有留言:

張貼留言

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

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