目录
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工作环境的相关命令
命令模式 | 含义 |
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设置断点与恢复相关命令
命令格式 | 含义 |
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中源码查看的相关命令
命令格式 | 含义 |
list<行号>|<函数名> | 查看指定位置代码 |
file[文件名] | 加载指定文件 |
forward-search正则表达式 | 源代码前向搜索 |
reverse-search正则表达式 | 源代码向后搜索 |
dir directory | 停止路径名 |
show directories | 显示定义了源文件搜索路径 |
info line | 显示加载高GDB内存中的代码 |
(9)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的最新版)