GDB命令自动补充和常见命令的使用

这个章节主要讲的是命令格式的自动补全功能和常见命令的使用,常见的命令指的是调试阶段经常会使用到的命令。

命令的自动补全

GDB中支持命令的自动补充,包括补全命令(显示出完整格式的命令)和列举命令所有参数的候选项。使用时需要双击 Tab 键。

1.对于补全完整的命令格式来说,如果存在有且只有一个可能的命令,那么命令就会被自动补全。例如:

(gdb) info bre<TAB>                                  

双击 TAB 键就会补全剩余的部分,因为 info 子命令中只有 breakpiont 以‘bre’开头:

(gdb) info breakpiont

 如果存在候选项不止一个,那么就会列举出所有可能的命令候选项。例如:

(gdb) con <Tab>
(gdb) con
condition continue

2.列举命令所有参数的候选项,例如:

(gdb) catch <TAB>                //双击TAB键,候补的选项不止包含一个,会把可能的选项列举出来。
(gdb) catch
assert     exception  fork       load       signal     throw      vfork
catch      exec       handlers   rethrow    syscall    unload

常见的命令的使用

下面介绍的命令都是我们在程序调试阶段经常使用的,下面的都是对这些命令做一些简单的介绍,后面会有更加详细的介绍。

1.查看源码使用 list 命令,使用方式展示如下:

list

使用 list 命令就可以查看源程序的代码,默认显示 10 行。命令缩写为 l。

2.设置断点使用到 break 命令,调试程序基本上都是在程序的运行阶段,使用这个命令可以使程序产生中断,方便我们调试。使用方式展示如下:

break (breakpoint)             //若没有参数则停在下一条指令处
break filename : [location]                    //在源文件 filename 的 location 处停住,location 可以表示源文件的某一行,函数名或者是一个地址。
break [location] if [condition]                  //条件判断,在条件成立时设置中断,condition 表示条件。

查看断点,可以使用命令:

info break

3.设置观察点,使用到命令 watch ,观察点一般观察某个表达式的值是否发生变化,如果有变化,会马上停住程序。使用方式展示如下:

watch [expression]                      //expression 表示一个表达式

4.运行程序使用到 run 命令,使用方式展示如下:

run app [argv1] [argv2] ...

run命令后跟随发给该程序的任何参数,包括标准输入和标准输出说明符(<>)和通配符(*,?,[])在内。
 
5.打印变量信息使用到 print 命令,使用方式展示如下:

print /format                    //format 表示的是打印输出的格式。

格式符号如下:
x:将数据作为整数数据,并以十六进制打印。
d:打印带符号整型数据
u:打印以无符号整形数据
o:以八进制打印整型数据
t:以二进制打印整形
a:打印地址,打印16进制的绝对地址和最近符号的偏移量。可以用这个格式找出一个未知地址位于何处,找到函数地址,实例:

(gdb) print /a 0x123456
$3 = 0x123456<_initialize_vx + 369>

6.继续执行命令使用到 finish 命令和 continue 命令。finish 和 continue 的区别:

finish:运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息
continue [ignore-count] :恢复程序运行,直到程序结束或是下一个断点到来。ignore-count 表示忽略其后的断点次数。continue,c,fg三个命令意思相同。

7.单步执行使用 next 与 step 命令,step与next的区别 :

step:一行一行执行,遇到函数时,调到函数内运行
next:一行一行执行,遇到函数时,调过函数运行,不会进入函数。

8.退出GDB调试工具使用命令:

quit