以前曾經學過幾次 gdb,但後來卻會一直覺得這個東西很難用也不知道怎麼用比較好,直到最近在讀 chibicc 時,剛好就有了使用 gdb 的需求,有了這個需求後,覺得用起 gdb 就比較有學習的方向,以下來紀錄我是如何使用 gdb 來 debug chibicc。
git clone https://github.com/rui314/chibicc
cd chibicc/
make
編譯好之後應該會出現 chibicc
這個檔案
foo.c
:// foo.c
int foo()
{
int i;
int j;
i = 3;
if (i > 0) {
j = 2;
}
return 2;
}
gdb --args ./chibicc -c foo.c # 加上 --args 代表 ./chibicc 之後還有參數
tui enable
會出現當前在哪一行程式碼的介面,這個功能可以讓你的生活輕鬆許多。
# b <function name> b 代表 break(中斷點)程式執行時會停在這裡,如
(gdb) b parse # 可以讓程式執行時停在 parse.c 裡的 parse() 這個 function
(gdb) r # 代表 run,從頭開始執行的意思
(gdb) n # 代表 next,執行下一行程式碼的意思
(gdb) s # 代表 step,遇到 function call 時,會進入到 function 裡
(gdb) c # 代表 continue,一直執行到結束,但如果遇到中斷點會停下
(gdb) p <var> # print 出一個變數的值
.gdbinit
以及針對 chibicc 的設定./chibicc
這個資料夾下,建立一個 .gdbinit
的檔案,如此一來在執行 gdb 時就會自動的載入設定檔了# .gdbinit
tui enable # 使用 tui mode
set follow-fork-mode child # 當 fork() 時,選擇追蹤 child process 而非 parent process 這是為了 chibicc 而做的設定
再執行 gdb --args ./chibicc -c foo.c
之後,會發現會出現像這樣的錯誤:
...
To enable execution of this file add
add-auto-load-safe-path /home/username/chibicc/.gdbinit
line to your configuration file "/home/username/.gdbinit".
...
照著上面說的做就好,在 /home/username/.gdbinit
這個檔案中加入一行 add-auto-load-safe-path /home/username/chibicc/.gdbinit
就可以了