Linux 系统下 GDB 调试器的使用

文章目录

  • 简介
    • 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.mzph.cn/news/53193.shtml

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

相关文章

初阶c语言:趣味扫雷游戏

目录 前言 制作菜单 构建游戏选择框架 实现游戏功能 模块化编程&#xff1a;查看前节三子棋的内容 初始化雷区 ​编辑 优化棋盘 随机埋入地雷 点击后的决策 实现此功能代码 game&#xff08;&#xff09;&#xff1b;的安排 前言 《扫雷》是一款大众类的益智小游戏&…

java八股文面试[JVM]——元空间

JAVA8为什么要增加元空间 为什么要移除永久代&#xff1f; 知识来源&#xff1a; 【2023年面试】JVM8为什么要增加元空间_哔哩哔哩_bilibili

Django 简易PACS读片系统

1、Django中写一个后端接口&#xff0c;给HTML提供dicom文件接口的方式 1、首先创建django项目 1、下载安装跨域的包 pip3 install django-cors-headers2、使用pycharm创建一个Django项目 3、点击创建在另一个窗口&#xff0c;这个都无所谓&#xff0c;怎么都行&#xff0c;…

Hadoop Yarn 配置多队列的容量调度器

文章目录 配置多队列的容量调度器多队列查看 配置多队列的容量调度器 首先&#xff0c;我们进入 Hadoop 的配置文件目录中&#xff08;$HADOOP_HOME/etc/hadoop&#xff09;&#xff1b; 然后通过编辑容量调度器配置文件 capacity-scheduler.xml 来配置多队列的形式。 默认只…

安防监控平台EasyCVR视频汇聚平台增加首页告警类型的详细介绍

安防监控/视频集中存储/云存储EasyCVR视频汇聚平台&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等…

基于智和网管平台的网络安全运维解决方案

随着信息技术的快速发展及网络应用的广泛普及&#xff0c;企业在享受网络技术带来便利的同时&#xff0c;也受到日益严重的网络安全威胁。未来&#xff0c;企业信息系统规模和复杂程度将不断增大&#xff0c;对信息通信技术的应用也将不断深入&#xff0c;网络安全运维将成为愈…

浅谈小程序开源业务架构建设之路

一、业务介绍 1.1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态&#xff0c;我们的愿景是&#xff1a;定义移动时代最佳体验&#xff0c;建设智能小程序行业标准&#xff0c;打破孤岛&#xff0c;共建开源、开放、繁荣的小程序行业生态。百度智…

webrtc学习(七)-媒体协商

一.概述 媒体协商嘴主要的作用就是看通信双方都支持那些编解码器&#xff0c;这些编解码器又包含那些参数&#xff0c;比如音频的参数包括采样率&#xff0c;采样大小&#xff0c;通道数&#xff0c;对于视频的参数包括分辨率帧率等一系列参数&#xff0c;此外传输中用的payloa…

Linux 发行版 Debian 宣布支持龙芯 LoongArch 架构

近期&#xff0c;龙芯发布了 3A6000 桌面处理器&#xff0c;芯片的性能又一次大幅度提升&#xff0c;成为国产芯片的又一里程碑。 同期&#xff0c;LoongArch 架构的生态建设也迅速提升&#xff0c;开源网络引导固件 iPXE、QQ Linux 版、摩尔线程等软硬件都官宣支持龙芯 Loong…

VMware 修改ip地址 虚拟机静态ip设置 centos动态ip修改为静态ip地址 centos静态ip地址 vmware修改ip地址

虚拟机的centos服务器经常变换ip&#xff0c;测试起来有些麻烦&#xff0c;故将动态ip修改为静态ip 1. 查看vmware 虚拟机网络配置&#xff1a; 点击编辑&#xff0c;打开虚拟网络配置 2. 选中nat模式&#xff0c;点击nat设置&#xff0c;最终获取网关ip: 192.168.164.2 3. 进…

拒绝摆烂!C语言练习打卡第六天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4d…

Golang struct 结构体注意事项和使用细节

结构体所有字段在内存当中是连续的 type Point struct {x, y int }type Rect struct {leftUp, rightDown Point }func main() {//r1会在内存当中有四个整数r1 : Rect{leftUp: Point{x: 1,y: 2,},rightDown: Point{x: 3,y: 4,},}//r1有四个int&#xff0c;在内存当中是连续分布的…

基于Java+SpringBoot+Vue前后端分离社区智慧养老监护管理平台设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Python——列表(list)推导式

本文基于python3。 目录 1、Python推导式2、列表(list)推导式2.1、定义2.2、实际操作2.2.1、一个表达式&#xff0c;后面为一个 for 子句2.2.2、一个表达式&#xff0c;后面为一个 for 子句&#xff0c;然后&#xff0c;跟着if 子句。2.2.3、一个表达式&#xff0c;后面为一个…

vscode 与 C++

序 具体流程的话&#xff0c;官方文档里都有的&#xff1a;C programming with Visual Studio Code 浏览器下载一个mingw64&#xff0c;解压&#xff0c;配置环境变量vscode里安装c相关的插件没了 第一步只看文字&#xff0c;可能有点抽象&#xff0c;相关视频&#xff1a; …

24 WEB漏洞-文件上传之WAF绕过及安全修复

目录 WAF绕过上传参数名解析:明确哪些东西能修改?常见绕过方法&#xff1a;符号变异-防匹配( " ;)数据截断-防匹配(%00 ; 换行)重复数据-防匹配(参数多次)搜索引擎搜索fuzz web字典文件上传安全修复方案 WAF绕过 safedog BT(宝塔) XXX云盾 宝塔过滤的比安全狗厉害一些&a…

全流程R语言Meta分析核心技术教程

详情点击链接&#xff1a;全流程R语言Meta分析核心技术教程 一&#xff0c;Meta分析的选题与检索 1、Meta分析的选题与文献检索 1)什么是Meta分析&#xff1f; 2)Meta分析的选题策略 3)精确检索策略&#xff0c;如何检索全、检索准 4)文献的管理与清洗&#xff0c;如何制定文…

【Acwing291】蒙德里安的梦想(状态压缩dp)详细讲解

题目描述 题目分析 显而易见的重要事实 首先&#xff0c;需要明白一个很重要的事实&#xff1a; 所有的摆放方案数所有横着摆放且合理的方案数 这是因为&#xff0c;横着的确定之后&#xff0c;竖着的一定会被唯一确定&#xff0c;举一个例子&#xff1a; ------唯一确定-…

gma 2 教程(二)数据操作:6.NumPy数组交互

gma 栅格数据集可以通过 ToArray 方法将栅格数据转为NumPy数组&#xff0c;也提供将NumPy数据转换为栅格数据&#xff08;集&#xff09;的方法。 读取NumPy数组到数据集 &#xff08;一&#xff09;函数简介   &#xff08;二&#xff09;示例 保存NumPy数组到文件 &…

C++笔记之智能指针和单例、依赖注入结合使用

C笔记之智能指针和单例、依赖注入结合使用 code review! 文章目录 C笔记之智能指针和单例、依赖注入结合使用例1.一个类不使用单例&#xff0c;另一个类使用单例例2.两个类都使用单例&#xff0c;并且通过getInstance()传入类的实例例3.std::make_unique不能访问私有的构造函…