【Linux】调试器---gdb的使用

news2025/1/11 2:50:49

文章目录

  • 一.背景知识
  • 二.安装gdb
  • 三.gdb的用法
    • 使用须知
    • gdb的常用指令
      • 1.进入调试
      • 2.退出调试操作
      • 3.显示源代码
      • 4.设置断点breakPoint
      • 5.查看断点信息/禁用断点/开启断点/删除断点
      • 6.运行程序,开始调试run
      • 7.查看变量
      • 8.其它重要命令


一.背景知识

  1. 程序的发布方式有两种,debug(调试)模式和release(发行)模式;
  2. Linux gcc/g++出来的二进制程序,默认是release模式;
  3. gdb是Linux中的调试器。用于debug版本代码的调试, 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g选项

二.安装gdb

sudo yum install gdb //想直接安装就加上-y选项

三.gdb的用法

为了详细解析gdb的各种用法,我们先创建两个文件:test.c和Makefile文件,用于测试gdb。
在这里插入图片描述
以下分别是两个文件中的测试代码:

//test.c:我们用一个从1加到100的程序来测试gdb
#include<stdio.h>
 
 int addToTop(int top)
 {
     printf("enter addToTop\n");
 
     int sum=0;
     for(int i=1;i<=top;i++)
     {
         sum+=i;
     }
     printf("quit addToTop\n");
     return sum;                                                                                                                                                                  
 }
 int main()
 {
     int top=100;
 
     int ret=addToTop(top);
     printf("ret:%d\n",ret);
     return 0;
 }


//Makefile(自动化构建项目的工具)
mytest:test.c //依赖test.c文件生成mytest可执行程序
     gcc test.c -g -o mytest -std=c99 //注意这里加上了-g选项,也用上了c99标准                                                                                                                                        
.PHONY:
make clean:
     rm -f mytest

运行结果
在这里插入图片描述

使用须知

程序的发布方式有两种:

  • debug版本:程序本身会被加入更多的调试信息,以便于进行调试。
  • release版本:不会添加任何调试信息,是不可调试的。

在Linux当中gcc/g++默认生成的可执行程序是release版本的,是不可被调试的。如果想生成debug版本,就需要在使用gcc/g++生成可执行程序时加上-g选项。
在这里插入图片描述
我们可以使用readelf指令查看ELF格式的文件信息:
在这里插入图片描述对同一份源代码分别生成其release版本和debug版本的可执行程序,debug版本发布的可执行程序的大小比release版本发布的可执行程序的大小要大一点,从上图我们可以看出debug版本中有debug信息,其原因就是以debug版本发布的可执行程序当中包含了更多的调试信息。

gdb的常用指令

1.进入调试

gdb [可执行程序] //在上述我们写的测试代码中,可执行程序命名为mytest
//所以接下来我们就以mytest为例

2.退出调试操作

ctrl+d 或 quit

3.显示源代码

list/l 行号:显示源代码,如果按换行键会接着上次显示的位置往下列,每次只显示10行
list/l 函数名:可以直接定位到函数名的位置

操作示例
在这里插入图片描述
在这里插入图片描述

4.设置断点breakPoint

beak(b) 行号:在某行设置一个断点
b 函数名:在某个函数开头设置断点

操作示例
意思是在源代码的第19行设置断点
在这里插入图片描述
意思是在源代码的addToTop函数开头设置断点,会自动识别到第5行(函数所在处)
在这里插入图片描述

5.查看断点信息/禁用断点/开启断点/删除断点

info b(break)

info b指令会显示出所有的断点,我们刚刚设置了两个断点,所以显示出了两个断点的信息,Num是断点的编号,Enb表示断点的状态,y表示断点正常使用,n表示断点已被禁用。
在这里插入图片描述
想要操作哪个断点不是看这个断点在代码中的行号,而是在断点列表的编号。
禁用断点

disable [断点编号Num]

开启断点

enable [断点编号Num]	

删除断点

d(delete) [断点编号] //不加断点编号,则删除所有已设置的断点

6.运行程序,开始调试run

运行程序后会在断点处停下,就跟我们在Windows下用vs编译器调试一样一样的。不设置断点的话,程序就直接跑完了,并输出结果。

r或run

在这里插入图片描述

7.查看变量

打印变量值

p 变量名

在这里插入图片描述

跟踪查看一个变量(长显示)

display 变量名

在这里插入图片描述

取消对变量的跟踪(取消长显示)

undisplay 变量名

8.其它重要命令

  • set var i=100:将某个变量设置成特定的值
  • continue(或c):从一个断点处,直接运行到下一个断点处
  • until 行号:在函数内,进行指定位置跳转,执行完区间代码
  • bt(或breaktrace):查看调用堆栈
  • info (i)locals:查看当前栈帧局部变量的值
  • n或next:逐过程执行代码
  • s或stap:逐语句执行代码,可以进入函数体内
  • finish:进入一个函数,只执行完该函数,就停下来,比如上述所例举的从1加到100的函数,如果我们这个时候还在执行for循环,我们直接输入finish,就可以直接指向完addToTop函数。
  • print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • info:查看gdb的使用手册

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

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

相关文章

【并发】Volatile作用详解

volatile保证变量的可见性禁止指令重排不保证原子性如何保证原子性volatile volatile关键字可以保证变量的可见性。 被volatile修饰的变量是共享的&#xff0c;因此不会将该变量上的操作与其他内存操作一起重排序。 无法保证原子性 保证变量的可见性 当多个线程访问同一个…

217页企业大数据能力平台建设技术方案(word可编辑)

1.1.1.1 建设方案架构 数据治理平台覆盖了从标准、设计、采集、开发到使用&#xff0c;再到交付的全数据治理流程&#xff0c;为组织提供了一站式数据治理运营平台&#xff0c;可满足数据共享交换、数据开发、数据运营多种应用场景&#xff0c;并通过构建数据工厂&#xff0c;实…

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域数据分析能力与项目科研水平

目录 专题一、空间数据获取与制图 专题二、ArcGIS专题地图制作 专题三、空间数据采集与处理 专题四、遥感数据处理与应用 专题五、DEM数据处理与应用 专题六、采样数据处理与应用 专题七、土地利用处理与应用 专题八、土地利用景观格局分析 专题九、土壤数据处理与应用…

【音视频第12天】GCC论文阅读(3)

A Google Congestion Control Algorithm for Real-Time Communication draft-alvestrand-rmcat-congestion-03论文理解 看中文的GCC算法一脸懵。看一看英文版的&#xff0c;找一找感觉。 目录Abstract1. Introduction1.1 Mathematical notation conventions2. System model2.1 …

代码随想录第17天 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

654.最大二叉树 /*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val (valundefined ? 0 : val)* this.left (leftundefined ? null : left)* this.right (rightundefined ? null : right)* }*/ /*** param {numbe…

2.docker-本地镜像发布

1.发布到阿里云 前往 容器镜像服务 (aliyun.com) 进入容器镜像服务 1.创建命名空间 2.创建镜像仓库 3.进入仓库管理页面获得脚本 # 需要输入密码,终端输出 Login Succeeded 则为登录成功 docker login --username用户名 registry.cn-hangzhou.aliyuncs.com# 标记 docker tag …

TCP 协议的相关特性

TCP 协议的相关特性&#x1f50e;TCP协议的特点&#x1f50e;TCP协议段格式&#x1f50e;TCP协议的相关特性确认应答(ACK)超时重传三次握手四次挥手三次挥手与四次握手的注意事项&#x1f50e;结尾TCP(Transmission Control Protocol) 传输控制协议 &#x1f50e;TCP协议的特点…

Hbase伪分布安装配置

Hbase安装配置 文章目录Hbase安装配置Hbase安装前提下载Hbase压缩包软件版本兼容性Hadoop和HbaseHbase和JDK软件安装软件位置创建数据保存和日志保存文件夹修改配置文件修改hbase-site.xml文件修改hbase-env.sh文件修改~/.bashrc文件启动hbase并验证权限问题Permission denied修…

外源6-BA在缓解多花黄精种子出苗过程中的代谢及转录组学变化

文章标题&#xff1a;Transcriptomics and metabolomics changes triggered by exogenous 6-benzylaminopurine in relieving epicotyl dormancy of Polygonatum cyrtonema Hua seeds 发表期刊&#xff1a;Frontiers in Plant Science 影响因子&#xff1a;6.627 作者单位&a…

电镀废水中的三价铬去除效率

电镀废水中铬的主要存在形式为六价铬&#xff08;绝大多数&#xff09;和三价铬&#xff0c;二者在一定条件下可互相转换&#xff0c;且二者都可能具有致癌左右&#xff0c;有所区别的是六价铬的毒性大约是三价铬毒性的100倍。 目前电镀废水中对铬的处理工艺一般为先将毒性较大…

KD2684S绕组匝间故障检测仪

一、产品简介 KD2684S匝间冲击耐压试验仪适用于电机、变压器、电器线圈等这些由漆包线绕制的产品。因漆包线的绝缘涂敷层本身存在着质量问题&#xff0c;以及在绕线、嵌线、刮线、接头端部整形、绝缘浸漆、装配等工序工艺中不慎而引起绝缘层的损伤等&#xff0c;都会造成线圈层…

【高危】Apache Linkis <1.3.2 存在反序列化漏洞(CVE-2023-29216)

漏洞描述 Apache Linkis 是一个用于将上层应用与底层数据引擎解耦&#xff0c;提供标准化接口的中间件。 该项目受影响版本存在存在反序列化漏洞&#xff0c;由于SqlConnection.java中未对host、port、username,、password等参数进行充分过滤&#xff0c;当恶意用户完全控制应…

SpringSecurity之权限模块设计

目录 前言 实现思路 代码结构 使用说明 前言 前面我们了解了关于微服务权限设计方案以及J W T的相关介绍&#xff0c;今天我们来聊一下&#xff0c;如何避免自己重复的写相同的代码&#xff0c;一次代码实现&#xff0c;即可完美复制到任何项目中实现权限相关的功能。 实现…

进阶方案:仅主机+NAT实现真机与虚拟机实现真正的互联互通

序 昨天写了NAT模式下使用端口转发实现真机可以访问到虚拟机的方案&#xff0c;但是我觉得应该还可以更简单&#xff0c;不需要使用端口转发&#xff0c;然后今天花了一上午的时间终于解决了这个问题&#xff0c;总结一下 仅主机模式 仅主机模式可以让真机跟虚拟机之间形成一…

【数据结构】算法的时间复杂度和空间复杂度 (上)(附leetcode练习题)

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C语言和数据结构 &#x1f33c;博客专栏&#xff1a;数据结构 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&…

智慧园区系统未来发展前景及应用趋势分析

完善的系统功能&#xff0c;强大的技术支持&#xff0c;使得智慧园区的应用趋势更加多元化&#xff0c;下面我们一起来了解一下智慧园区系统未来发展前景及应用趋势。 1、人工智能。人工智能技术是智慧园区未来发展的重要方向。人工智能可以帮助园区更好地解决实际问题&…

Docker笔记1 | Docker学习和简介

1 | Docker学习和简介1 学习来源2 官方学习资源3 Docker简介3.1 Docker是什么&#xff1f;3.2 Docker应用场景3.3 Docker架构3.3 Docker的优势3.3 与传统虚拟机的区别1 学习来源 本系列笔记学习主要参考书籍《Docker-从入门到实践》以及结合官网的教程&#xff0c;仅作为个人学…

电脑开机后进不了系统怎么办?

案例&#xff1a;我的电脑开机之后&#xff0c;进入不了系统怎么办&#xff1f; 【今天我打开电脑时&#xff0c;发现进入不了系统&#xff0c;以前从来没有出现过这种情况。有没有小伙伴有解决的办法&#xff1f;在线等&#xff0c;急&#xff01;】 电脑开机后无法进入系统…

node 服务发布后无法访问

node 服务发布后无法访问问题描述&#xff1a;在本地环境访问ip3060端口能正常访问&#xff0c;部署到服务器后访问接口一直超时 解决方法&#xff1a; 看端口是否对外暴露 操作步骤 设置防火墙 点击Windows defender 防火墙 点击高级设置 点击入站规则 新建规则 将3060端口…

《程序员面试金典(第6版)》面试题 10.10. 数字流的秩

题目描述 假设你正在读取一串整数。每隔一段时间&#xff0c;你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作&#xff0c;也就是说&#xff1a; 实现 track(int x) 方法&#xff0c;每读入一个数字都会调用该方法&#xff1b; 实现 g…