win
gcc test.c -o test
要对程序进行调试,使用-g参数,gcc -g test.c -o test
编译完成后,启动GDB调试工具,命名为:gdb + 要调试程序的程序名,在本例中使用的命令为【gdb test】;
可以使用list/l命令查看程序,方便我们添加断点时查看信息;
然后使用break/b命令给程序添加断点,共有下面几种情况:
① b 函数名 在某函数入口处添加断点;
② b 行号 在指定行添加断点
③ b 文件名:行号 在指定文件的指定行添加断点
④ b 行号 if 条件 当条件为真时,指定行号处断点生效,例 b 5 if i=10 ,当i=10时,第5行断点生效
添加完断点之后,我们可以使用【info break】命令,查看所有的断点;
最后使程序开始运行,run命令,运行程序;next命令,单步运行,continue命令,连续运行;如果想查看某一变量的值,则使用print/p + 变量名;
linux
也是-g,
gdb test
然后你就会看到出现好多信息在屏幕上,大致说的是gdb的一些版本信息说明之类的,但是它对你调试程序没用,所以,你可以加上-q选项,不输出它们。
gdb -q test
//list默认一次显示10行 //直接输入回车重复上次命令,显示接下来的10行
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的字符串。
shell clear
(gdb) break 7 if n==6 Breakpoint 2 at 0x80484d1: file test.c, line 7.
当然,还可以直接在某个函数处设置断点;直接break 函数名就可以了,
然后我们想看下设置的断点信息,可以使用info breakpoints命令。
Disp表示中断点在执行一次之后是否失去作用,dis为是,keep为不是;Enb表示当前中断点是否有效,y为是,n为否;Address表示中断点所处的内存地址;What指出断点所处的位置。
disabe num,enable num
直接删除该断点,可以使用clear命令和delete命令。
clear命令后面的参数为设置断点的行号,clear后面参数还可以加设置断点的函数名。
delete命令后面的参数为断点的编号;可以一次删除多个断点,断点编号之间用空格隔开;如果delete后没有参数,默认删除所以断点,会给出提示选择是否操作。
run,
还有nexti和stepi命令,这两个是单步执行一条机器指令,比如(i=0;i<n;i++)这条语句需要输入多个nexti才能执行完;两个的区别和上面相同。