Linux下编写C使用的GDB调试器

发布于:2022-11-28 ⋅ 阅读:(196) ⋅ 点赞:(0)

目录

1.GDB调试器

2.GDB使用

3.实例程序调试

(1)编写一段C程序

(2)对C程序进行编译

(3)调试阶段

①启动调试

②查看文件

③设置断点

④查看断点情况

⑤运行代码

⑥单步运行

⑦恢复程序

⑧查看变量值

⑨查看函数栈,退出函数和退出GDB

(4)GDB工作环境的相关命令

(7)GDB设置断点与恢复相关命令 

(8)GDB中源码查看的相关命令

(9)GDB中查看运行数据的相关命令

(10)修改运行参数的相关命令 

(11)GDBServer远程调试


Ubuntu中关于C介绍以及编写C程序

1.GDB调试器

在windows下面我们常使用的调试主要有VC和VS等IDE环境,但是在Linux下,GDB调试器甚至有比VC和VS的图形化调试器更加的强大的功能。

GDB调试器主要完成的功能(其他的调试器也一样):

  • 启动程序,可以按照用户自定义的要求随心所欲地运行程序;
  • 可以让被调试的程序在用户所指定的调试断点处停止;
  • 当程序停住的时候,可以检查此时程序中所发生的具体事情;
  • 动态的改变程序的执行环境;

2.GDB使用

GDB主要调试的是C/C++程序:

  • 第一步:首先要将调试信息加到可执行文件中,可以使用CC/GCC/G++编译器:
  • 输入:gcc -g [源文件] - o [目标文件]

其中:-g主要是用于查看程序函数名和变量名。

启动GDB方法:

  • gdb<program>:program指的是可执行文件,一般在当前目录之下;
  • gdb<program>core:使用GDB同时调试一个运行程序和core文件,其中core是程序非法执行后,core dump后产生的文件;
  • gdb<program><PID>:如果是一个服务程序,那么可以指定这个服务程序运行时进行ID。GDB会自动attach上去,并调试它。program应该在PATH环境变量中搜索得到的。

3.实例程序调试

(1)编写一段C程序

新建文件:touch demo1.c

编写C程序:sudo gedit demo1.c

(2)对C程序进行编译

 sudo gcc -o demo1.o -g demo1.c 

提示:使用这样编译出的可执行代码中才会包含调试信息。 

(3)调试阶段

调试阶段选项
选项 说明
l(list) 查看编写的源文件代码
b(break) 设置断点,在b后面输入行号,表示设置断点的位置
info break 查看断点信息情况
r(run) 运行代码
n(next)或者s(step) 单步运行,其中n表示如果存在函数的话,那么使用n将不会进入函数,而s则会进入函数。
c(continue) 恢复程序运行,如果跳到下一个断点处,如果没有断点,那么会把剩余的未执行完的程序执行完
p+变量值 查看断点处的相关变量
bt 查看函数堆栈
finish 退出函数
q 退出GDB调试

①启动调试

启动调试:gdb demo1.o(注意这里是可执行文件.o)

  

②查看文件

③设置断点

 

④查看断点情况

 

⑤运行代码

 

⑥单步运行

 

⑦恢复程序

 

⑧查看变量值

 

⑨查看函数栈,退出函数和退出GDB

 

(4)GDB工作环境的相关命令

 

GDB工作环境相关命令
命令模式 含义
set args 指定运行参数,如set args2
show args 查看配置好的运行参数
path dir 设置程序的运行路径
show paths 查看程序的运行路径
Set en Virommen var [= value] 设置环境变量
show en Viromment [var] 查看环境变量
cd dir 进入dir目录,相当于shell中的cd命令
pwd  显示当前工作目录
shell command 运行shell的command命令

(7)GDB设置断点与恢复相关命令 

GDB设置断点与恢复相关命令
命令格式 含义
info b 查看所设置的断点
break行号或者函数名<条件表达式> 设置断点
threak行号或者函数名<条件表达式> 设置临时断点,达到后自动
delete[断点号] 删除指定断点,,若默认断点号,则删除所有的断点
disable[断点号] 停止指定断点,使用info b仍然可以查看断点,默认使用断点号,则停止所有的断点号
enable[断点号] 激活指定断点,即激活被disable停止的断点
condition[断点号]<条件表达式> 修改对应的条件
lgnore[断点号]<num> 在程序执行中,忽略对应断点num次(不如ignore 12,我现在忽略12行的断点num次)
step 单步恢复程序运行,且进入函数调用
next 单步恢复程序运行,但不进入函数调用
finish 运行程序,直到当前函数完成返回
c 继续执行函数,直到函数结束或遇到新的断点

设置条件断点:b 7 if i==10(b行数或者函数名if表达式)

(8)GDB中源码查看的相关命令

GDB中源码查看的相关命令
命令格式 含义
list<行号>|<函数名> 查看指定位置代码
file[文件名] 加载指定文件
forward-search正则表达式 源代码前向搜索
reverse-search正则表达式 源代码向后搜索
dir directory 停止路径名
show directories 显示定义了源文件搜索路径
info line 显示加载高GDB内存中的代码

(9)GDB中查看运行数据的相关命令

GDB中查看运行数据的相关命令
命令格式 含义
print表达式|变量 查看程序运行时对应表达式和变量的值
x<n/f/u> 查看内存变量内容,其中n为整数表示显示内存的长度,f表示显示的格式,u表示从当前地址往后请求显示的字符数
display表达式 设定在单步运行或者其他情况中,自动显示对应表达式的内容

(10)修改运行参数的相关命令 

(11)GDBServer远程调试

 由于在嵌入式软件开发环境中,目标机和宿主机中程序运行的环境不一样,当调试嵌入式程序时,使用上面给出的方法已经不行了。因此需要用远程调试的方式来进行。

当远程调试环境由宿主机GDB和目标机调试stub公共构成,两者通过串口或者TCP连接。

使用GDB标准串行协议协同工作,实现对目标机上的系统内核和上层应用的监控和调试功能。

GDB stub是调试器的核心,它处理来自主机上GDB的请求,控制目标机上的被调试进程。

目前嵌入式Linux系统中的主要三种远程调试方法:

  • 用ROM Monitor调试目标机程序
  • 用KGDB调试系统内核
  • 用Gdb-Server是GDB的一个组件(通常不随发行版一起发布,需要用户自行编译GDB的源代码包得到相应的GDB和GdbServer。从http://sourceware.org/gdb/gdb/获得GDB的最新版)

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到