当我们在linux中使用gcc编译器出来的可执行程序时,有的时候对程序的执行过程以及变量的值不明确的时候,此时只能够修改源代码,使用输出的时候显的很不方便。每次修改都需要编译、链接等。就是缺少一些帮助我们调试的工具,那么本文主要介绍的就是gdb这个调试工具的使用,希望对大家有所帮助,有不足的地方还请补充和改正。
gdb中的命令主要分为以下几类:工作环境相关命令、设置断点与恢复命令、源代码查看命令、查看运行数据相关命令及修改运行参数命令。
一、工作环境相关的命令
命 令 格 式 | 含义 |
set args运行时的参数 | 指定运行时参数,如:set args 2 |
show args | 查看设置好的运行参数 |
path dir | 设定程序的运行路径 |
show paths | 查看程序的运行路径 |
set enVironment var [=value] | 设置环境 |
show enVironment [var] | 查看环境变量 |
cd dir | 进入到dir目录,相当于shell中的cd命令 |
pwd | 显示当前工作目录 |
shell command | 运行shell的command命令 |
二、设置断点与恢复命令
命 令 格 式 | 含义 |
bnfo b | 查看所设断点 |
break 行号或函数名 <条件表达式> | 设置断点 |
tbreak 行号或函数名 <条件表达式> | 设置临时断点,到达后被自动删除 |
delete [断点号] | 删除指定断点,其断点号为”info b”中的第一栏。若缺省断点号则删除所有断点 |
disable [断点号]] | 停止指定断点,使用”info b”仍能查看此断点。同delete一样,省断点号则停止所有断点 |
enable [断点号] | 激活指定断点,即激活被disable停止的断点 |
condition [断点号] <条件表达式> | 修改对应断点的条件 |
ignore [断点号]<num> | 在程序执行中,忽略对应断点num次 |
step | 单步恢复程序运行,且进入函数调用 |
next | 单步恢复程序运行,但不进入函数调用 |
finish | 运行程序,直到当前函数完成返回 |
c | 继续执行函数,直到函数结束或遇到新的断点 |
三、gdb中源码查看的命令
命 令 格 式 | 含义 |
list <行号>|<函数名> | 查看指定位置代码 |
file [文件名] | 加载指定文件 |
forward-search 正则表达式 | 源代码前向搜索 |
reverse-search 正则表达式 | 源代码后向搜索 |
dir dir | 停止路径名 |
show directories | 显示定义了的源文件搜索路径 |
info line | 显示加载到Gdb内存中的代码 |
四、gdb中查看运行数据相关的命令
命 令 格 式 | 含义 |
print 表达式|变量 | 查看程序运行时对应表达式和变量的值 |
x <n/f/u> | 查看内存变量内容。其中n为整数表示显示内存的长度,f表示显示的格式,u表示从当前地址往后请求显示的字节数 |
display 表达式 | 设定在单步运行或其他情况中,自动显示的对应表达式的内容 |
下面重点对于内存数据的查看做一个简单的介绍:
格式:x /nfu
说明: x 是检查的意思 、n表示要显示的内存单元的个数 、f表示显示方式
(1) f的取值如下所示:
(2) u的取值如下:
以上分别显示20个从内存地址0x0000 7fff ffff 3672开始的以十六进制和字符格式显示的单字节数据。很明显按找字符显示的可以直接看出存储的字符串是什么。
注意:对于内存的存储是有大小端的问题,字符串一般都是以'\0'结束的,而'\0'对于的ascii是0。此时我使用的机器是mips的,所以以小端方式存储数据,也就是低地址存放低字节;
大端(EB)是高地址对应的低字节,低地址对应高字节;
小端(EL)是低地址对应低字节,高地址对应高字节;
这两种方式,不管是从内存到寄存器取数据,还是从寄存器往内存存数据都是一样的,只能使用一种方式。
五、gdb中修改运行参数相关的命令
Gdb还可以修改运行时的参数,并使该变量按照用户当前输入的值继续运行。它的设置方法为:在单步执行的过程中,键入命令“set 变量=设定值”。这样,在此之后,程序就会按照该设定的值运行了。
注意:在使用gdb调试的时候,编译生成的可执行程序时一定要加入"-g"参数,才能够调试。设置好断点后,程序就会执行到断点处停止,对于变量、寄存器中的内容都是可以查看的。