Gdb调试器的小结:
1.gdb <program>
输入gdb <program>方式启动gdb后,gdb会在PATH路径和当前目录中搜索<progma>的源文件,如果要确认gdb是否读到源文件,可使用l或list命令,看看是否能够列出代码,使用 r/run 命令可以运行程序。
2.寄存器
对于调试来说寄存器中的值也很重要,可以查看到当前正在执行的指令的地址等,具体操作如下:
(1)i r:显示所有寄存器(查看具体寄存器的内容,这里以eax为例:i $ eax)
(2)p $eax:打印eax寄存器的内容
(3)p/c $eax:用字符显示eax寄存器的内容
斜杠后边是显示格式,具体如下:
x 显示为十六进制数
d 显示为十进制数
u 显示为无符号十进制数
o 显示为八进制数
t 显示为二进制数
a 显示为地址
c 显示为字符(ASCII)
f 显示为浮点小数
s 显示为字符串
i 显示为机器语言(仅在显示内存的x命令中可用)
3.对变量的操作
(1)p <变量名>:打印变量
(2)set var <变量>=<表达式>:将变量的值设定为指定表达式的值
(3)print <变量> = <表达式>:查看并修改变量
4.断点
在gdb中用break命令来设置断点,设置断点的方法包括:
b <函数名>:对当前正在执行的文件中的指定函数设置断点。
b <行号>:对当前正在执行的文件中的特定行设置断点。
b <文件名:行号>:对指定文件的指定行设置断点。最常用的设置断点方式。
b <文件名:函数名>:对指定文件的指定函数设置断点。
b <+/-偏移量>:当前指令行+/-偏移量出设置断点。可简写为:b <+/-偏移量>
b <*地址>:指定地址处设置断点。
tb<函数名>:设置临时断点,只生效一次。
查看、删除断点
i b:显示所有断点以及监视点
d <编号>:删除编号指向的断点或者监视点
c <行号>:删除改行的断点。
c <文件名:行号>:删除某个文件的改行的断点
5.监视点
Watch <表达式>:表达式发生变化时暂停
awatch <表达式>:表达式访问或者改变时暂停
rwatch <表达式>:表达式被访问时暂停
info watchpoints:列出当前所设置的所有监视点
6.list命令:
l n:显示程序第n行周围的代码
l <函数名>:显示该函数的源程序
list:显示当前行后面的代码
list -:显示当前行前面的代码
7.单步命令:
(1)next <行数>(简写 n <行数>):单步跟踪,如果有函数调用,不会进入函数内部。next 后边不加行数表示逐条执行,加上行数,表示执行后边的指定行数的指令,然后载停止。(s:也是单步执行遇到函数调用会进入函数内部)
(2)until(简写:u):可以运行程序直到退出循环体
(3)continue(简写:c,fg命令同continue):当程序被停住后,使用该命令恢复程序的运行直到程序结束,或到达下一个断点