参考链接:http://learn.akae.cn/media/ch10.html
1 编译时的-g选项是在可执行文件中加入源码的信息,如第几条机器指令对应第几条源码.但并不是把整个源文件嵌入到可执行文件中,因此,在调试时必须保证gdb能够找到源文件.
2 在gdb中输入help能够查看命令类别,也可以进一步查看某一类别中有那些命令:
Type "help" followed by a class name for a list of commands in that class
Type "help all" for the list of all commands
Type "help" followed by command name for full documentation
Type "apropos word" to search for commands releated to "word"
3 gdb 提供了一个非常方便的功能,在提示符下直接敲回车表示重复上一条命令;
4 gdb很多常用命令有简写形式,如list可写成l.如果要列一个函数的源码,可以直接将函数名作为list的参数;
5 用step命令可以进入函数,查看函数的内部执行情况;
6 函数中查看状态的几种方法:
(1) 用backtrace(bt)命令可以查看函数调用的栈帧;
(2) 用info(i)命令可以查看函数局部变量的值;
(3) 如果想查看上层函数的局部变量值,可以先用frame(f)命令选择对应的栈帧,然后再查看对应的局部变量;
(4) 用print(p)命令可以打印变量的值,print命令可以打印被调试语言中任意有效的表达式的值;
7 修改变量的值除了用set外,还可以用print.因为print后面跟的是表达式,而赋值和函数调用也是表达式,所以...
set var sum=0
p result[2]=33
8 finish命令会让程序执行到当前函数返回为止,而continue命令则会让程序运行到下一个断点为止,当然你也可以通过为continue传递参数而指定它将忽略几个断点.
9 有关断点:
(1) 一次调试可以设置多个断点,用info命令参看已经设置的断点: i breakpoints
(2) 每个断点都有一个编号,可以通过指定编号删除某个断点: delete breakpoints 2
(3) 有时候一个断点暂时不用可以禁用而不是删除,这样到时候可以直接启用而不用再次设置: disable breakpoints 3
(4) 可以设置断点再满足某个条件时才激活: break 9 if sum!=0
10 可以让每一次程序停下来的时候(如碰到断点)都显示某个变量的值:display sum
可以通过undispaly加上跟踪显示编号取消跟踪显示:undisplay 1
11 观察点.断点时程序执行到某一行代码时中断,而观察点是当程序访问到某个存储单元时中断.如果我们不知道某个存储单元是在哪里被改动的,这时候观察点尤其有用,用watch命令设置观察点:watch inputs[5]
info watchpoints命令查看当前设置了那些观察点.