Linux调试工具GDB(2)

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

前言

本篇文章我们继续讲解GDB调试

一、数据断点

在 GDB (GNU Debugger) 中,数据断点是一种断点类型,它允许你在程序访问指定内存地址的数据时暂停程序的执行。通过设置数据断点,你可以监视和调试特定内存位置的读取或写入操作。

以下是在 GDB 中设置数据断点的基本用法:

1.启动 GDB 并加载可执行文件:

gdb executable_file

2.选择要设置数据断点的内存地址。你可以使用以下方式之一:

使用变量名或指针来指定内存地址

使用表达式计算所需内存地址

3.使用 watch 命令设置数据断点:

(gdb) watch *address

其中 address 是你选择的内存地址。通过在地址前加上 * 来指示监视该地址的数据访问。

例如,如果你要监视一个 int 类型的变量 x,你可以这样设置数据断点:

(gdb) watch *(&x)

当程序访问被设置为数据断点的内存地址时,程序的执行将暂停,并返回到 GDB 提示符下。

5.在数据断点暂停时,你可以执行各种调试操作,如打印变量值、单步执行、查看回溯信息等。

二、x查看内存命令

在 GDB(GNU Debugger)中,x 命令用于以指定格式打印内存区域的内容。它允许你查看内存中存储的数据,并以不同的格式(例如十六进制、十进制、ASCII 码等)对数据进行呈现。

x 命令的基本语法如下:

x/[显示数量][打印格式] 内存地址

显示数量 是要显示的单位数量,默认为1。

打印格式 是指定要使用的输出格式,例如 x(十六进制)、d(十进制)、o(八进制)、u(无符号十进制)、t(二进制)等。GDB 还支持其他格式选项,可以参考 GDB 的文档了解更多细节。

内存地址 是你要查看的内存区域的地址表达式。

下面是一些示例,演示了不同的使用方式:

(gdb) x address

2.查看一定数量的内存地址的值:

(gdb) x/5 address

首先定义一个大小为5的一维数组:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv)
{
    int i = 0;
    int a[5] = {1, 2, 3, 4, 5};
    for(i = 0; i < 5; i++)
    {
        printf("%d\n", i);
        sleep(1);
    }
    printf("success complte\n");
    return 0;
}

查看一维数组中的数据值:

3.使用不同的打印格式:

(gdb) x/d address   # 十进制格式
(gdb) x/o address   # 八进制格式
(gdb) x/t address   # 二进制格式
(gdb) x/s address   # 字符串格式

4.查看结构体或数组的内存内容:

(gdb) x/4w &struct_var   # 以四个字为单位查看结构体的内容
(gdb) x/16xb &array     # 以字节为单位查看数组的内容

三、深入info命令

在讲解info命令之前我们先来讲解一下step命令:

GDB中的"step"命令用于逐行执行代码并进入函数内部。它允许你以单步模式执行程序,逐行跟踪代码执行过程,包括进入调用的子函数内部。

“step n”:执行完当前行后进入下一个函数调用的内部n次,然后暂停执行,n为整数。

“stepi”:逐指令执行程序,而不是逐行执行。

“finish”:执行到当前函数的结尾,并停在调用该函数的下一行。

这里编写了一个Test函数:

#include <stdio.h>
#include <unistd.h>
int Test(int a, int b)
{
    int c = a + b;
    return c;
}
int main(int argc, char** argv)
{
    int i = 0;
    Test(2, 3);
    printf("success complte\n");
    return 0;
}

首先将断点打在Test函数这里,使用step命令进入函数内部:

下面是有关一些info命令的讲解:

1.info registers:该命令用于显示当前CPU寄存器的状态和值。它可以显示通用目的寄存器(如EAX、EBX、ECX等)以及特殊寄存器(如程序计数器PC、堆栈指针SP等)。这对于理解程序执行状态和调试寄存器相关问题非常有用。

2.info args:该命令用于显示当前函数的参数及其值。它会列出函数的参数名称和值,可帮助你了解函数调用时传递的实际参数值。

3.info locals:该命令用于显示当前函数的局部变量及其值。它会列出函数内部声明的局部变量的名称和值,可帮助你了解函数内部变量的状态。

4.info frame:该命令用于显示当前帧(函数调用栈帧)的信息。它会显示函数名称、参数、返回地址等与当前帧相关的信息。

5.info variables:该命令用于显示当前作用域内的所有变量和它们的值。它会列出当前作用域中定义的变量的名称和值。可以使用该命令查看全局变量或其他作用域的变量状态。

6.info functions:该命令用于显示已加载程序的所有函数列表。它会列出可执行文件中定义的所有函数的名称,提供了一个快速查看程序中可用函数的方式。

四、调试中的技巧

1.display /f expression:

该命令用于设置一个表达式的自动显示。每次程序暂停时,GDB 将自动显示该表达式的值。 /f 可以是省略号(…)、空格或/format,用于指定显示格式。例如,display /x $eax 将以十六进制格式显示寄存器 $eax 的值。

2.undisplay:

该命令用于取消之前设置的自动显示。你可以提供要取消显示的显示编号,也可以不带参数使用该命令来取消所有的显示。

3.whatis:

该命令用于获取给定标识符的类型信息。例如,whatis variable_name 将显示变量 variable_name 的类型。

4.ptype:

该命令用于显示给定类型的详细信息。例如,ptype struct_name 将显示结构体 struct_name 的详细成员变量和类型信息。

5.list:

该命令用于显示源代码中的代码片段。你可以指定一个函数名、行号或文件名作为参数。例如,list function_name 将显示函数 function_name 的代码。

6.set listsize N:

该命令用于设置 list 命令显示的代码行数。默认情况下,它显示 10 行代码,但可以通过设置 N 来更改显示的行数。

7.shell:该命令用于在 GDB 提示符下运行操作系统的命令。例如,shell ls 将执行 ls 命令,并显示目录中的文件列表。

总结

本篇文章就讲解到这里,掌握了GDB调试,在编写Linux程序中寻找BUG和调试将会非常高效。


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
569 16
|
NoSQL Linux 开发工具
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
本文介绍了yum 包管理工具、Vim 编辑器、gcc/g++ 编译器、gdb 调试器、编译原理及 Makefile 的使用,同时还配备了如何使用,以及图解。旨在帮助读者更好地理解和应用这些工具与技术。
613 0
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
1854 1
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
347 10
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
1215 3
|
9月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
1000 1
二、Linux文本处理与文件操作核心命令
|
9月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
613 137
|
9月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1570 58
|
8月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
1434 2
|
9月前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
785 16