gdb常用调试命令

最近看完csapp开始看apue,有时候跟着书上的代码敲着敲着也会产生一些疑惑,这个时候我就需要用到gdb来辅助我对代码的理解,这里总结一下gdb的常用指令,加深记忆并且方便以后来看.

1. 首先我们需要注意,在用gcc编译产生可执行文件时,我们需要加上-g选项,这样得到的可执行文件才能用gdb调试,否则我们是无法用gdb调试的哦.eg:

gcc -g -o sample sample.c

2. 在命令行下输入

gdb sample

(我们假设可执行文件的名字是sample),注意这个指令仅仅是打开gdb,并没有启动程序,启动程序需要用r指令,我们后面再说.

3. 接下来我们就进入了gdb的调试环境了,这个时候我们可以先输入l指令(list的缩写),列出我们需要调试的文件的代码,从第一行开始列出10行结束,再输入l的话会继续向后输出代码,同时我们也可以输入

l 20

这表示我们输出15-25行的代码方便我们查看.

4. 设置断点.调试的话我们肯定是需要设置断点的,我们利用上面的l指令查看我们的代码之后,可以通过输入

b 20

(breakpoint的缩写)指令,在代码的第20行设置一个断点,方便调试.同时与断点相关的命令还有以下几个:
* b func: func是个函数名,在func函数入口设置断点
* info break:列出所有当前的断点
* del 20: 删除在20行设置的断点
* dis 20: 暂时去掉20行设置的断点
* ignore 20 5:忽略20行设置的断点直到它被执行5次.

5. 然后我们就开始运行程序了,我们输入r(run的缩写),程序就会直接运行到我们设置的断点处.另外,如果我们的程序是需要命令行参数的话我们可以输入

r arg1 arg2

就OK啦,这样参数就传入我们的程序中了,网上好像还有一种做法是输入set args arg1 arg2我个人觉得这个办法太麻烦了,所以直接用r指令后面跟命令行参数就OK啦,方便快捷.

6. 接下来是几个到达断点之后我们需要的命令,如n(next的缩写),s(step的缩写),c(continue的缩写),注意n指令是直接执行本行代码,就算本行代码中有函数调用甚至函数调用中设置了断点,n指令也不会进入.与此相对,s指令是单步调试,如果本行代码中有函数调用,s指令会跳转到调用函数的第一行.c指令就是继续执行了,执行到下一个断点处停止.

7. 接下来是常用的一些指令:

* p指令(print的缩写):
    * print 表达式:简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。
    * print a:将显示整数 a 的值
    * print ++a:将把 a 中的值加1,并显示出来
    * print name:将显示字符串 name 的值
    * print gdb_test(22):将以整数22作为参数调用 gdb_test() 函数
    * print gdb_test(a):将以变量 a 作为参数调用 gdb_test() 函数
* watch指令: **watch 表达式**设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a
* display指令:**display 表达式**在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。如: display a
* finish指令:**finish**运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。
* q指令(quit的缩写):**q**,退出gdb