【Linux】gdb调试器

news/2024/12/5 6:16:37/

【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.ppmy.cn/news/20970.html

相关文章

leetcode 1626. Best Team With No Conflicts(最佳无冲突团队)

scores数组中是每个队员的得分,ages数组中为对应队员的年龄, 现在要从这个队里挑选出一些队员,使总得分最高, 挑选时年龄大的要比年龄小的score更高(严格大于),才不会产生冲突。 返回最高的得分…

python小游戏——怀念经典坦克大战代码

♥️作者:小刘在这里 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放,愿所有的美好&#…

Python流程控制语句之跳转语句

上一篇:Python流程控制语句之循环语句 文章目录前言一、break 语句二、continue 语句三、pass 空语句总结前言 上一篇博客我们讲解了Python中的循环语句,知道循环条件一直满足时,代码将会一直执行下去,就像一辆迷路的车&#xff…

【flyway入门及使用】解决生产环境sql更新遗漏

flyway入门及使用 一、简单介绍 flyway开源的数据库版本管理工具 二、为什么要使用flyway 1.自己写的sql没有在全部环境执行 2.别人写的sql没有在全部环境执行 3.有人修改了已经执行过的SQL,期望再次执行 4.需要新增环境做数据迁移 三、flyway是如何工作 1…

国内在线图表工具,你能说出几个?

之前写过很多篇在线图表、数据分析处理类工具的内容,但都是针对单个问题写的,没有将其整合起来,今天就借着这个问题,做个国内在线图表工具的合集。 一共5大类,每一类各介绍一个代表性工具,全文较长&#x…

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

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

力扣刷题记录——796. 旋转字符串、884. 两句话中的不常见单词、1046. 最后一块石头的重量

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——796. 旋转字符串、884. 两句话中的不常…

【Java Swing】Java组件及事件处理

图形用户接口1、Swing概述2、Swing顶级容器3、布局管理器4、事件处理5、Swing常用组件1、Swing概述 Swing是一种轻量级的组件,它由Java语言开发,可以通过使用简洁的代码、灵活的功能和模块化的组件来创建优雅的用户界面Swing组建的继承关系 2、Swing顶…