【Linux】gdb调试器

news2024/11/15 3:40:54

【Linux】gdb调试器

文章目录

  • 【Linux】gdb调试器
    • 1、调试器的意义
    • 2、gdb调试器介绍
      • 2.1 gdb的作用
      • 2.2 gdb的配置
    • 3、gdb调试器的使用
      • 3.1 常用调试命令
      • 3.2 调试前准备
      • 3.3 指令演示
        • 3.3.1 断点
        • 3.3.2 逐过程、逐语句
        • 3.3.3 查询变量
        • 3.3.4 跳转
        • 3.3.5 结束函数、跳出执行
        • 3.3.4 跳转
        • 3.3.5 结束函数、跳出执行

1、调试器的意义

编写程序中出现的语法错误可以由编译器发现并纠正

如果只是出现了逻辑错误呢?我们也能借助调试器去调试程序。

所谓的调试(Debug),是让代码一步一步慢慢执行,跟踪程序的运行过程。比如,可以让程序停在某个地方,查看当前所有变量的值,或者内存中的数

据;也可以让程序一次只执行一条或者几条语句,看看程序到底执行了哪些代码。

通过调试程序,我们可以监控程序执行的每一个细节,包括变量的值、函数的调用过程、内存中数据、线程的调度等,从而发现隐藏的错误或者低效的代码。

程序的发布方式有两种,debug 模式和 release 模式 ,分别是调试版本和发布版本。

debug 模式是程序员在自主编写代码时的模式,在 debug 模式下是 含有调试信息 的;而 release 模式下是 不含调试信息 的 ,且 release 进行了各种优化,方便用户使用。

在 Linux 的 gcc/g++ 编译器下编译的代码往往都是 release 版本 。其实对于这点也很容易想通,我们平常的开发一般是在 ide 上进行,当产品发布时再到 Linux 上进行线上发布,且测试人员测的也是 release 版本的代码。

2、gdb调试器介绍

2.1 gdb的作用

Linux系统中常用的调试器就是GDB调试器(GNU symbolic debugger)了

从名称上不难看出,它诞生于 GNU 计划(同时诞生的还有 GCC、Emacs 等),是 Linux 下常用的程序调试器。至今GDB 已经迭代了诸多个版本

当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada等。实际场景中,GDB 更常用来调试 CC++程序。

借助 GDB调试器可以实现以下几个功能:

  • 程序启动时,可以按照我们自定义的要求运行程序,例如设置参数和环境变量;
  • 可使被调试程序在指定代码处暂停运行,并查看当前程序的运行状态(例如当前变量的值,函数的执行结果等),即支持断点调试;
  • 程序执行过程中,可以改变某个变量的值,还可以改变代码的执行顺序,从而尝试修改程序中出现的逻辑错误。

2.2 gdb的配置

我们可以通过yum进行gdb的安装

yum -y install gdb

安装完成之后我们可以通过gdb -v来查看当前gdb的版本

image-20230131144538843

当版本信息显示出来时,也就说明了gdb的成功安装

3、gdb调试器的使用

3.1 常用调试命令

GDB 的主要功能就是监控程序的执行流程。这也就意味着,只有当源程序文件编译为可执行文件并执行时,并且该文件中必须包含必要的调试信息(比如

各行代码所在的行号、包含程序中所有变量名称的列表(符号表)等),GDB才会派上用场。

在编译时需要使用 gcc/g++ -g 选项编译源文件,才可生成满足 GDB 要求的可执行文件

命令全称解释
llist显示源程序代码的内容,包括各行代码所在的行号
bbreak在源代码指定的某一行设置断点,其中xxx用于指定具体打断点位置
rrun执行被调试的程序,其会自动在第一个断点处暂停执行
nnext令程序一行代码一行代码的执行
ccontinue当程序在某一断点处停止后,用该指令可以继续执行,直至遇到断点或者程序结束
pprint打印指定变量的值,其中 xxx 指的就是某一变量名
qquit终止调试
sstep如果有调用函数,进入调用的函数内部;否则,和 next 命令的功能一样
fifinish结束当前正在执行的函数,并在跳出函数后暂停程序的执行
jjump使程序从当前要执行的代码处,直接跳转到指定位置处继续执行后续的代码

3.2 调试前准备

我们都知道,程序调试面对的对象是经过翻译的二进制文件,那么在我们进行调试之前需要先通过gcc编译器来编译源文件成二进制文件

既然先前讲过了通过make,makefile实现了自动化编译,我就不直接使用命令来使用gcc,而是通过makefile文件来实现自动化编译

image-20230131155423523

(注:在循环内定义变量为c99标准,所以编译时需要加上 -std=c99 )

makefile完成后,再进行make,就生成了相应的二进制文件

gdb启动时会默认打印一堆免责条款(如下图),通过添加 --silent(或者 -q--quiet)选项,可将这部分信息屏蔽掉。

image-20230131155712960

避免问题后的界面:

image-20230131155908384

3.3 指令演示

这里简单演示下一些调试命令

3.3.1 断点

打断点格式:

  • b + 行号
  • b + 函数名

查看断点信息:

  • **info breakpoints/break/b **

image-20230131160717074

对应含义:

  • num:断点编号,从 1 开始
  • enb:断点使能,y代表打开,n代表关闭
  • what:断点在哪个函数中,在哪个文件,第几行

删除功能:

  • d + 断点编号:删除断点(是编号不是行号)
  • d break :删除所有断点

image-20230131161210627


断点使能:

  • disable b num :关闭断点使能
  • enable b num :打开断点使能

关闭断点使能相当于设置空断点


断点跳跃:

continue / c:从一个断点处,直接运行至下一个断点

3.3.2 逐过程、逐语句

  • next/n :逐过程,一步可以走掉一个函数,相当于 vs 中的 f10

    一次走过了函数,函数中打印的内容也会显示出来

    还会显示当前行数,以及当前行的内容

  • s :逐语句,一次走一条代码,可进入函数,同样的库函数也会进入

3.3.3 查询变量

p 变量名/地址:暂时查询变量

display 变量名:常显示变量的数据

undisplay 编号 :取消变量的显示

3.3.4 跳转

until 行号:不打断点,执行完区间代码,指定位置跳转

3.3.5 结束函数、跳出执行

finish:执行到当前函数返回,然后停下来等待命令

display 变量名:常显示变量的数据

undisplay 编号 :取消变量的显示

3.3.4 跳转

until 行号:不打断点,执行完区间代码,指定位置跳转

3.3.5 结束函数、跳出执行

finish:执行到当前函数返回,然后停下来等待命令

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

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

相关文章

Redis缓存穿透——实战代码教学,亲身体验高并发如何解决

🚀 注重版权,转载请注明原作者和原文链接 🥭 作者:全栈小袁 🍎 原创个人开源博客项目(目前V2.0微服务版本):https://github.com/yuanprogrammer/xiaoyuanboke 🍉 开源项目觉得还行的话点点star&…

Drain3改进的日志解析方法+代码

这本项目继承于https://github.com/logpai/Drain3 在此项目的基础上进行了改进,目前代码在PR阶段,感兴趣的可以从PR上拉取: 前言: 本项目继承于https://github.com/logpai/Drain3 在此项目的基础上进行了改进,目前代码…

【nv12 格式转换】不同图像数据格式之间转换代码实操

文章目录1 问题先行2 nv12介绍2.1 YUV格式2.2 NV12排布3 不同数据格式之间转换实操4 参考链接1 问题先行 nv12是什么格式?和常见的rgb/bgr有什么关系吗?他们之间能互相转换吗?如何读取一张图片,然后把图片转换成nv12格式&#xf…

liunx Reids哨兵模式+1主三从部署6.2.x

1.下载 wget https://download.redis.io/releases/redis-6.2.6.tar.gz2.解压 tar xzf redis-6.2.6.tar.gz 3.安装redis cd redis-6.2.6make && make install redis安装异常 安装gcc yum install gcc 检查gcc环境是否安装好rpm -qa|grep gcc 最后在安装redis m…

情人节适合送礼的数码好物有哪些?心意满满的数码好物清单

2023的情人节就快到了,各大数码品牌都已经摩拳擦掌。那么,情人节适合送礼的数码好物有哪些?下面,我来给大家推荐几款心意满满的数码好物,一起来看看吧。 一、蓝牙耳机 推荐产品:南卡小音舱 推荐理由&…

u盘为什么被写保护?u盘数据写保护如何恢复

u盘作为目前主流的数据存储辅助工具,能够存放各种重要数据。虽然u盘体积小巧使用方便,但是使用环节中也会存在各类问题,例如提示u盘写保护的情况。那么出现这种情况的原因是什么,如何解决u盘写保护问题以及写保护的u盘如何恢复数据…

Spring Cloud Gateway断言及过滤器使用

目录 1. 引入Spring Cloud Gateway 2. 核心概念 3. 工作原理 4. 配置路由断言工厂和网关过滤器工厂 5. 路由断言工厂 ​5.1 断言某个时间之后 5.2 断言某个时间之前 5.3 断言某个时间之间 5.4 根据cookie值断言 5.5 根据请求的标头断言 5.6 根据主机名来断言 5.7 根…

Java集合常见面试题(五)

Map 接口 ConcurrentHashMap 的实现原理 JDK 1.7 JDK1.7中的ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成,即ConcurrentHashMap 把哈希桶切分成小数组(Segment ),每个小数组有 n 个 HashEntry 组成。 其…

贴息贷款政策下,高校建立大数据实验室新思路

高校实验室建设总目标是搭建一站式教学服务平台,一站式教学服务平台概念是在深刻理解高校学科建设及存在的若干问题上提出。围绕着学科建设的各个方面,从专业开设、课程设置、师资培养、教学资源、实验环境、学生实训实习及就业创业等环节,提…

Hive UDF开发

Hive中,除了提供丰富的内置函数(见Hive函数大全–完整版(二))之外,还允许用户使用Java开发自定义的UDF函数。 开发自定义UDF函数有两种方式,一个是继承org.apache.hadoop.hive.ql.exec.UDF,另一个是继承or…

windows系统下安装伪分布式Hadoop3.x

1.下载 1.1下载Hadoop3.1.3 官网地址:https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/ 选择hadoop-3.1.3.tar.gz 1.2下载工具集winutils 由于Hadoop不直接支持Windows系统,因此需要使用工具集winutils进行支持。 下载网址:…

can‘t be used as a mixin because it extends a class other than ‘Object‘.

程序员如果敲一会就停半天,抱着一杯茶,表情拧巴,那才是在编程 Flutter 项目开发指导 从基础入门到精通使用目录 前言 - 基础关键字 class:声明一个类,提供具体的成员变量和方法实现。abstract class:声明一…

27.日志技术、XML

目录 一.日志技术 1.1 什么是日志 1.2 目前记录日志的方案 1.3 日志技术的优势 1.4 日志技术体系 1.5 Logback框架 1.5.1 下载地址 1.5.2 模块组成 1.5.3 Logback的使用 二.XML 2.1 XML概述 2.2 XML的特点 2.3 XML文件的使用场景 2.4 XMl文件的创建 2.5 XML的语法…

江瀚新材登陆上交所主板:募资约24亿元,甘书官父子为实际控制人

1月31日,湖北江瀚新材料股份有限公司(下称“江瀚新材”,SH:603281)在上海证券交易所主板上市。本次上市,江瀚新材公开发行股票66,666,667股,发行价格为35.59元/股,发行市盈率为14.80倍。 按发行…

更高性能表现、更低资源占用,高精度计算数据类型 DecimalV3 揭秘

数值运算是数据库中十分常见的需求,例如计算数量、重量、价格等,为了适应多样化运算场景,数据库系统通常支持精准的数字类型和近似的数字类型,当我们需要精确地表示小数并计算小数时,通常会考虑使用 Decimal 数据类型。…

低代码编程核心技术概念

从技术概念来讲,低代码编程跟通用编程是完全一致的。要利用好低代码编程工具,至少要掌握下面的技术概念。低代码编程核心技术概念一、数据结构这里的数据结构,指一般意义上的数据表和数据字段。 类似于数据库中的表及字段的概念,也…

蓝桥杯2022 A组 python

蓝桥杯2022 A组 python A组相对于B组就五道题不一样 第一题:裁纸刀 就先把四个边剪一下,然后先行后列,蛮简单的 # 20行 横着19刀,竖着21*20 print(1921*204)第三题:质因数个数 这题我感觉就是跟一个约数个数的模板一…

【python】Twisted网络编程

Twisted什么是Twisted?为什么使用twisted?Twisted 写TCP通信基本实例- TCP服务端- TCP客户端Twisted的Deferred机制Why Deferred?Deferred TCP-ECHO客户端实现- TCP client为例,什么是Twisted? Twisted是一种非阻塞的网络服务器…

useEffect 依赖项为对象或数组时,引发不断重渲染问题的原因及解法

转载自 https://www.izhaoo.com/2021/11/01/useEffect-object-dependent/背景今天封了个轮子,对组件传入参数生成对应的动画实例,当入参变化时重新渲染新实例。自然而然想到的就是 useEffect 监听 props 依赖了,如:useEffect(() &…

ESD器件(TVS)选型考虑

参考:TOSHIBA《Basics of ESD Protection (TVS) Diodes》①VRWM: Working peak reverse voltage工作峰值反向电压:ESD保护二极管显示非常高的阻抗。高于这个电压,会通过指定大小漏电流。设计的时候,信号的最大出现电压要在这个电压…