【Linux基础开发工具】Linux调试器-gdb

news2025/1/19 20:39:08

目录

前言

1. 背景

2. 基本使用

总结


前言

        GDB(GNU Debugger)是一个功能强大的开源调试器,它用于调试C、C++等程序,在Linux环境下软件开发的过程中,调试是一个至关重要的环节。无论是在开发新的软件还是维护现有的代码,都难免会遇到各种各样的bug和问题,所有学会使用调试器是非常有必要的。

在这里插入图片描述

1. 背景

        程序的发布方式有两种,Debug模式和release模式

为什么要存在两种?

        Debug模式通常用于开发阶段,它会保留所有的调试信息,包括符号表、断点和日志,以便开发人员可以轻松地调试和定位问题。此外,Debug模式通常会关闭一些优化选项,以便在开发过程中能够更快地构建和运行程序。这样可以加快开发人员的迭代速度,提高开发效率

        release模式则用于最终发布产品的版本。它会启用各种优化选项,以提高程序的性能和减小体积。同时,release模式会删除所有的调试信息,从而减小程序的体积和保护源代码不被泄露。这样可以确保最终发布的产品具有更好的性能和安全性

Linux gcc/g++编译程序默认是什么模式?

在默认的情况下,Linux gcc/g++出来的二进制程序,默认是release模式

gcc的默认行为:

  • 默认动态链接
  • 默认release发布

如何以Debug模式下发布?

在使用gcc/g++编译时加上 -g选项 比如:

gcc -o mytest test.c -g

查看可执行程序添加的调试信息:

readelf指令(elf为可执行程序的格式)比如:

readelf -S mytest | grep -i debug

 结果如下:

2. 基本使用

在此之前需要先确保Linux机器上是否安装gdb,安装指令:

sudo yum install -y gdb

进入调试:

gdb binFile//binFile也就是编译后产生的可执行程序

Linux版本基本调试功能:

  • 运行起来才能调试(r)

  • 调试时可以看到代码(l)

  • 打断点/删除断点(b 断点位置、d 断点编号)

  • 关闭/开启断点(enable、disable)

  • 局部调试(finish、until、c)

  • 看到/取消 局部变量的内容和地址(display、undisplay)

  • 看到调用栈(bt)

  • 单步执行(s)

  • 逐过程执行(n)

  • 打印变量值(p)

  • 在调试过程中修改变量的值(set var)

 后续示例使用的代码:

#include<stdio.h>

int Sum (int n)
{
  int i = 1;
  int sum = 0;
  for(; i <= n; i++)
  {
    sum +=i;
  }
  return sum;
}
int main()
{

  printf("hello world!\n");
  //……

  int ret = Sum(100);

  printf("%d\n",ret);

  return 0;
}

Linux调试器gdb:

  • l 行号:显示指定行之后的代码(gdb自动记录最近一条指令)

点击回车可以继续查看后边的代码

  • 打断点:在指定位置打断点

b 行号

b 文件名:行号

b 函数名

  • 查看断点:info b

  • 关闭断点:disable 断点编号

此时编号为1的断点已被关闭,keep后边属性显示n(no)

  • 开启断点:enable 断点编号

  • r开始调试:直接跳到断点位置

直接跳转到了第一个断点位置

  • 逐语句 s(可进入函数)

  • 逐过程 n(逐行执行)

  • quit:退出gdb

  • display 变量的内容和地址:跟踪查看一个变量,每次停下来都显示它的值

每次逐语句执行时都输出了sum和i的值

  • undisplay 编号:取消常显示变量的内容和地址

  • c 直接跳到下一个断点

重新开始调试,r直接执行到第一个断点位置,c执行到下个断点

  • d 断点编号:删除断点
  • finish:执行完当前函数并返回,然后停下来

我们调试进入Sum函数,可以通过finish指令检查Sum函数,finish指令让Sum函数立即执行完毕,并返回返回值

  • breaktrace(或bt):查看各级函数调用及参数

  • until 行号:跳至对应行(范围执行)

重新调试进入Sum函数的循环

我们发现代码一直卡在9行和7行,我们又不想立即执完函数,就要求立即执行完循环,这时就可以使用until

直接跳到11行,这样就可以直接执行完循环 

  • p 变量:打印变量值。

(gdb) p sum 
$2 = 5050
  • set var 变量:修改变量的值(不用修改代码,测试其他分支)

比如我们在测试if语句分支时

if(flag==1)...

else ...

如果代码中以及规定flag值为1,但是又不想重新打开代码进行修改,这时就可以使用set var

比如:

set var flag=0

就可以直接修改flag的值来测试另一条分支


总结

        在软件开发的过程中,无论是初学者还是经验丰富的开发人员,都会遇到各种各样的bug和问题,学会使用gdb,可以极大地提高代码调试的效率和准确性,好了以上便是本文的全部内容,感谢阅读!

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

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

相关文章

linux cuda环境搭建

1&#xff0c;检查驱动是否安装 运行nvidia-smi&#xff0c;如果出现如下界面&#xff0c;说明驱动已经安装 记住cuda版本号 2&#xff0c;安装cudatoolkit 上官网CUDA Toolkit Archive | NVIDIA Developer 根据操作系统选择对应的toolkit 如果已经安装了驱动&#xff0c;选…

Visual Studio 2013 中创建一个基于 Qt 的动态链接库:并在MFC DLL程序中使用

在本地已经安装好 Qt 的情况下&#xff0c;按照以下步骤在 Visual Studio 2013 中创建一个基于 Qt 的动态链接库&#xff1a; 一、新建 Qt 项目&#xff1a; 在 Visual Studio 中&#xff0c;选择 “文件” -> “新建” -> “项目…”。在 “新建项目” 对话框中&#…

性能手机新标杆,一加 Ace 3 发布会定档 1 月 4 日

12 月 27 日&#xff0c;一加宣布将于 1 月 4 日发布新品一加 Ace 3。一加 Ace 系列秉持「产品力优先」理念&#xff0c;从一加 Ace 2、一加 Ace 2V 到一加 Ace 2 Pro&#xff0c;款款都是现象级爆品&#xff0c;得到了广大用户的认可与支持。作为一加 2024 开年之作&#xff0…

立体匹配算法(Stereo correspondence)SGM

SGM(Semi-Global Matching)原理&#xff1a; SGM的原理在wiki百科和matlab官网上有比较详细的解释&#xff1a; wiki matlab 如果想完全了解原理还是建议看原论文 paper&#xff08;我就不看了&#xff0c;懒癌犯了。&#xff09; 优质论文解读和代码实现 一位大神自己用c实现…

关于“Python”的核心知识点整理大全44

目录 ​编辑 15.3.4 模拟多次随机漫步 rw_visual.py 注意 15.3.5 设置随机漫步图的样式 15.3.6 给点着色 rw_visual.py 15.3.7 重新绘制起点和终点 rw_visual.py 15.3.8 隐藏坐标轴 rw_visual.py 15.3.9 增加点数 rw_visual.py 15.3.10 调整尺寸以适合屏幕 rw_vi…

介绍几种mfc140u.dll丢失的解决方法,找不到msvcp140.dll要怎么处理

如果你在使用电脑时遇到mfc140u.dll丢失错误时&#xff0c;这可能会导致程序无法正常运行&#xff0c;但是大家不必过于担心。今天的这篇文章本将为你介绍几种mfc140u.dll丢失的解决方法&#xff0c;找不到msvcp140.dll要怎么处理的一些解决方法。 一.mfc140u.dll文件缺失会有什…

Docker自建私人云盘系统

Docker自建私人云盘系统。 有个人云盘需求的人&#xff0c;主要需求有这几类&#xff1a; 文件同步、分享需要。 照片、视频同步需要&#xff0c;尤其是全家人都是用的同步。 影视观看需要&#xff08;分为家庭内部、家庭外部&#xff09; 搭建个人网站/博客 云端OFFICE需…

【超图】SuperMap iClient3D for WebGL/WebGPU —— 数据集合并缓存如何控制对象样式

作者&#xff1a;taco 最近在支持的过程中&#xff0c;遇到了一个新问题&#xff01;之前研究功能的时候竟然没有想到。通常我们控制单个对象的显隐、颜色、偏移的参数都是根据对象所在的图层以及对象单独的id来算的。那么问题来了&#xff0c;合并后的图层。他怎么控制单个对象…

PointNet人工智能深度学习简明图解

PointNet 是一种深度网络架构&#xff0c;它使用点云来实现从对象分类、零件分割到场景语义解析等应用。 它于 2017 年实现&#xff0c;是第一个直接将点云作为 3D 识别任务输入的架构。 本文的想法是使用 Pytorch 实现 PointNet 的分类模型&#xff0c;并可视化其转换以了解模…

【开源】基于JAVA的智能教学资源库系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程档案表3.2.2 课程资源表3.2.3 课程作业表3.2.4 课程评价表 四、系统展示五、核心代…

账号租号平台PHP源码,支持单独租用或合租使用

源码简介 租号平台源码&#xff0c;采用常见的租号模式。 平台的主要功能如下&#xff1a; 支持单独租用或采用合租模式&#xff1b; 采用易支付通用接口进行支付&#xff1b; 添加邀请返利功能&#xff0c;以便站长更好地推广&#xff1b; 提供用户提现功能&#xff1b;…

人工智能 机器学习 深度学习:概念,关系,及区别说明

如果过去几年&#xff0c;您读过科技主题的文章&#xff0c;您可能会遇到一些新词汇&#xff0c;如人工智能&#xff08;Artificial Intelligence&#xff09;、机器学习&#xff08;Machine Learning&#xff09;和深度学习&#xff08;Deep Learning&#xff09;等。这三个词…

【Linux】 last 命令使用

last 命令 用于检索和展示系统中用户的登录信息。它从/var/log/wtmp文件中读取记录&#xff0c;并将登录信息按时间顺序列出。 著者 Miquel van Smoorenburg 语法 last [-R] [-num] [ -n num ] [-adiox] [ -f file ] [name...] [tty...]last 命令 -Linux手册页 选项及作用…

公众号申请数量已超上限怎么办?

一般可以申请多少个公众号&#xff1f;目前企业主体只能申请2个公众号&#xff0c;这也意味着想做矩阵公众号的难度提升了。有些公司靠着诸多不同分工的公众号形成一个个矩阵&#xff0c;获取不同领域的粉丝。比如&#xff0c;目前主体为xx旗下公众号&#xff0c;共有30个&…

全面解析 I2C 通信协议

全面解析 I2C 通信协议 lvy 嵌入式学习规划 2023-12-22 21:20 发表于陕西 嵌入式学习规划 嵌入式软件、C语言、ARM、Linux、内核、驱动、操作系统 80篇原创内容 公众号 点击左上方蓝色“嵌入式学习规划”&#xff0c;选择“设为星标” 1、什么是I2C协议 I2C 协议是一个允许…

第二课:布尔逻辑与逻辑门、二进制及算术逻辑单元

第二课&#xff1a;布尔逻辑与逻辑门、二进制及算术逻辑单元 第三章&#xff1a;布尔逻辑与逻辑门1、计算机为什么使用二进制2、布尔代数&布尔代数在计算机中的实现1&#xff09;NOT 操作2&#xff09;AND 操作3&#xff09;OR 操作 3、特殊的逻辑运算——异或4、逻辑门的符…

stm32f103系统滴答定时器

简介 SysTick定时器, 是一个24位的定时器, 只能向下计数(n->0). 从RELOAD寄存器中自动重装载定时初值. 24位可以粗略约等于16M个数字. 寄存器 库函数配置系统定时器中断 选择8分频还是系统时钟源. 系统滴答次数, 也就是重装载值, 每次结束都会产生一个中断. 使用系统时钟…

C++ 文件操作篇

C 文件操作篇 文章目录 C 文件操作篇1 简介1.1 继承关系1.2 流1.3 缓冲区输入输出流中的缓冲streambuf 2 文件操作步骤2.1 头文件2.2 创建流对象2.3 打开文件2.4 读取数据第一种&#xff1a;**按元素直接读**第二种&#xff1a;**使用getline按行读**第三种&#xff1a;**使用*…

【鸿蒙千帆起】《钢岚》成为首款基于 HarmonyOS NEXT 开发的战棋新游

近日&#xff0c;紫龙游戏旗下 BlackJack 工作室全新战棋旗舰作品《钢岚》在华为游戏中心首发上线&#xff0c;并宣布《钢岚》完成鸿蒙原生应用开发&#xff0c;成为基于 HarmonyOS NEXT 开发的首款战棋新游&#xff0c;不但进一步丰富了鸿蒙生态战棋品类游戏内容&#xff0c;也…

Java 缓存中间件

Java 缓存中间件 关键词&#xff1a;Spring Cache、J2Cache、JetCache 一 、JSR 107 JSR107 中制订了 Java 缓存的规范。 因此&#xff0c;在很多缓存框架、缓存库中&#xff0c;其 API 都参考了 JSR 107 规范。 img Java Caching 定义了 5 个核心接口 CachingProvider - 定义…