linux之GDB调试的基本使用

一、GDB介绍

GDN是一套字符界面的程序集,可以用在Linux上调试C和C++程序。

二、GDB主要功能

1.在程序中设置断点,当程序运行到断点处可以停止

2.跟踪某个变量,也可以打印或者监视某个变量,并将其值显示出来

3.可单步执行代码

4.监控线程切换

三、测试代码

#include <stdio.h>
#include <stdlib.h>
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的使用

1.使用前提

使用GDB调试进行程序调试,必须在用gcc编译代码时添加“-g”选项“-g”选项的作用是在可执行文件中加入源文件信息,但并不是将源文件嵌入可执行文件,所以在调试时必须保证gdb必须能找到源文件.

2.进入GDB模式

1)终端命令行输入gdb,进入GDB命令行模式后,使用file命令打开文件

注:使用gdb命令可以添加“-q”选项屏蔽上面这些打印信息。

2)终端命令行使用gdb命令直接打开文件(推荐)

3.GDB常用命令

1)list/l:用来查看源代码(默认显示10行,回车会显示接下来的10行)

①show listsize:显示当前list命令显示行参数

②set listsize <count>:修改list命令显示行参数

③list <n>,<m>:显示n-m行的内容,不受默认显示行参数的限值

④list <函数名>:显示某个函数周围的代码,显示范围和list的显示行参数有关

⑤list 文件名:<n>,<m>:显示某个文件(链接过的文件)的第n行到第m行的代码(较常用于调试多文件程序)

2)shell <linux指令>:在gdb模式下使用linux命令

例如:
shell clear

3)break/b:设置断点

①break/b <n>:在第n行设置断点

注:第二行的解释:断点1所在的内存地址为0x7ad,它被设置在了文件test.c的第11行

②break/b <n> <条件>:在第n行设置断点,只有在条件成立时才会触发

注:如果add的值为5,则程序运行到14行时停止。

③break/b <函数名>:在某个函数处设置断点

④info b/break/breakpoint

Num表示断点的编号;Type表示断点的类型;Disp表示中断点在执行一次之后是否是去作用,dis为是,

keep为不是;Enb表示当前中断点是否使能,y是使能,n为未使能;Address表示中断点所处的内存地址;

what表示中断点所处的位置。

4)删除断点

①clear <n>:删除出于第n行的断点

②delete <n>:删除第n个断点

注:clear命令后面的参数为设置断点的行号,clear后面的参数还可以跟设置断点的函数名

delete命令后面的参数为断点的编号;可以一次删除多个断点,断点之间用空格隔开;

单独使用delete,后面不加参数时,是删除所有断点,会给出选择是否操作选项

5)set args <参数值1> <参数值2> <参数值3>....:设置输入参数的值

6)run/r:运行程序

7)continue/c:遇到断点后让程序继续执行

8)step:是单步执行,遇到子函数就进入并且继续单步执行(进入函数调用)

9)next:单步执行,把调用语句当成一条语句,直接执行到调用语句的下一条语句(跳过函数调用)

10)watch:设置观察点,用来观察某个表达式或变量的值是否发生变化,如果有变化,马上停住程序

 

4.GDB变量调试命令

1)print/p:打印某个变量的值

2)set var 变量名 = 变量值 或 print/p 变量名 = 变量值:改变某个变量的值

 

5.GDB函数调用栈调试命令

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

猜你喜欢

转载自blog.csdn.net/isco22/article/details/89090378