Linux中的C/C++语言调试工具 GDB
GDB(GNU Debugger)是一个功能强大的调试器,用于调试和分析程序的执行过程。它是GNU项目的一部分,可以在多个操作系统上使用,包括Linux、Unix和Windows。
GDB主要用于调试编译后的可执行文件,它可以帮助程序开发人员识别和修复代码中的错误、追踪程序的执行流程、观察和修改程序的状态,以及分析程序崩溃时的堆栈跟踪信息。
Linux下最常用的调试工具就是GDB。
目录
- Linux中的C/C++语言调试工具 GDB
- 1.安装GDB
- 2.使用GDB
- 2.1启动与退出
- 2.2装入调试程序
- 2.3列出源代码
- 2.4执行程序
- 3.设置与管理断点
- 3.1 设置断点
- 3.2查看断点信息
- 3.3删除断点信息
- 3.4设置观察点
- 4.显示数据和修改变量值
- 4.1显示变量或表达式的值
- 4.2 自动显示变量或表达式的值
- 4.3修改变量的值
- 5.执行命令和调用函数
- 5.1单步执行
- 5.2退出被调用的函数
- 6.其他
- 6.1帮助手册
- 6.2 查看堆栈信息
- 6.3 查看程序的汇编代码
1.安装GDB
sudo apt-get install gdb
2.使用GDB
2.1启动与退出
启动
$gdb
使用quit命令(简写成q)退出
$(gdb)q
2.2装入调试程序
首先写一个C语言程序
/*a.c*/
#include<stdio.h>
void show(int i){
printf("this is %d\n",i);
}
int main(){
int i=0;
int j=9;
for(i=1;i<=j;i++)
show(i);
return 0;
}
对上面的代码进行编译连接
gcc -g a.c -o a
在调试程序之前必须先得在gdb中装入调试程序,根据装入调试程序的时间分为两种:
-
在启动gdb时,进行装入:
$gdb a
-
在启动gdb之后,进行装入:
(gdb) file a
2.3列出源代码
程序转入gdb之后,可以使用list命令(可以简写成l)将源码列出。
(gdb) list
默认情况下只会显示前10行的代码,如果程序代码量过多,可以继续使用list命令显示后面的代码。
2.4执行程序
执行命令时run(可以简写成r)。可以在run命令之后可以加入执行参数来执行相关的操作。
(gdb) run
目前没有添加断点,所以程序直接输出了运行结果。若添加了断点,则会在断点的位置进行停止。
3.设置与管理断点
3.1 设置断点
设置断点的命令是 break(可以简写成b)。一般设置形式:
break 行号
设置完断点以后,利用run命令执行程序。
-
利用break设置断点时,也可以添加条件进行判断
break 行号 if语句
当程序在断点处停下来了,可以使用continue命令(可以简写成c),继续执行程序。
(gdb) continue
3.2查看断点信息
加入断点之后,可以利用 info break命令进行查看设置的断点信息。可以看到在断点的编号、类型、地址等信息。
(gdb) info break
3.3删除断点信息
利用delete命令(可以简写成d)进行删除之前设置的断点。
delete 断点编号
删除指定范围内的断点也可以使用
delete 起始断点编号-终点断点编号
也可以删除指定行上的断点,利用clear命令进行删除
(gdb) clear 行号
3.4设置观察点
观察点也称数据断点,顾名思义就是用来观察某个变量或者表达式的变化,如果有变化,则暂停程序的运行,这在调试程序中时非常常见的。设置观察点的命令为 watch,后面跟变量过着表达式。·
(gdb) watch 变量或表达式
可以利用info watchpoints命令来查看当前设置的所有观察点。
可以使用delete命令来删除指定的观察点。
4.显示数据和修改变量值
4.1显示变量或表达式的值
在调试程序的过程中,查看变量或则表达式的值是一个有效的方法。
在GDB中,可以用print命令(可以简写成p)来显示。
(gdb) print 变量或表达式
4.2 自动显示变量或表达式的值
若我们需要持续性观察一个变量或表达式的值,可以使用display命令,设置为自动显示。
(gdb) dispaly 变量
4.3修改变量的值
在调试程序中,我们可以通过修改某一个变量的值来验证代码的准确性。
set命令
(gdb) set 变量=值
5.执行命令和调用函数
为了方便后面的演示,现在新建一个b.c代码文件。
/*b.c*/
#include<stdio.h>
void show(){
printf("1+2+3= ");
}
int main(){
int i=0;
int sum=0;
for(i;i<=3;i++)
sum+=i;
show();
printf("%d\n",sum);
return 0;
}
编译成可执行文件,并载入gdb中,方便后续演示。
$gcc -g b.c -o b
$gdb b
5.1单步执行
单步执行就是一步一步跟踪程序的执行的流程,根据变量的值,找到错误的原因。这是在程序调用中的常见的操作。
GDB中可以使用step(可以简写成s)或next(可以简写成n)来单步执行程序。
step命令可以跟踪进入函数内部;next命令会将函数看作一条语句,不进入函数内部。
5.2退出被调用的函数
当利用step命令进入函数内部时,如果需要忽略剩下的函数语句,并继续向下执行,可以执行return命令跳出函数,
return命令后面可以跟变量或表达式。
6.其他
6.1帮助手册
GDB中设置了帮助手册,不清楚的命令可以利用help来获取帮助。
6.2 查看堆栈信息
利用backtrack(可以简写成bt)和frame(可以简写f)命令查看栈的信息。
6.3 查看程序的汇编代码
可以利用disassemble命令来显示程序的汇编代码。
void show(){
printf("1+2+3= ");
}