当前位置: 首页 > news >正文

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编程(梁庚 著)

相关文章:

Linux 系统下 GDB 调试器的使用

文章目录 简介GDB 的介绍GDB 的使用 GDB 常用命令及示例查看相关操作断点相关操作运行相关操作变量相关操作分隔窗口操作 简介 GDB 的介绍 GDB 是 GNU 调试程序&#xff0c;是用来调试 C 和 C 程序的调试器。它可以让程序开发者在程序运行时观察程序的内部结构和内存的使用情况…...

个人首次使用UniAPP使用注意事项以及踩坑

个人首次使用UniAPP 使用注意事项以及踩坑 自我记录 持续更新 1.vscode 插件 uni-create-view 快速nui-app页面的 uni-helper uni-app代码提示的 uniapp小程序扩展 鼠标悬停查文档 Error Lens 行内提示报错 "types": ["dcloudio/types", "mini…...

VSCode 如何解决 scanf 的输入问题——Code is already running!

文章如何使用 VSCode 软件运行C代码中已经介绍了如何在 VSCode 软件中运行C代码&#xff0c;但最近在使用 scanf 想从键盘输入时&#xff0c;运行代码后显示“Code is already running!”&#xff0c;如下图所示&#xff0c;在输出窗口是无法通过键盘输入的。 解决办法如下&am…...

短视频seo源码矩阵系统开源---代码php分享

前言&#xff1a;短视频seo源码 短视频seo矩阵系统源码私有化部署 短视频seo源码 短视频seo矩阵系统源码私有化怎么部署&#xff1f; 首先我们来给大家普及一下什么是短视频seo矩阵系统&#xff1f;视频矩阵分为多平台矩阵与一个平台多账号矩阵&#xff0c;加上seo排名优化&…...

【docker】中文无法显示输入等问题解决方法

every blog every motto: You can do more than you think. csdn: https://blog.csdn.net/weixin_39190382?typeblog ID: 胡侃有料 0. 前言 docker 路径中文不显示&#xff0c;无法输入中文问题解决方法 1. 解决方法 1.1 临时解决 打开etc/profile文件&#xff0c;末尾添…...

leetcode 1035. 不相交的线

2023.8.25 本题可以转化为&#xff1a;求两数组的最长公共子序列。 进而可以用dp算法解决。 方法类似于这题最长公共子序列 。 代码如下&#xff1a; class Solution { public:int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {vector<…...

Hystrix: 服务降级

cloud是基础&#xff0c;eureka是服务注册和发现&#xff0c;consumer是消费者去消费provider里的东西&#xff0c;消费方式就是Feign和Ribbon&#xff0c;feign 接口消费&#xff0c;ribbon Rest消费 服务降级发生在客户端&#xff0c;客户端因为请求关闭的服务器&#xff0…...

高精度运算(加减乘除乘法)

所谓高精度&#xff0c;就是大数的运算&#xff0c;这个大数可能是要远远超过现有数据类型的最大范围。如果我们想进行这样的运算&#xff0c;就要掌握计算的原理——竖式运算。 加法 我们这里先简单考虑非负数的加法&#xff0c;竖式这么列对吧&#xff1a; ①存储 我们如何…...

Mysql数据库技术知识整理

Mysql的知识点目录 重点&#xff1a;架构,引擎,索引&#xff0c;锁机制,事务机制,日志机制&#xff0c;集群,调优 3、Mysql索引 索引概念 覆盖索引&#xff1a; 条件列和结果列都在索引中索引下推&#xff1a; 查询会先过滤条件列&#xff0c;然后回表查数据最左前缀匹配&am…...

SpringBoot整合Mybatis 简单试用

1. 导入依赖 我使用MySQL&#xff0c;需要导入MySQL的驱动依赖此外要在SpringBoot中使用Mybatis&#xff0c;则需要导入Mybatis启动器 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifact…...

SpringBoot案例-配置文件-yml配置文件

配置格式 SpringBoot提供了多种属性配置方式 application.propertiesapplication.ymlapplication.yaml常见配置文件格式对比 XML&#xff08;臃肿&#xff09; <configuration><database><host>localhost</host><port>3306</port><use…...

Web Components

Web Components标准非常重要的一个特性是&#xff0c;它使开发者能够将HTML页面的功能封装为custom elements&#xff08;自定义标签&#xff09;&#xff0c;可以使用CustomElementRegistry来管理自定义标签 <script>//1、创建自定义标签class NewElement extends HTML…...

IT运维软件的费用是多少?

正常一套IT运维软件费用一般在5千-50万之间不等&#xff0c;而且分为一次性付费或年付费模式&#xff0c;付费方式导致的价格也不同。 正常情况下IT运维软件的具体价格&#xff0c;是需要根据企业的实际需求来进行综合评估&#xff0c;一般来说&#xff0c;影响具体价格费用有以…...

基于Three.js的WebXR渲染入门

1、Three.js 渲染管线快速概览 我不会花太多时间讨论 Three.JS 渲染管道的工作原理,因为它在互联网上有详细记录(例如,此链接)。 我将在下图中列出基础知识,以便更容易理解各个部分的去向。 2、WebXR 设备 API 入门 在我们深入了解 WebXR API 本身之前,您应该知道 WebX…...

resource doesn‘t have a corresponding Go package.

resource doesnt have a corresponding Go package. GO这个鬼东西不能直接放src下。 ************ Building Go project: ProjectGoTest ************with GOPATH: D:\Go;D:\eclipse-jee-oxygen-2-win32-x86_64\workspace\ProjectGoTest >> Running: D:\Go\bin\go.exe …...

【微服务】微服务调用原理及服务治理

本文通过图文结合&#xff0c;简要讲述微服务的调用原理&#xff0c;以及服务治理的相关概念。 1.微服务的调用原理 举个栗子&#xff1a;你去会所洗脚。首先&#xff0c;技师肯定要先去会所应聘&#xff0c;通过之后&#xff0c;会所会记录该技师的信息和技能&#xff0c;然后…...

【在Windows下搭建Tomcat HTTP服务】

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器&#xff0c;不仅名字很有趣&#xff0…...

前端Vue3框架知识点大全

Vue.js是一种流行的JavaScript前端框架&#xff0c;它的第三个版本Vue3带来了许多令人兴奋的新特性和改进。 1、响应式数据&#xff1a; Vue 3采用了基于Proxy的响应式系统&#xff0c;相比Vue 2中的Object.defineProperty&#xff0c;Proxy提供了更强大和灵活的拦截器&#…...

C语言练习2(巩固提升)

C语言练习2 选择题 前言 “志之所趋&#xff0c;无远弗届&#xff0c;穷山距海&#xff0c;不能限也。”对想做爱做的事要敢试敢为&#xff0c;努力从无到有、从小到大&#xff0c;把理想变为现实。要敢于做先锋&#xff0c;而不做过客、当看客&#xff0c;让创新成为青春远航的…...

Vulnhub: DriftingBlues: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.215 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.215 80端口首页源码 访问noteforkingfish.txt&#xff0c;发现为Ook!加密的密文 解密后提示需要用户eric和修改hosts文件&…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...

【java】【服务器】线程上下文丢失 是指什么

目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失&#xff1f; 直观示例说明 为什么上下文如此重要&#xff1f; 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程&#xff0c;代码应该如何实现 推荐方案&#xff1a;使用 ManagedE…...