GDN是一套字符界面的程序集,可以用在Linux上调试C和C++程序。
1.在程序中设置断点,当程序运行到断点处可以停止
2.跟踪某个变量,也可以打印或者监视某个变量,并将其值显示出来
3.可单步执行代码
4.监控线程切换
#include
#include
int f_add(int a,int b)
{
return a+b;
}
int main(int argc,char **argv)
{
int val;
printf("input a number:");
scanf("%d",&val);
int arg=atoi(argv[1]);
int add=f_add(val,arg);
printf("add = %d\n",add);
return 0;
}
使用GDB调试进行程序调试,必须在用gcc编译代码时添加“-g”选项:“-g”选项的作用是在可执行文件中加入源文件信息,但并不是将源文件嵌入可执行文件,所以在调试时必须保证gdb必须能找到源文件.
1)终端命令行输入gdb,进入GDB命令行模式后,使用file命令打开文件
注:使用gdb命令可以添加“-q”选项,屏蔽上面这些打印信息。
2)终端命令行使用gdb命令直接打开文件(推荐)
1)list/l:用来查看源代码(默认显示10行,回车会显示接下来的10行)
①show listsize:显示当前list命令显示行参数
②set listsize
③list
④list <函数名>:显示某个函数周围的代码,显示范围和list的显示行参数有关
⑤list 文件名:
2)shell
例如:
shell clear
3)break/b:设置断点
①break/b
注:第二行的解释:断点1所在的内存地址为0x7ad,它被设置在了文件test.c的第11行
②break/b
注:如果add的值为5,则程序运行到14行时停止。
③break/b <函数名>:在某个函数处设置断点
④info b/break/breakpoint
Num表示断点的编号;Type表示断点的类型;Disp表示中断点在执行一次之后是否是去作用,dis为是,
keep为不是;Enb表示当前中断点是否使能,y是使能,n为未使能;Address表示中断点所处的内存地址;
what表示中断点所处的位置。
4)删除断点
①clear
②delete
注:clear命令后面的参数为设置断点的行号,clear后面的参数还可以跟设置断点的函数名
delete命令后面的参数为断点的编号;可以一次删除多个断点,断点之间用空格隔开;
单独使用delete,后面不加参数时,是删除所有断点,会给出选择是否操作选项
5)set args <参数值1> <参数值2> <参数值3>....:设置输入参数的值
6)run/r:运行程序
7)continue/c:遇到断点后让程序继续执行
8)step:是单步执行,遇到子函数就进入并且继续单步执行(进入函数调用)
9)next:单步执行,把调用语句当成一条语句,直接执行到调用语句的下一条语句(跳过函数调用)
10)watch:设置观察点,用来观察某个表达式或变量的值是否发生变化,如果有变化,马上停住程序
1)print/p:打印某个变量的值
2)set var 变量名 = 变量值 或 print/p 变量名 = 变量值:改变某个变量的值
1)backtrace|bt:查看函数的信息
2)info args:查看当前函数参考值
3)x /nfu ptr:
用gdb查看内存格式:
x /nfu ptr
说明
x 是 examine 的缩写
n表示要显示的内存单元的个数
f表示显示方式, 可取如下值
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。
u表示一个地址单元的长度
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节
Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),
t(binary), f(float), a(address), i(instruction), c(char) and s(string).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes)
ptr 表示从那个地址开始
参考学习:https://blog.csdn.net/xiang90721/article/details/53115778
https://www.cnblogs.com/kunhu/p/3603268.html
https://www.cnblogs.com/kingos/p/4514756.html