- (gcc -o test -g test.c)
- gdb test (或gdb -q test 去除出现在屏幕上的其他信息)
运行程序:(gdb) run
设置断点:(gdb) break 12(行数或者函数名)
跳转到下一个断点:(gdb) c
继续执行下一步,直到退出函数:(gdb) n
打印变量值:(gdb) print x(变量名)
退出调试:(gdb) q
查看代码:
list默认参数可以用show listsize来查看,如果感觉10行太多或者太少,还可以用set listsize 来更改。
list 还可以加上其他参数,比如:
list 5,10 显示第5行到第10行的代码;
list func 显示func函数周围的代码,显示范围和list参数有关;
list test.c:5,10 显示源文件test.c第5行到第10行的代码,一般用于调试含多个源文件的程序。
gdb 还支持字符串查找,search str,从当前行开始,向前查找含str的字符串;
reverse-search str,从当前行开始,向后查找含str的字符串。
gdb也支持linux命令的。
eg : 可以在gdb的提示符中,输入shell,然后在输入你需要的命令就可以了
(gdb) shell clear
断点
info breakpoints 看下设置的断点信息
直接删除该断点,可以使用clear命令和delete命令。(gdb) clear 6 (6 是行数)
clear命令后面的参数为设置断点的行号,clear后面参数还可以加设置断点的函数名。
delete命令后面的参数为断点的编号;可以一次删除多个断点,断点编号之间用空格隔开;
如果delete后没有参数,默认删除所以断点,会给出提示选择是否操作。
实例:
- 在编译时要加上
-g选项,生成的可执行文件才能用gdb进行源码级调试:
eg: $ gcc -g main.c -o main
- 在提示符下直接敲回车, 表示重复上一条命令
make编译并运行:

运行代码:
开始查看源码:
发现无法查看源码,于是更改Makefile:
更改为:

更改Makefile后可以查看源码:

设置断点后查看大断点信息:
运行程序:
发现结果非常正确;
进入第一个断点,并通过step语句反复进入arrayfill_with中的for循环:

多次回车继续调用step命令,查看最后一部,运行到第i = 16,array[16] = 10;(i++,i==17时结束循环)
(这里就发现了问题,数组大小为16,应该只能对i=15赋值10,所以这里有错误,数组赋值越界了!!)

查看堆栈,并查看当前的数组:
继续进入第二个断点:
同理,查看第二个arrayfill_with()语句,多次step后查看最后一步,
运行到第i = 16,array[16] = 55;

查看断点结束后的堆栈,和数组信息
使用continue执行完剩下的步骤
