1.简介
gdb调试工具是一款GNU开发组织并发布的UNIX/Linux下的程序调试工具。虽然,它没有图形化的友好界面,但是它强大的功能也是足以与微软Visual Studio等工具媲美的。
2.gdb使用流程
(1)首先编辑一段c代码,如下所示:
/*test.c*/
#include <stdio.h>
int sum(int );
int main()
{
int i,n = 0;
sum(50);
for(i=1;i<=50;i++)
{
n += i;
}
printf("Then sum for 1-50 is %d\n",n);
}
int sum(int m)
{
int i,n = 0;
for(i=1;i<=m;i++)
{
n += i;
}
printf("Then sum of 1-m is %d\n",n);
}
(2)编译命令:gcc -g test.c -o test(注意:一定要加上选项“-g”,这样编译出的可执行代码中才包含调试信息,否则之后gdb无法载入该可执行文件)
(3)启动gdb命令:gdb test(注意:test是可执行文件,不是c文件test.c)
(4)查看文件:在gdb中键入“l”或“list”,gdb会显示行号
(5)设置断点:在gdb中键入“b 8”或“break 8”,表示在第8行设置断点
(6)查看断点:在gdb中键入“info b”,表示查看设置的所有断点
(7)运行代码:在gdb中键入“r”或“run”,运行代码后,代码停留在先前设置的断点处
(8)查看变量值:在gdb中键入“p n”或“print n”,表示查看变量n的值
(9)单步运行:在gdb中键入“n”(next)或“s”(step)都表示单步运行,两者的区别在于“s”会进入函数而“n”不会进入函数,类似于Visual C++的“step in”和“step over”
(10)恢复程序运行:在gdb中键入“c”或“continue”,表示程序继续运行
3.gdb基本命令
(1)工作环境相关命令
gdb中不仅可以调试所运行的程序,而且还可以对程序相关的工作环境进行相应的设定,甚至还可以使用shell中的命令进行相关的操作。
命令格式 | 含义 |
---|---|
set args运行时的参数 | 指定运行时参数,如set args 2 |
show args | 查看设置好的运行参数 |
path dir | 设定程序的运行路径 |
show paths | 查看程序的运行路径 |
set enviroment var [=value] | 设置环境变量 |
show enviroment [var] | 查看环境变量 |
cd dir | 进入dir目录,相当于shell中的cd命令 |
pwd | 显示当前工作目录 |
shell command | 运行shell的command命令 |
(2)设置断点与恢复命令
命令格式 | 含义 |
---|---|
info b | 查看所设断点 |
break [文件名:] 行号或函数名 <条件表达式> | 设置断点 |
tbreak [文件名:] 行号或函数名 <条件表达式> | 设置临时断点,到达后被自动删除 |
delete [断点号] | 删除指定断点,其断点号为“info b”中的第一栏。若默认断点号则删除所有断点 |
disable [断点号] | 停止指定断点,使用“info b”仍能查看此断点。同delete一样,若默认断点号则停止所有断点 |
enable [断点号] | 激活指定断点,即激活被disable停止的端点 |
condition [断点号] <条件表达式> | 修改对应端点的条件 |
ignore [断点号] <num> | 在程序执行中,忽略对应断点num次 |
step | 单步恢复程序运行,且进入函数调用 |
next | 单步恢复程序运行,但不进入函数调用 |
finish | 运行程序,直到当前函数完成返回 |
c | 继续执行函数,直到函数结束或遇到新的断点 |
两种设置断点的方法:
①函数断点:gdb中按行数设置断点只需要把函数名列在命令“b”之后,如下所示:
②条件断点:gdb中设置条件断点的格式为:b 行数或函数名if表达式
(3)gdb中源码查看相关命令
命令格式 | 含义 |
---|---|
list <行号>|<函数名> | 查看指定位置代码 |
file [文件名] | 加载指定文件 |
forward-search 正则表达式 | 源代码的前向指定文件 |
reverse-search 正则表达式 | 源代码的后向指定文件 |
dir DIR | 将路径DIR添加到源文件搜索的路径的开头 |
show directories | 显示源文件的当前搜索路径 |
info line | 显示加载到gdb内存中的代码 |
(4)gdb中查看运行数据相关命令
gdb中查看运行数据是指当前程序处于“运行”或“暂停”状态时,可以查看的变量及表达式的信息。
命令格式 | 含义 |
---|---|
print 表达式|变量 | 查看程序运行时对应表达式和变量的值 |
x <n/f/u> | 查看内存变量内容。其中n为整数表示显示内存的长度,f表示显示的格式,u表示从当前地址往后请求显示的字节数 |
display 表达式 | 设定在单步运行或其他情况中,自动显示的对应表达式的内容 |
backtrace | 查看当前栈的情况,即可以查到哪些被调用的函数尚未返回 |
(5)gdb中修改运行参数相关命令
gdb还可以修改运行时的参数,并使该变量按照用户当前输入的值继续运行。它的设置方法为:在单步执行的过程中,键入命令“set var 变量=设定值”。这样,在此之后,程序就会按照该设定的值运行了。