Linux 系统下 GDB 调试器的使用

news2025/1/16 1:55:14

文章目录

  • 简介
    • GDB 的介绍
    • GDB 的使用
  • GDB 常用命令及示例
    • 查看相关操作
    • 断点相关操作
    • 运行相关操作
    • 变量相关操作
    • 分隔窗口操作


简介


GDB 的介绍

GDB 是 GNU 调试程序,是用来调试 C 和 C++ 程序的调试器。它可以让程序开发者在程序运行时观察程序的内部结构和内存的使用情况。它是一个非图形化界面的纯命令行调试器,提供了强大的功能和灵活的选项,使得开发者能够更轻松地诊断和解决程序中的问题。

GDB 的使用非常依赖于命令行参数和选项,因此需要熟悉 GDB 的命令行语法和各种选项,GDB 调试程序通常有以下几种方式:

  • 启动 GDB 时同时加载待调试程序。使用命令 gdb file_name 来启动,并同时加载待调试程序。

  • 先启动 GDB,再加载、运行待调试程序。使用命令 gdb 来启动 GDB,然后使用命令 load file_name 来加载待调试程序,并使用命令 run 来运行程序。

  • 使用 GDB 开启源码界面、界面布局设置。在 GDB 命令行界面输入命令 source file_name 可以开启源码界面,使用命令 layout all 来设置界面布局。

除了以上常用的命令外,GDB 还提供了很多其他的命令和功能,可以使用命令 gdb helpman gdb 来查看完整的命令列表和帮助文档。


GDB 的使用

在 Linux 系统中,通常默认发布的版本为 Release 版本,这个版本的程序在编译时会被优化,以提高程序的执行效率。但是,这样做会导致程序中的调试信息被删除,使得我们无法直接使用 GDB 进行调试。

因此,如果需要使用 GDB 调试程序,就需要以 Debug 版本发布程序,要将 Release 版本的程序发布为 Debug 版本,可以使用 GCC 编译器的原文件选项 -o 指定可执行文件的名称,再使用 -g 参数来加入调试信息。其中,参数 -g 的作用是在生成的可执行文件中加入 调试信息 ,这样就可以使用 GDB 进行调试了。

举个例子,如果我们有一个 Release 版本名为 gdb_test.c 的程序,想要将它发布为 Debug 版本,可以使用以下命令。

gcc -g gdb_test.c -o test

显然,Release 版本比 Debug 版本多占一些空间,即调试信息所占的空间,如下图所示。

然后,使用命令 gdb test 启动 GDB 对 test 程序进行调试。


GDB 常用命令及示例


假设 test.c 文件是一个通过递归调用来计算 3 的阶乘的程序,该程序的具体代码如下所示。

#include <stdio.h>

int cal(int n)
{
   	    if (n == 1) {
     	    return 1;
        } else {
       	    return n * cal(n - 1);
        }
}

int main()
{
        int n = 3;
   	    int s;
        s = cal(n);
        printf("%d! = %d\n", n, s);
        return 0;
}

在 Linux 系统终端下执行命令 gcc -g test.c -o test 对其进行编译,其中,参数 g 的作用是把调试信息加入生成的 test 可执行文件中,否则 GDB 就无法对 test 进行调试。

接下来,使用命令 gdb test 启动 GDB 对 test 进行调试了,如下图所示。

可以看到,GDB 首先显示了版本信息和库信息,随后 GDB 停留在符号 (gdb) 处等待用户输入调试命令。GDB 提供了大量的命令来实现各种调试功能,下面仅对一些常用的命令进行介绍。


查看相关操作

在调试程序时,GCC 会给出产生警告或错误的代码行数,但在普通的文本环境中是无法直接获得语句的行数。

(1) list/l :在 GDB 中,可以通过命令 llist 的缩写)可以查看程序代码,如下图所示。

(2) list/l 行号 :从某行开始显示源代码,不加行号默认从第一行开始显示,连续 l 接着上次的位置往下列(可以直接回车默认输入上次的指令),每次列 10 行,如下图所示。

(3) list/l 函数名 :表示列出某个函数的源代码,即从某个函数开始显示 10 行代码,也可以继续向下显示,如下图所示。

(4)info/i locals :查看当前堆栈页的所有变量,如下图所示。

可以看出,该命令可以显示出该堆栈的所有变量的值。

(5)where/backtrace/bt :显示当前调用的堆栈列表信息,如下图所示。


断点相关操作

在 GDB 中,断点是调试程序的重要方法。通过在程序的关键位置设置断点,可以让程序在执行到这些位置时停下来,从而让我们可以观察程序每一步的执行状况(例如,当前变量的值、函数是否调用、堆栈使用情况等)。

在 GDB 中,可以使用命令 bbreakpoints 的缩写)来设置断点,通过命令 info/i beark/b 查看断点的情况及位置信息。

(1)break/b 行号 :在某一行设置断点,设置断点后,通过命令 i b 查看各个断点情况,如下图所示。

(2)break/b 函数名 :在某个函数开头设置断点,设置后断点的行数为函数的第一行代码,如下图所示。

可以看到,命令 break/b 在程序的指定位置处设置了断点,并显示了该断点在内存中的物理地址。

(3) delete/d 断点号 n :删除序号为 n 的断点,如下图所示。

(4) delete breakpoints/d :删除所有的断点,如下图所示。

(5) disable 序号 n :禁用序号为 n 的断点,如下图所示。

注意:断点在禁用后,断点会继续保留,但是在运行时并不会在该断点处停止。

(6) disable breakpoints/b :禁用所有的断点,如下图所示。

(7) enable 断点号 n :启用序号为 n 的断点,如下图所示。

(8) enable breakpoints/b :启用所有的断点,如下图所示。


运行相关操作

(1) run/r :在 GDB 中,通过命令 rrun 的缩写)运行程序,如下图所示。

可以看出,GDB 默认从代码的首行开始运行(也可以通过 r 行数 的方式让程序从指定行数开始运行),如果程序中有断点,则程序会在断点行数的前一行暂停运行。

(2) continue/c :从当前位置开始连续执行程序,遇到断点会停止运行,如下图所示。

(3) next/n :不进入函数,逐过程执行。在执行时会显示当前执行的语句和返回值,如下图所示。

(4) step/s :进入函数,逐语句执行。在执行时会显示当前执行的语句和返回值,如下图所示。

(5) finish :运行程序直到当前函数完成返回,并打印函数返回时的堆栈地址、返回值和参数值等信息,如下图所示。


变量相关操作

(1) print/p 变量名 :查看当前变量的值,如下图所示。

可以看出,GDB 通过 $N$1$2)来显示变量的值,这样在下次查看变量值时,就可以用 $N 代替变量名了。

(2)set var 变量名 = value :修改变量的值,如下图所示。

(3)display 变量名 :跟踪查看一个变量,每次停下来都显示它的值,跟踪显示变量时是有序号的,如下图所示。


分隔窗口操作

分隔窗口方便一边查看代码,一边进行测试。

(1)layout src :显示代码窗口,效果如下图所示。

(2)layout asm :显示反汇编窗口,效果如下图所示。

(3)layout regs :显示源代码/反汇编和 CPU 寄存器窗口,效果如下图所示。

(4)layout split :显示源代码和反汇编窗口,效果如下图所示。


  • 参考链接: GDB 官网

  • 参考书籍:《高质量嵌入式 Linux C编程(梁庚 著)

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

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

相关文章

大数据时代,个人信息数据库保护的挑战及其对策

挑战&#xff1a; 数据泄露&#xff1a;大数据时代&#xff0c;个人信息数据库面临被黑客攻击、内部员工滥用权限等风险&#xff0c;导致个人信息泄露的风险增加。 隐私保护&#xff1a;随着大数据的快速发展&#xff0c;个人信息的采集和分析变得更加广泛和深入。但是&#xf…

初级工程师职称评定条件及流程是什么呢?初级作用是什么?

现在全国统一的助理&#xff08;初级&#xff09;工程师是由人社部颁发的初级工程师证也就是大家说的初级职称。人社部备案&#xff0c;正规可靠&#xff0c;国家认可&#xff0c;评审表、红头文件齐全&#xff0c;可以用于应聘、在职、上岗、加薪、评级、评职称或者企业升资质…

indexDB入门到精通

前言 由于开发3D可视化项目经常用到模型&#xff0c;而一个模型通常是几m甚至是几十m的大小对于一般的服务器来讲加载速度真的十分的慢&#xff0c;为了解决这个加载速度的问题&#xff0c;我想到了几个本地存储的。 首先是cookie,cookie肯定是不行的&#xff0c;因为最多以只…

MPP 还是主流架构吗

MPP 架构&#xff1a; MPP 架构的产品&#xff1a; Impala ClickHouse Druid Doris 很多 OLAP 引擎都采用了 MPP 架构 批处理系统 - 使用场景分钟级、小时级以上的任务&#xff0c;目前很多大型互联网公司都大规模运行这样的系统&#xff0c;稳定可靠&#xff0c;低成本。…

9.1 功率放大电路概述

在实用电路中&#xff0c;往往要求放大电路的末级&#xff08;即输出级&#xff09;输出一定的功率&#xff0c;以驱动负载。能够向负载提供足够信号功率的放大电路称为功率放大电路&#xff0c;简称功放。从能量控制和转换的角度看&#xff0c;功率放大电路与其它放大电路在本…

c++ qt--信号与槽(二) (第四部分)

c qt–信号与槽(二) &#xff08;第四部分&#xff09; 一.信号与槽的关系 1.一对一 2.一对多 3.多对一 4.多对多 还可以进行传递 信号->信号->槽 一个信号控制多个槽的例子&#xff08;通过水平滑块控制两个组件&#xff09; 1.应用的组件 注意这里最下面的组件…

MongoDB快速上手

MongoDB快速上手 MongoDB用起来-快速上手&集群和安全系列 课程目标&#xff1a; 理解MongoDB的业务场景、熟悉MongoDB的简介、特点和体系结构、数据类型等能够在windows和linux下安装和启动MongoDB、图形化管理界面Compass的安装使用掌握MongoDB基本常用命令实现数据的C…

mysql 、sql server 临时表、表变量、

sql server 临时表 、表变量 mysql 临时表 创建临时表 create temporary table 表名 select 字段 [&#xff0c;字段2…&#xff0c;字段n] from 表

项目解决问题

红外 没接收到红外信号时&#xff0c; 会有杂波干扰 STC单片机 STC的串口要用一个定时器作为波特率发生器 开定时器2需要 开定时器0 1 要ET0 1 ET11打开 串口有时候和定时器有冲突 串口发送函数放定时器中断函数中&#xff0c;时间太少可能会导致一直卡在定时器中AUXR | 0x…

精彩回顾 | 风丘科技亮相2023中国汽车测试及质量监控博览会

2023年8月9-11日&#xff0c;风丘科技携手德国Softing、德国IPETRONIK亮相中国汽车测试及质量监控博览会&#xff08;2023 Testing Expo&#xff09;&#xff0c;为大家呈现了在汽车测试、车辆诊断领域里专业的研发测试工具及创新解决方案&#xff0c;吸引了众多客户驻足洽谈。…

MySQL基础篇(四)

多表查询 概述&#xff1a;多表查询就是多张表之间的查询。 回顾&#xff1a;SELECT * FROM table_name 多表查询 from 后面就得跟多张表。如&#xff1a;select * from emp,dept 笛卡尔积&#xff1a;笛卡尔积在数学中&#xff0c;表示两个集合&#xff0c;集合 A 和集合 B…

解决`idea`中`database`工具查询起别名乱码问题

文章目录 解决idea中database工具查询起别名乱码问题场景复现如何解决方式一 设置编码方式二&#xff1a;修改字体 原因说明 解决idea中database工具查询起别名乱码问题 场景复现 使用Idea做查询的并且起别名出现了中文乱码 如何解决 方式一 设置编码 settings->输入框输…

算法-滑动窗口-串联所有单词的子串

算法-滑动窗口-串联所有单词的子串 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/substring-with-concatenation-of-all-words/ 1.2 题目描述 2 滑动窗口Hash表 2.1 解题思路 构建一个大小为串联子串的总长的滑动窗口为每个words中的子串创建一个hash表, <子…

BTP Integration Suite学习笔记 - (Unit4) Developing with SAP Integration Suite

详细指导还是要看官方文档 4. 云集成管理 4.1 云集成介绍 什么是云集成&#xff1f; 前三章讲了很多内容&#xff0c;但都不是最核心的&#xff0c;通常我们用CPI是让他实现原来PI/PO的功能的&#xff0c;是用来做集成的。这章才刚开始。 云集成有以下几个特性&#xff1a;…

web基础http与apache

一、http相关概念&#xff1a; http概述&#xff1a; HTTP 是一种用作获取诸如 HTML 文档这类资源的协议。它是 Web 上进行任何数据交换的基础&#xff0c;同时&#xff0c;也是一种客户端—服务器&#xff08;client-server&#xff09;协议 为解决"用什么样的网络协…

添加了.gitignore 文件,git status 的时候还是显示修改文件

1. 用IAR 软件编译STM32 工程&#xff0c;IAR 会生成很多中间文件&#xff0c;这些文件是不需要加入到git 版本管理里面的 2. .gitignore 文件位置需要放对应目录才会起作用&#xff0c;递归起作用的 3. 如果 .gitignore文件中指定的文件或目录仍然显示在git status的输出中&a…

考研C语言进阶题库——更新41-50题

目录 41.编写程序要求输出整数a和b若a和b的平方和大于100&#xff0c;则输出a和b的平方和&#xff0c;否则输出a和b的和 42.现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的&#xff1a;第一项是1/1&#xff0c;第二项是是…

RHCE——四、Web服务器(理论篇)

Web服务器 一、Web服务器1、www简介1.1 常见Web服务程序介绍&#xff1a;1.2 服务器主机1.3 主要数据1.4 浏览器 2、网址及HTTP简介2.1 URL2.2 http请求方法:2.3 HTTP协议请求的工作流程&#xff1a; 3、www服务器的类型静态网站动态网站 二、快速安装Apache1、安装2、准备工作…

[oneAPI] 基于BERT预训练模型的SWAG问答任务

[oneAPI] 基于BERT预训练模型的SWAG问答任务 基于Intel DevCloud for oneAPI下的Intel Optimization for PyTorch基于BERT预训练模型的SWAG问答任务数据集下载和描述数据集构建问答选择模型训练 结果参考资料 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d…

nginx代理webSocket链接,webSocket频繁断开重连

一、场景 1、使用nginx代理webSocket链接&#xff0c;消息发送和接收都是正常的&#xff0c;但webSocket链接会频繁断开重连 2、如果不使用nginx代理则一切正常 3、程序没有做webSocket心跳处理 如下图 二、nginx代理配置 upstream cloud_ass {#ip_hash;server 192.168.1.…