Linux调试工具GDB(2)

news2024/9/23 19:14:32

文章目录

  • 前言
  • 一、数据断点
  • 二、x查看内存命令
  • 三、深入info命令
  • 四、调试中的技巧
  • 总结


前言

本篇文章我们继续讲解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和调试将会非常高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/758732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅聊 【ThreadLocal】(超级详细)

写在开始 : 本文主要讲述 : ThreadLocal简介; 常用API; demo案例; 特点引用场景;以及部分底层原理源码内容。 引言 &#xff1a; 从常见面试题看 ThreadLocal: **①解释 **&#xff1a; ThreadLocal是多线程中对于解决线程安全的一个操作类&#xff0c;它会为每个线程都分 配一…

121、仿真-基于51单片机8路温度 ds18b20多路温度传感器检测仿真设计(Proteus仿真+程序+原理图+参考论文+任务书+流程图等)

摘 要 随着社会经济的高速发展和科技水平的不断进步&#xff0c;温度监控器的运用范围越来越广泛&#xff0c;也渐渐地发展到了核变站的温度监控。温度与人们的生活生产密切相关&#xff0c;比如在核变站的环境下&#xff0c;对温度的监控更是必不可少的&#xff0c;不但能保…

【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 59-54

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来螺旋矩阵的分享✨ 目录 前言59. 螺旋矩阵 II54. 螺旋矩阵总结 59. 螺旋矩阵 II 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n…

ASIDE-Simulink接口预研报告

ASIDE-Simulink接口预研报告 2018年4月 1 引言 本报告描述ASIDE-Simulink接口的预先研究情况和结果。 2 目的 ASIDE-Simulink接口是ASIDE中的一个模块。它的主要功能是通过解析Simulink模型文件&#xff0c;把Simulink模型中的相关信息导入到ASIDE中&#xff0c;从而把Simu…

Vue-封装组件的案例

1.案例效果 封装要求&#xff1a; ①允许用户自定义title标题 ②允许用户自定义bgcolor背景色 ③允许用户自定义color文本颜色 ④MyHeader组件需要在页面顶部进行fixed固定定位&#xff0c;且z-index等于999 使用示例如下&#xff1a; <template><div class"…

独立、相关和正交的关系以及白噪声

注意如下边缘密度的计算&#xff1a; 第一个题&#xff1a;不独立&#xff0c;不相关&#xff0c;正交 第一个题&#xff1a;独立&#xff0c;不相关&#xff0c;正交 第一个题&#xff1a;独立&#xff0c;不相关&#xff0c;不正交

【第九天】面向程序设计_类

类 是一种数据结构&#xff0c;它可以包含数据&#xff0c;成员&#xff0c;常量和变量函数&#xff0c;成员方法&#xff0c;属性&#xff0c;构造函数和析构函数等和嵌套类型。 类的声明 在程序中类适用class关键字来声明的语法如下: class 类名 { }类的成员 类的定义包…

Coursier安装Scala报错Error downloading的解决方法

根据 Scala 官方目前的安装教程 https://docs.scala-lang.org/getting-started/index.html&#xff0c;我们下载 cs-x86_64-pc-win32.zip 并解压为 cs-x86_64-pc-win32.exe。在 PowerShell 中通过java --version确认 JVM 是否已安装&#xff0c;如果已安装&#xff0c;则切换到…

从代码到内容创作:程序员如何通过自媒体项目实现赚钱?

从代码到内容创作&#xff1a;程序员如何通过自媒体项目实现赚钱&#xff1f; 自媒体项目已成为程序员们实现赚钱的一种创新方式。通过将代码技术与内容创作结合&#xff0c;程序员可以在互联网上建立自己的品牌&#xff0c;并通过以下方式实现收入增长&#xff1a; 技术教程&a…

java学习路程之篇八、知识点、方法介绍、方法的定义和调用格式、方法常见问题、方法重载

文章目录 1、方法介绍2、方法的定义和调用格式3、方法常见问题4、方法重载 1、方法介绍 2、方法的定义和调用格式 3、方法常见问题 4、方法重载

微信小程序三脚猫功夫拿下组件注册与使用

1.局部注册组件 1.1创建components文件夹 1.2创建文件夹MyHeader 1.3选中MyHeader右键 说明&#xff1a;执行此步&#xff0c;将会自己创建四个文件 1.4MyHeader.wxml文件 说明&#xff1a;随便写点h5结构 <view class"sentence">励志语句</view> <…

实验四(双向重发布)7 14

一、配置网络地址&#xff0c;启用OSPF以及环回类型更改&#xff0c;启用RiP&#xff1a; R1&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a;环回接口放置OSPF区域 R5&#xff1a; R6&#xff1a;环回接口放置RIp区域 二、重发布&#xff1a; 未重发布之前&#…

Gitee生成ssh公钥

进入 C:/Users/Administrator/.ssh &#xff0c;没有就手动创建该文件夹 打开cmd输入指令 ssh-keygen -t rsa -C "Gitee SSH Key" -f "C:\Users\.ssh\github_id_rsa"中间通过三次回车键确定查看ssh公钥 type C:\Users\Zzzy\.ssh\github_id_rsa.pub 复制放到…

[LeetCode] #118 杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c; 每个数是它左上方和右上方的数的和。 杨辉三角&#xff1a; class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<…

Linux 动态主机配置协议 DHCP

文章首发地址 如果管理的计算机有几十台&#xff0c;那么初始化服务器配置IP地址、网关和子网掩码等参数是一个繁琐耗时的过程。如果网络结构要更改&#xff0c;需要重新初始化网络参数&#xff0c;使用动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&a…

Ubuntu U盘只能读取不能写入

Ubuntu U盘只能读取不能写入 1. 问题2. 解决办法 1. 问题 Ubuntu系统下&#xff0c;U盘突然只能读取无法写入 原因是U盘的文件系统损坏&#xff0c;操作系统为了防止进一步毁坏文件系统&#xff0c;而将其设置成了只读 2. 解决办法 查看U盘分区和挂载 $ df -h 解除挂载 $ u…

微服务系列文章 之 SpringCloud中遇到的一些bug

1、There was a problem with the instance info replicator 错误原因&#xff1a; 该服务尝试将自己作为客服端注册解决办法&#xff1a; 在application.yml配置文件中&#xff0c;设置 # 注册Eureka服务 eureka:client:# Eureka服务注册中心会将自己作为客户端来尝试注册它自…

半导体热阻问题解析(Tc,Ta,Tj,Pc)

自记&#xff1a; 晶体管(或半导体)的热阻与温度、功耗之间的关系为&#xff1a; TaTj-*P(RjcRcsRsa)Tj-P*Rja 公式中&#xff0c;Ta(Ambient temperature)表示环境温度 Tj(Junction temperature)表示晶体管的结温&#xff0c;也就是封装内部半导体裸片的温度。硅片的…

RocketMQ学习笔记(实操篇)

目录 基本操作 启动 测试 双主双从集群搭建 总体架构 工作流程 服务器环境 Host添加信息 防火墙配置 环境变量配置 创建消息存储路径 broker配置文件 修改启动脚本文件 服务启动 查看进程状态 查看日志 mqadmin管理工具 使用方式 命令介绍 集群监控平台搭…

Java使用JNI实现C文件的调用

1.使用IDEA新建工程 构建最基本的maven类型就行&#xff0c;文件结构如下&#xff1a; 其中最主要的类如下&#xff1a; package org.linx;public class TestJNI {static {/*** 加载jni库&#xff0c;有一个重要的点就是生成的为libnative.so&#xff0c;下面加载代码需要消…