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

Linux基础工具|代码调试工具gdb的使用

1.debug/release

gdb是一款Linux下的一款调试器,在没有图形化界面下,是一种不错的调试方案(虽然在一般的开发环境中很少会使用gdb

不过要使用gdb,就先要了解debugrelease版本。

发布软件的时候有一种叫debug版本,另外一种叫release版本,在debug中包含了调试信息,所以一般生成的debug文件会比release大一些。而release版本文件对程序做了较大的优化,因此文件会小一些。

gcc/g++默认生成的可执行程序是release版本。但是gdb只能调试debug版本的文件,这个时候就需要给gcc/g++添加-g选项来生成release版本的文件。

$ cat main.c
#include <stdio.h>
int add(int num1, int num2)
{int sum = num1 + num2;return sum;
}
int main() 
{int num1 = 10;int num2 = 5;int sum = add(num1, num2);printf("num1: %d\n", num1);printf("num2: %d\n", num2);printf("sum: %d\n", sum);return 0;
}$ gcc main.c a.out-release
$ gcc main.c -g a.out-debug
$ ls 
a.out a.out-g main.c

如果我们需要查看release文件中的调试信息,可以使用命令readelf -S 文件名来读取可执行程序的数据段格式,-S表示读取各个段,在下面可以查看到debug信息,而没有带-g选项生成的可执行程序则没有这一信息(这些试着操作一下,知道行)。

补充:再编译原理中,Linux中形成的可执行程序格式不是立刻全部变成二进制的,而是变成ELF格式,内部含有各种数据段…

利用管道工具可以让我们更加清晰看到这一现象:

$ readelf -S a.out-release | grep -i debug
$ readelf -S a.out-debug | grep -i debug[27] .debug_aranges    PROGBITS         0000000000000000  00001061[28] .debug_info       PROGBITS         0000000000000000  00001091[29] .debug_abbrev     PROGBITS         0000000000000000  00001199[30] .debug_line       PROGBITS         0000000000000000  00001224[31] .debug_str        PROGBITS         0000000000000000  0000126c

2.gdb的基本操作

2.1.打开退出命令

  1. 打开gdb调试界面:gdb debug版的可执行程序

    $ gdb a.out-debug
    GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
    Copyright (C) 2013 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-redhat-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>...
    Reading symbols from /home/ljp/LimouCodeFile/CodeFile_2/MyFile_2023_9_25/a.out-debug...done.
    (gdb) 
    
  2. 退出gdb调试界面:使用[ctrl + d]或者quit(同时清空断点信息)

2.2.查看代码命令

  1. l/list [行号]:为查看调试的代码,每次显示10行(list 0可以重头开始看源代码文本)
  2. l/list [函数名]:列出某个函数的源代码上下文

2.3.断点操作命令

  1. b/break [源文件名] 源代码行号:设置断点,可以在某个源文件(因为有可能会有多个文件)的特定行号或函数名处设置断点(并且生成的断点编号一直是递增的)
  2. watch设置观察点,当指定变量的值发生改变时中断程序执行(不过要在调试过程中才能设置)
  3. delete 断点/观察点编号:删除断点/观察点,不是使用行号删除,而是删除断点对应的编号,删除所有断点就是delete breakpoints,注意这里就不需要指定文件,因为这里不是靠指定的行号,而是断点编号来取消断点的
  4. disable 断点/观察点编号:禁用断点/观察点,不是使用行号删除,而是断点对应的编号,禁用所有断点就是disable breakpoints
  5. enable 断点编号/观察点:启用断点/观察点,不是使用行号删除,而是断点对应的编号,开启所有断点就是enable breakpoints
  6. info/i b:查看当前设置的所有断点/观察点。其中,查看断点是否被启用在使用命令info b里的Enb那一列,观察点通常被标记为 hw watchpoint等字样,而断点通常被标记为 breakpoint(这里还可以查看一个断点被命中的次数)

补充1:当您退出gdb的时候,所有的断点/观察点信息会被自动清除。

补充2:断点的禁用和启用也叫作“使能断点”。

2.4.执行相关命令

  1. r/runrun 命令用于开始程序的执行。如果您在 gdb 中设置了断点或观察点,在使用 run 命令后,程序将会在第一个断点或观察点处暂停执行,此时您可以进行调试操作(例如单步执行、查看变量值等),类似VS 2022中第一次按下[F5]快捷键开始调试
  2. c/continue:在使用r启用调试后,可以使用c来跳转下一个断点,类似VS 2022中继续使用[F5]快捷键
  3. n/next:逐过程执行程序,但不进入函数内部,相当于VS 2022中的[F10]快捷键
  4. s/step:逐语句执行程序,进入函数内部,相当于VS 2022中的[F11]快捷键
  5. unitl 行号:可以跳转到行号出的代码,在使用for循环的时候很有用,不建议使用这个命令从main()跳到其他函数,这是一种局部性的跳转
  6. finish:执行完当前函数并返回到调用者,并且停下来,这是一种全局性的跳转

2.5.程序状态命令

  1. display 变量名:每次停在断点处时,自动显示指定变量的值,并且会显示对应的编号标识
  2. undisplay 变量编号:则取消显示对应编号的变量的值(注意这里使用的是变变量编号)
  3. print(变量)或p 变量:打印变量的值
  4. info locals:查看当前函数/栈帧的所有局部变量
  5. info args:查看当前函数的参数
  6. bt/backtrace:显示当前的函数调用堆栈。frame切换到指定的堆栈帧。up切换到上一个堆栈帧,down切换到下一个堆栈帧
  7. x:以十六进制格式查看内存内容

2.6.其他常用命令

  1. h/help:获取帮助信息

  2. set var 变量名可:以直接篡改修改某变量的值,有的时候需要查验在同一份代码下不同变量数据的表现

  3. show:显示当前的设置参数

补充:由于gdb有很多重复操作,因此如果需要重复使用一个命令,在gdb中输入第一次命令后,往后只不断按需要回车即可重复使用该命令。

3.gdb的进阶操作

在设计多进程和线程代码中,还有很多相关的gdb命令,哪些也值得查询一下。

相关文章:

Linux基础工具|代码调试工具gdb的使用

1.debug/release gdb是一款Linux下的一款调试器&#xff0c;在没有图形化界面下&#xff0c;是一种不错的调试方案&#xff08;虽然在一般的开发环境中很少会使用gdb&#xff09; 不过要使用gdb&#xff0c;就先要了解debug和release版本。 发布软件的时候有一种叫debug版本…...

Ribbon负载均衡器

两种&#xff1a; 1.1 集中式负载均衡&#xff0c;服务端负载均衡 硬件 nginx 轮询、负载、哈希、随机、权重 为什么要做负载均衡&#xff1f; 1.2 客户端负载均衡器 用客户端 负载均衡器 很多机制可以自定义 小知识&#xff1a;不想让别人调自己&#xff0c;只想用别人的…...

初级软件测试入门教程

一、软件测试的基本概念 1、软件测试的定义 就是以发现错误为目的而运行程序的过程。 软件测试员的目标是找到软件缺陷&#xff0c;尽可能早一些&#xff0c;并确保其得以修复。 2、软件测试方法总体分类 试图验证软件是“工作的”&#xff08;所谓“工作的”就是指软件的…...

4项简化IT服务台任务的ChatGPT功能

近几个月&#xff0c;随着人工智能聊天机器人 ChatGPT 风靡全球&#xff0c;用户可以通过它生成脚本、文章、运动计划表等。同时&#xff0c;这项技术在各行各业都能够进行无穷无尽的应用&#xff0c;在本文中&#xff0c;我们将探讨这项现代技术如何帮助ITSM团队提升服务交付和…...

idea创建同级项目-纠结是SB

idea创建同级项目-纠结是SB 创建方法&#xff1a;...

任正非:天空足够大,世界会越来越兴盛

近日&#xff0c;华为公司创始人任正非与南开大学新闻与传播学院院长、科技日报原总编辑刘亚东今年7月7日在深圳一间咖啡厅的对话最新曝光。 在对话过程中&#xff0c;任正非以“拉法尔喷管”来描述华为的研发体系: “喇叭口”吸收宇宙能量&#xff0c;经过理论研究&#xff0…...

SMOKE-CMAQ实践技术应用

大气污染物排放是空气污染的源头&#xff0c;气象因素是影响污染程度的重要因素&#xff0c;因此空气质量模式要求气象资料和污染物排放清单作为输入&#xff0c;其中由于大气污染源复杂性、数据滞后性、动态变化、规律性不明显等特点&#xff0c;使得大气污染源排放清单输入准…...

电脑提示vcruntime140.dll缺失重新安装的修复方法

电脑出现 vcruntime140.dll 丢失的情况&#xff0c;通常是由于系统缺失了 Microsoft Visual C Redistributable 的运行库文件。这个文件是许多应用程序在运行时所需的依赖库&#xff0c;如果丢失了该文件&#xff0c;可能会导致某些软件无法正常运行。 下面是关于 vcruntime140…...

Vue实现Hello World

<div id"aa"> <p>{{h}}</p> </div> <script src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js"></script> <script> const hello new Vue({ el:#aa, data:{ h : Hello World } }) </script>...

Android---Bitmap 与 String 互转

1. Bitmap 转 String /*** 图片转字符串* param bitmap 要转换的图片* return 图片转换后的字符串*/public static String imageToBase64(Bitmap bitmap){ByteArrayOutputStream byteArrayOutputStream new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.J…...

python播放声音库playsound以及获取路径以及修改库源码

用python播放声音文件&#xff0c;使用了库playsound。 说一下本机环境&#xff1a;win10 64位&#xff0c;python3.10.4 &#xff0c;python2.7.13 最近一直用python3&#xff0c;所以首先进入python3的路径&#xff0c;运行pip3 install playsound 和pip3 install playsound2…...

山西电力市场日前价格预测【2023-09-27】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-09-27&#xff09;山西电力市场全天平均日前电价为342.48元/MWh。其中&#xff0c;最高日前电价为454.24元/MWh&#xff0c;预计出现在18: 30。最低日前电价为171.32元/MWh&#xff0c;预计…...

laravel框架 - 事件与监听器

一&#xff0c;绑定事件与监听器 在app\Providers下的EventServiceProvider.php中添加我们定义的事件与监听器 protected $listen [Registered::class > [SendEmailVerificationNotification::class,],App\ebvent\RegisterMessage>[//事件App\listeners\SendMessage//监…...

Android存储权限完美适配(Android11及以上适配)

一、Bug简述 一个很普通的需求&#xff0c;需要下载图片到本地&#xff0c;我的三个测试机&#xff08;荣耀Android10&#xff0c;红米 11 和小米Android 13都没有问题&#xff09;。 然后&#xff0c;主角登场了&#xff0c;测试的三星Android 13 死活拉不起存储权限弹窗。 …...

国产手机芯片4G方案_紫光展锐安卓核心板虎贲4G智能模块方案定制

元器件清单即BOM物料清单&#xff0c;不同行业领域的BOM表侧重点不一样。安卓主板的BOM表则侧重点在于元器件物料的清单&#xff0c;也就是安卓电路板的PCBA清单&#xff0c;精密的安卓板有上千个物料&#xff0c;可以帮助我们估算物料成本&#xff0c;建立生产计划&#xff0c…...

异步通讯技术之RabbitMQ

前言: 📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。 😇😇😇有兴趣的话关注博主一起学习,一起进步吧! 一、初识MQ …...

tcp/ip协议2实现的插图,数据结构

&#xff08;1&#xff09;以上是插图第2章和3章 的 mbuf 与 ifnet 与 ifaddr 与 le_softc 与 sockaddr_dl结构体 (2) 以下是 二章mbuf的宏和函数和三章函数下 &#xff08;3&#xff09; 以下是 三章接口层的宏和函数上 &#xff08;4&#xff09;4 四章1&#xff1a;以太网接…...

Redis学习 - 了解Redis(三)

1. 什么是缓存击穿、缓存穿透、缓存雪崩&#xff1f; 1.1 缓存穿透问题 先来看一个常见的缓存使用方式&#xff1a;读请求来了&#xff0c;先查下缓存&#xff0c;缓存有值命中&#xff0c;就直接返回&#xff1b;缓存没命中&#xff0c;就去查数据库&#xff0c;然后把数据库…...

API接口自动化测试框架

前言 接口自动化逐渐成为各大公司投入产出最高的测试技术。但是如何在版本迅速迭代过程中提高接口自动化的测试效率&#xff0c;仍然是大部分公司需要解决的问题。 框架定位 数据驱动设计模式&#xff0c;无需写测试代码脚本即可实现自动化等价类非等价类覆盖&#xff0c; E2E…...

MySQL学习笔记1

任务背景&#xff1a; 将原来的数据库从原来的MySQL-5.5 升级到现在的MySQL-5.7&#xff0c;并保证数据完整。 1&#xff09;不同版本MySQL的安装&#xff1b;yum glibc、源码安装&#xff0c;是企业100%要用到的。 2&#xff09;MySQL数据库版本升级&#xff1b;&#xff08…...

从零部署Jetson Xavier NX:Ubuntu 20.04系统烧录、CUDA环境配置与深度学习框架实战指南

1. 开箱与硬件准备 第一次拿到Jetson Xavier NX开发板时&#xff0c;我差点被它小巧的尺寸骗了——这个巴掌大的板子居然藏着384个CUDA核心和48个Tensor核心。我入手的是带128GB SSD的EMMC版本&#xff0c;实测下来这套配置跑YOLOv5这类中等规模的模型完全够用。开箱清单里除了…...

从数学建模到真实运维:如何用调度模型优化你校园里的共享单车?

从数学建模到真实运维&#xff1a;校园共享单车调度系统的工业级设计实践 清晨7点的校园东门&#xff0c;总能看到一群学生围着仅剩的几辆共享单车"抢车"的场景&#xff1b;而下午3点的体育馆停车点&#xff0c;却堆积着数十辆无人问津的车辆。这种供需错配现象背后&…...

当水力裂缝撞上天然裂缝:用COMSOL相场法重现‘海马尾巴’般的转向路径

当水力裂缝邂逅天然裂缝&#xff1a;COMSOL相场法中的"海马尾巴"转向现象解析 在油气田开发领域&#xff0c;水力压裂技术正经历着从经验驱动到数字仿真的范式转变。相场法作为断裂力学模拟的前沿方法&#xff0c;以其独特的"无预设路径"优势&#xff0c;…...

高效转换:Markdown与思维导图的无缝衔接指南

1. 为什么需要Markdown与思维导图的相互转换&#xff1f; 第一次接触Markdown和思维导图时&#xff0c;我就被它们的简洁高效所吸引。Markdown用简单的语法就能写出结构清晰的文档&#xff0c;而思维导图则能直观展示复杂的逻辑关系。但真正让我头疼的是&#xff0c;这两种工具…...

从步进电机到激光雕刻:实战解析STM32F4定时器主从模式在运动控制中的两种高级玩法

STM32F4定时器主从模式在运动控制中的双场景实战指南 当步进电机的脉冲序列需要精确计数&#xff0c;或是激光雕刻机的PWM波形必须严格同步时&#xff0c;工程师们往往面临一个共同挑战&#xff1a;如何在不增加CPU负担的前提下&#xff0c;实现硬件级的精准时序控制&#xff…...

3个关键步骤让老款Mac重获新生:OpenCore Legacy Patcher终极指南

3个关键步骤让老款Mac重获新生&#xff1a;OpenCore Legacy Patcher终极指南 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 当苹果宣布你的Mac不再支持最新的macOS系统时…...

终极指南:如何用Continue AI代码助手提升10倍开发效率

终极指南&#xff1a;如何用Continue AI代码助手提升10倍开发效率 【免费下载链接】continue ⏩ Continue is an open-source autopilot for VS Code and JetBrains—the easiest way to code with any LLM 项目地址: https://gitcode.com/GitHub_Trending/co/continue …...

RAG、LangChain、Agent 到底有什么关系?

说起来&#xff0c;从前有一次组会&#xff0c;一个刚转过来的同学问了煮啵一个问题&#xff1a;“RAG、LangChain、Agent——这三个词我都见过&#xff0c;但我真的不知道它们是什么关系&#xff0c;感觉哪里都在用&#xff0c;但说不清楚。”&#xff08;咳咳&#xff0c;当然…...

NW.js 保姆级教程来了!零基础也能开发桌面应用(2026 最新版)

一句话总结&#xff1a;用你熟悉的 HTML CSS JavaScript&#xff0c;直接打包成 Windows / macOS / Linux 桌面程序——这就是 NW.js 的魔力&#xff01; 一、NW.js 到底是什么&#xff1f;别再和 Electron 搞混了&#xff01; 如果你会前端开发&#xff0c;但一直以为“做桌…...

Qwen2.5-VL-7B-Instruct详细步骤:GPTQ量化模型加载与推理加速技巧

Qwen2.5-VL-7B-Instruct详细步骤&#xff1a;GPTQ量化模型加载与推理加速技巧 1. 项目概述 Qwen2.5-VL-7B-Instruct是一款强大的多模态视觉-语言模型&#xff0c;能够同时处理图像和文本输入&#xff0c;生成高质量的响应。本指南将详细介绍如何通过GPTQ量化技术来优化模型加…...