Linux中的C/C++语言调试工具 GDB

14 篇文章 0 订阅

Linux中的C/C++语言调试工具 GDB

GDB(GNU Debugger)是一个功能强大的调试器,用于调试和分析程序的执行过程。它是GNU项目的一部分,可以在多个操作系统上使用,包括Linux、Unix和Windows。

GDB主要用于调试编译后的可执行文件,它可以帮助程序开发人员识别和修复代码中的错误、追踪程序的执行流程、观察和修改程序的状态,以及分析程序崩溃时的堆栈跟踪信息。

Linux下最常用的调试工具就是GDB。

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

请添加图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值