【程序】
[编译成未链接的目标程序/.o文件]
[没有符号表被读取。请使用 "file" 命令]
First, did you correctly compile the c program? Like:
gcc -g your.c -o aaa
Once you finish compiling the program, use below command to gdb it:
gdb aaa
Or if you start gdb w/o specifying the program `aaa‘, you can input
`file aaa‘
in the gdb shell.
[执行程序]
run:重新执行
[查看变量/需要断点]
print/p +变量名
若把断点设置在循环体内部想要循环输出变量值,则需要next命令执行下一条语句。
[按格式输出变量]
p i:正常输出;p/c i:字符格式;p/t i:二进制格式
[调用函数/需要断点]
break 19
run
print func(3) //函数中的形参必须换成实参
[查看数组/需要断点]
break 12
run
print sz
[自动显示变量/需要断点]
break 15
run
display/d i //格式化自动输出i
display/d result //格式化输出result
step/next //执行下一步并显示当前display中自动输出变量(i和result)的值
info display //查看当前display中的自动显示变量的编号+格式+变量名
[删除自动显示变量]
delete display 1 //根据info得到的编号删除某个自动显示变量
undisplay //删除当前display中所有的变量
[启用/禁用自动提示]
disable display [1] //display后加行号表示禁用当前行,不加表示禁用所有行
enable display [1] //启用,作用同上
disable display 1 2 //中间空格可以操作多个自动显示变量
【断点】
注:<1>断点之后的命令不会自动执行(无论是main还是其他函数中),只能手动一步步走;
<2>断点会跟着调用函数从而进入外部函数体内。
[新建断点]
break 1
[删除端点]
<1>(gdb)delete breakpoint 1 //删除当前位置断点,1代表第一个断点
<2>clear //删除程序上次停止处的断点
<3>clear 20 //删除第20行的所有断点
[设置断点有效无效]
enable/disable breakpoint
[查看当前断点信息]
info break/b
[断点处变量数值]
print/p +变量名
若把断点设置在循环体内部想要循环输出变量值,则需要next命令执行下一条语句。
[快捷键进入下一个断点]
注:<1>[断点之后]可以使用run、continue、next、step继续执行。
<2>断点停下来后如果被继续执行了一次,那么接下来的程序执行可以使用Enter代替刚才的命令。
#.run continue next step的区别
[run]:头部=>断点
是指把gcc -c编译好的中间程序从头执行,保留断点/自动显示等属性;
[continue]:断点=>结束/循环一次
如果断点不在循环内部,那么执行一次就直接输出结果;如果断点在循环里面,那么执行一次就等于进行了一次循环(方便~);
[step]:断点=>断点+1命令行(进入被调函数)
如果命令将要运行的源代码行上有函数调用,那么step命令将导致GDB进入到被调用函数的内部。
[next]:断点=>断点+1命令行(不进入被调函数)
则和step不同,它不会进入函数,而是在出口坐等。
//以上四种都可以在断点后设置自动显示变量,特别是在循环内部用于监控数值变化。
[条件断点]:符合条件时断点才会出现,用于循环/判断中
<1>break 6 //假设info break是2号
condition 2 i==5 //当i=2时在第6行加上断点,其他情况等于这个断点不存在
<2>break 6 if i==5 //含义同上,只不过合起来写了