Linux调试工具GDB(1)

简介: Linux调试工具GDB(1)

前言

本篇文章我们来介绍一下Linux中的调试利器GDB工具,在Linux的调试中GDB可以帮助我们来解决非常多的问题。


一、GDB概念

GDB是一个功能强大的调试工具,可以用于分析程序崩溃,跟踪程序执行过程,查看内存和寄存器状态等。以下是使用 GDB 进行基本调试的步骤和命令:

1.编译程序并使用 -g 参数开启调试信息

在使用 GDB 进行调试前,需要在编译程序时添加 -g 参数开启调试信息。

gcc -g -o program program.c

2.启动GDB

在 shell 中输入 gdb 命令来启动 GDB 调试器,并将编译的程序作为参数传递给 GDB。

gdb program

3.设置断点

使用 break 命令设置断点,可以暂停程序的执行并进入调试模式。

(gdb) break main

4.运行程序

使用 run 命令运行程序,并执行到设定的断点处。程序停止运行并在 GDB 控制台显示为 (gdb)。

(gdb) run

5.打印变量值

使用 print 命令可以查看变量的值。

(gdb) print variable_name

6.单步执行

使用 step 命令执行程序的当前行,并进入函数的内部。

(gdb) step

7.继续执行

使用 continue 命令继续执行程序,直到程序结束或下一个断点位置。

(gdb) continue

8.进入汇编模式

使用 disassemble 命令可以在 GDB 控制台显示当前代码的汇编指令。

(gdb) disassemble

9.退出 GDB

使用 quit 命令可以退出 GDB 调试器。

(gdb) quit

以上是 GDB 的一些基本命令和使用方法,如果需要更多命令,请查阅 GDB 的官方文档或者使用 help 命令查看 GDB 命令列表。


二、GDB具体使用方法

首先编写一个测试代码:

#include <stdio.h>
int *g_pointer;
void func(void)
{
    *g_pointer = (int)"Hello World";
}
int main(void)
{
    func();
    return 0;
}

编译时加上-g选项:

运行程序:

运行后直接崩溃了,这个时候我们就可以来使用GDB来调试我们的代码了。

启动GDB调试后直接就可以找到问题出现的地方了:

GDB也可以传递参数:

#include <stdio.h>
int main(int argc, char** argv)
{
    printf("argv : %s\n", argv[0]);
    printf("argv : %s\n", argv[1]);
    printf("argv : %s\n", argv[2]);
    return 0;
}

执行GDB命令传递参数:

这样传递参数的方式相当于:

在执行GDB来让程序运行的时候也可以使用ctrl加c来打断程序的执行。使用continue来让程序继续运行:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv)
{
    int i = 0;
    for(i = 0; i < 10; i++)
    {
        printf("i = %d\n", i);
        sleep(1);
    }
    return 0;
}

三、GDB断点类型

软件断点:

软件断点也称为“内存断点”,这类断点是通过修改对应指令的内存地址进行实现的。换句话说,这些断点不会占用处理器的硬件资源。因此,在同一时间点上,GDB 可以设置许多软件断点,而不用担心硬件反应带来的性能开销。

当程序执行到设定断点的地址时,会首先检查这个地址是否被设置了断点,如若设置了,CPU会停下来执行相应的调试操作。由于软件断点是通过对指令地址进行修改实现的,因此断点会覆盖指令地址,并且在断点被移除之后,程序可以恢复执行。

硬件断点:

硬件断点是由调试器设置的硬件的断点条件。它利用处理器的硬件调试功能,避免了软件断点导致增加程序的执行开销。硬件断点是设置在程序指令地址上的,使用了特殊的断点寄存器来识别局部读写操作。

数据断点:

数据断点也称为“监视点”,是一种特殊的硬件断点,用于监视内存中特定的变量或内存地址。当被监视的变量或内存地址被读或写时,GDB 便会停下程序以进行调试。

设置软件断点:

在 GDB 中,可以通过 break 命令来设置软件断点。具体语法为:

break [location]

其中,location 可以是代码行号、函数名、函数地址等。例如:

(gdb) break main.c:10  # 在 main.c 文件的第 10 行设置断点
(gdb) break function   # 在 function 函数入口处设置断点
(gdb) break *address   # 在地址为 address 处设置断点

如果省略 location,则会在当前行设置断点:

(gdb) break   # 在当前行设置断点

设置断点后,可以使用 run 命令运行程序。当程序执行到断点处时,程序会停止执行,并进入 GDB 调试界面。

使用next可以执行下一条语句

使用info breakpoints命令可以查看到当前的断点信息:

使用delete可以删除断点:

删除完成断点后代码就会向下执行了。

通过print命令可以查看到变量的信息:

当然了也可以进行变量的设置:

总结

本篇文章我们就讲解到这里,熟练使用GDB工具将给我们带来极大的便利。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
5天前
|
NoSQL Linux 测试技术
Linux开发工具——gdb篇
Linux开发工具——gdb篇
|
5天前
|
NoSQL Java Unix
Linux:调试器 - gdb
Linux:调试器 - gdb
20 1
|
5天前
|
NoSQL Linux 编译器
【Linux】开始使用gdb吧!
这篇文章我们来学习 gdb 的使用方法。我们在Windows端编写代码时有宇宙最强编译器VS2022帮助我们调试,那Linux端有没有一款强大的调试工具呢???
52 17
【Linux】开始使用gdb吧!
|
5天前
|
NoSQL Linux C语言
【Linux】Linux调试器-gdb使用
【Linux】Linux调试器-gdb使用
8 0
|
5天前
|
NoSQL IDE Linux
Linux的学习之路:8、Linux调试器-gdb使用
Linux的学习之路:8、Linux调试器-gdb使用
21 0
|
5天前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
71 2
|
5天前
|
NoSQL Linux 开发工具
【深入解析git和gdb:版本控制与调试利器的终极指南】(下)
【深入解析git和gdb:版本控制与调试利器的终极指南】
|
5天前
|
NoSQL 小程序 C语言
GDB调试学习(四):段错误
GDB调试学习(四):段错误
45 0
|
5天前
|
NoSQL
GDB调试学习(三):观察点
GDB调试学习(三):观察点
45 0
|
5天前
|
NoSQL
GDB调试学习(二):断点
GDB调试学习(二):断点
41 0