以前曾经学过几次 gdb,但后来却会一直觉得这个东西很难用也不知道怎么用比较好,直到最近在读 chibicc 时,刚好就有了使用 gdb 的需求,有了这个需求后,觉得用起 gdb 就比较有学习的方向,以下来纪录我是如何使用 gdb 来 debug chibicc。
下载 chibiccgit clone https://github.com/rui314/chibicccd chibicc/
编译 chibiccmake
编译好之后应该会出现 chibicc
这个档案
foo.c
:// foo.cint foo(){ int i; int j; i = 3; if (i > 0) { j = 2; } return 2;}
接着可以就可以用 gdb 来 debug chibicc 了gdb --args ./chibicc -c foo.c # 加上 --args 代表 ./chibicc 之后还有参数
强烈建议进入 gdb 之后,输入tui enable
会出现当前在哪一行程式码的介面,这个功能可以让你的生活轻鬆许多。
可以正式开始 debug 了,我认为刚开始只需要知道以下几个指令就好,有不记得的会搭配 GDB cheatsheet 这个小抄来使用# 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 出一个变数的值
gdb 的设定档 .gdbinit
以及针对 chibicc 的设定在
./chibicc
这个资料夹下,建立一个 .gdbinit
的档案,如此一来在执行 gdb 时就会自动的载入设定档了# .gdbinittui enable # 使用 tui modeset 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/.gdbinitline to your configuration file "/home/username/.gdbinit"....
照着上面说的做就好,在 /home/username/.gdbinit
这个档案中加入一行 add-auto-load-safe-path /home/username/chibicc/.gdbinit
就可以了