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= ");
}
 




![[Diffusion] Speed is all your need](https://img-blog.csdnimg.cn/c6dba39d973641f38bb3a8df56df4d92.png)















