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

news2024/9/27 7:21:44

目录

  • 1.debug和release
    • 拓展
  • 2.如何使用gdb调试
  • 3.指令集

我们平常调试C/C++代码大多实在Windows平台下的VS中,在LInux中,我们通常使用gdb来调试代码,虽然我们很少在LInux上对代码进行调试,gdb在实际的使用中用的较少,但我们必须要懂它,以面对各种环境。

本文目的:能够进行基本的掌握单进程程序的调试,即使用VS 2019、VS 2022的基本调试功能,都在Linux上使用gdb实现。

本文会在Linux环境下使用到vim编辑器make/Makefilegcc/g++,如果对这三个工具不熟悉,可点击下面的链接,结合本文一起学习。
vim编辑器
make/Makefile
gcc/g++

1.debug和release

在学习Linux下使用gdb调试之前,我们需要掌握以下三个有关debug和release模式的铺垫知识

  1. 程序的发布方式有两种,debug模式和release模式

    debug模式:该模式是程序员编写程序和调试代码的模式,该模式下生成的可执行程序含有调试信息体积要大于release模式生成的可执行程序

    release模式:没有调试信息,对程序做出优化,减小了程序的体积,更适合用户使用。该模式下生成的可执行程序是公司最终要推向市场的,由公司内测试人员测试是否完善,测试通过后推向市场。

    • 注意: debug模式下可以调试,release模式下无法调试。

    下图是VS 2019下,两种模式的选择图,需要那种模式选择那种模式即可
    在这里插入图片描述
    那在Linux下如何进行两个模式的转换呢?

  2. Linux下,gcc/g++出来的二进制可执行程序,默认是release模式

    • 在Linux下,使用常规的指令生成可执行程序为release模式,无法进行调试
    //常规生成
    gcc -o 可执行文件名 源代码文件
    g++ -o 可执行文件名 源代码文件
    
  3. 要使用gdb调试,必须在使用gcc/g++生成二进制程序时,加上-g选项

    gcc -o 可执行文件名 源代码文件 -g
    g++ -o 可执行文件名 源代码文件 -g
    

下面我们在如下test.c文件下编辑测试代码,进行测试
在这里插入图片描述
注意: 第7行代码,在for循环内定义变量i,这种写法是在c99中开始支持的,我使用的gcc/g++编辑器不支持这种写法,需要在执行命令后添加-std=c99

Makefile文件如下:
在这里插入图片描述
若不会使用Makefile文件,可直接使用如下两条指令测试

gcc -o MyTest-debug test.c -g -std=c99     //生成debug模式的可执行文件
gcc -o MyTest-release test.c -std=c99     //生成release模式的可执行文件

首先,测试release模式下,是否可以调试
在这里插入图片描述
如上图显示,红色框内,表示没有找到调试符号,无法进行调试。

其次,测试debug模式下,是否可以调试

在这里插入图片描述
没有显示错误信息,可以正常调试

最后: 观察两个可执行文件的体积,明显debug要大于release
在这里插入图片描述

拓展

我们可以使用readlef指令查看两个可执行文件下的信息,如下:

在这里插入图片描述
我们可以通过该指令,查看两个文件下的debug信息,如下(grep 指令为查找字符串指令):
在这里插入图片描述
MyTest-debug文件下找到了debug信息,MyTest-release什么都没有。

2.如何使用gdb调试

调试器的核心工作:定位问题

接下来简绍在Linux下如何使用gdb进行调试,该段落为分步骤讲解,将gdb下的命令总结放在了下一段落。
如果大家对gdb并不属性,按步骤操作即可

  1. 进入调试

    使用gdb file指令进入调试模式,如下图
    在这里插入图片描述

  2. 显示要调试的代码

    • l/list 行号:显示文件源代码,从输入的行号起,向下列出十行。一般我们在开始调试时,从l 1开始查看,接着输入lEnter键,即可获得上次查找位置往下的代码
      在这里插入图片描述
      注意: 输入gdb的指令后,Enter键就会记录。即,输入指令后,接着输Enter键会重复上面的动作。下面的指令也遵循这个规则。
    • 在刚进入gdb模式后,单独使用l进行查看,显示的代码为随机的
      在这里插入图片描述
  3. 设置断点

    • break/b 行号:在某一行设置断点

      如下图,在19行设置断点

    • break/b 函数名:在某个函数开头设置断点

      如下图,在addTestTop函数处设置断点

      在这里插入图片描述

      5是addTestTop函数内第一行代码的行号。

    • break/b 文件名:函数名:多文件时,可使用该方法设置断点

    • info break/b:查看断点信息

      在这里插入图片描述

      当程序运行后,会在断点处停下,在次查看断点,会显示在该断点处停下的次数。

      在这里插入图片描述

    注意: 在gdb中断点的序号是增长的,每次使用后会不断增长,直到关闭在开启后,重新从1开始

  4. 运行程序

    • r/run:运行程序

      • 有断点的情况,运行到断点处停止
        在这里插入图片描述
      • 无断点的情况,直接运行完 在这里插入图片描述
    • 注意: 一次运行是在全部main函数内全部代码运行完后结束,中途遇到断点停下后,进行其他查看指令不会影响此次调试

  5. 有断点,运行后,逐语句执行

    • s/step:遇到函数,进入函数内部

      在这里插入图片描述

    注意: 进入其他函数后,会产生调用链,即一个函数调用另一个函数,接着再去调用其他函数。

    可通过bt指令查看

    在这里插入图片描述

  6. 有断点,运行后,逐过程运行

    • n/next即遇到函数不进入函数,直接执行下一条指令

    在这里插入图片描述

    • 还记得上面说的按Enter键,执行上次执行的指令吗?如果需要调试的的内容过多,按一次sn后接着按Enter键即可
  7. 删除断点

    • delete/d breakpoints:删除所有断点

      在这里插入图片描述

    • delete/d n:删除序号为n的断点

      在这里插入图片描述

  8. 打开和关闭断点

    当我们不想使用一个断点,也不想删除该断点时使用

    • disable breakpoint 断点序号:关闭断点

      在这里插入图片描述

    • enable breakpoint 断点序号:打开断点

      在这里插入图片描述

  9. 查看变量

    • p 变量名:这个指令是需要查看的时候输入,不会影响调试,如下我在调试进入addTestTop函数后,执行了几段语句后,查看sum变量的结果,此时sum为6.

      在这里插入图片描述

    • 这样查看的效率太低,我们在VS中使用调试时,是执行一次相对应的变量随之变化,可以直接查看,该方法需要用户自己调用,不方便,我们可以使用以下的方法

  10. 跟踪查看变量

    • display 变量名:执行后,该变量在每执行一个语句后,都会显示出来

      在这里插入图片描述

    • 可以显示内置类型、结构体等自定义类型、stl

  11. 取消对断点的跟踪

    • undisplay 序号:不想跟踪某变量时使用

      在这里插入图片描述

  12. 跳转至指定行

    • until 行号:跳转至X行,在我们上面的代码中有一个循环,我们可以使用该指令跳转出循环
      在这里插入图片描述
  13. 将整个函数跑完

    • finash:进入一个函数后执行,只执行该函数,执行完后停下

    在这里插入图片描述

  14. 从一个断点,到下一个断点

    • continue/c:直接运行到下一个断点处

      在这里插入图片描述

    • util、finish、continue结合后,可实现基本的调试功能

  15. 退出gdb

    • q/quit:如果正在调试,会提示是否需要退出

    在这里插入图片描述

3.指令集

gdb binFile 退出: ctrl + dquit/q 调试命令:

  • list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
  • list/l 函数名:列出某个函数的源代码。
  • r或run:运行程序。
  • n 或 next:单条执行。
  • s或step:进入函数调用
  • break(b) 行号:在某一行设置断点
  • break 函数名:在某个函数开头设置断点
  • info break :查看断点信息。
  • finish:执行到当前函数返回,然后挺下来等待命令
  • print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • p 变量:打印变量值。
  • set var:修改变量的值
  • continue(或c):从当前位置开始连续而非单步执行程序
  • run(或r):从开始连续而非单步执行程序
  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除序号为n的断点
  • disable breakpoints:禁用断点
  • enable breakpoints:启用断点
  • info(或i) breakpoints:参看当前设置了哪些断点
  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值
  • undisplay:取消对先前设置的那些变量的跟踪
  • until X行号:跳至X行
  • breaktrace(或bt):查看各级函数调用及参数
  • info(i) locals:查看当前栈帧局部变量的值
  • quit:退出gdb

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

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

相关文章

【C++】从0到1入门C++编程学习笔记 - 核心编程篇:类和对象(下)

文章目录五、运算符重载5.1 加号运算符重载5.2 左移运算符重载5.3 递增运算符重载5.4 赋值运算符重载5.5 关系运算符重载5.6 函数调用运算符重载六、继承6.1 继承的基本语法6.2 继承方式6.3 继承中的对象模型6.4 继承中构造和析构顺序6.5 继承同名成员处理方式6.6 继承同名静态…

Java练习:面向对象进阶(上)

Java练习:面向对象进阶(上)一、定义数组工具类a. 工具类b. 测试类c. 输出结果二、定义学生工具类a. 学生类b. 工具类c. 测试类d. 输出结果三、继承和多态综合练习a. 动物类b. 饲养员类c. 狗类d. 猫类e. 测试类f. 输出结果一、定义数组工具类 …

S60v3固件备份

清理老硬盘 该删资料了 以前的N年前备份的帖子放在CSDN备份吧 没啥用的 以后用来讲故事的 大家不要介意. RM-632102.002 E5-00极限版 RM-566031.023 6730c极限固件 RM-469091.004 E52极限固件 E5-00 一代神机 RM-632 WIFI 横屏 500MP 内存256 S60V3FP2E5的ROM估计现在太难找…

Special Weekly | 瑞兔送福,Live Long and Prosper

SOFAWish 送虎迎兔各位 SOFAStack 社区的朋友好:我是 SOFAStack 社区的负责人鲁直,度过了令人难忘的虎年,我们即将迈入充满希望的兔年,在这里给大家拜个早年,祝大家兔年吉祥。虎年虽然有诸多的不便与艰难,…

ROS2机器人编程简述humble-第二章-SIMULATED ROBOT SETUP .4

ROS2机器人编程简述新书推荐-A Concise Introduction to Robot Programming with ROS2ROS2机器人编程简述humble-第二章-Executors .3.5书中没有使用几乎所有教程都会采用的turtlesim。美美的圣诞树画出来-CoCube如何将数学曲线变为机器人轨迹-花式show爱心代码-turtlesim篇直接…

Ribbon集成Nacos实现权重配置(本篇暂未支持spring gateway)

1场景:本篇,是师范 ribbon 与nacos 的权重测试,ribbon读取 nacos内权重设置。在调用端增加配置文件代码如下:(1) 本次测试nacos 1.4.1;(2) spring cloud 版本&#xff1a…

趣味三角——第2章——弦

目录 2.1 三角学的雏形与和弦表的产生 2.2 解读残缺粘土板“Plimpton 322”上的三角学 “知识来自影子&#xff0c;影子来自 磬折形(The knowledge comes from the shadow, and the shadow comes from the gnomon)” ——摘自<<Chou-pei Suan-king>>(周髀(b)算经…

while循环——求100以内偶数和

1 问题 求100以内的偶数和。 2 方法 public class EvenNumber{ public static void main(String[] args){ int i 1; int sum 0; while(i < 100){ if(i % 2 0){ System.out.println(i); sum sum i; } i; } System.out.println("100以内的偶数和为&#xff1a;"…

Java-线程基础

Java 线程详解 一个程序至少需要一个进程&#xff0c;而一个进程至少需要一个线程&#xff0c;它也被称为主线程。 线程是程序执行流的最小单位&#xff0c;而进程是系统进行资源分配和调度的一个最小单位。 在单个进程中&#xff0c;可以拥有多个并发执行的线程&#xff0c…

MYSQL分页查询时没有用ORDER BY出现数据重复的问题

背景 产品反馈&#xff0c;用户在使用分页列表时&#xff0c;出现数据重复的问题&#xff0c;查看代码后发现对应的分页SQL并没有使用order by进行排序&#xff0c;但是印象中Mysql的InnoDB引擎会默认按照主键id进行排序&#xff0c;本地测试了一下的确出现了部分数据在不同的页…

单线程事件处理器ControllerEventManager

0 前言 单线程事件处理器&#xff0c;Controller端定义的一个组件。该组件内置了一个专属线程&#xff0c;负责处理其他线程发送过来的Controller事件。还定义了一些管理方法&#xff0c;为专属线程输送待处理事件。 0.11.0.0版本前&#xff0c;Controller组件源码复杂。集群…

【Ajax】XMLHttpRequest和Level2

一、XMLHttpRequest什么是XMLHttpRequestXMLHttpRequest&#xff08;简称 xhr&#xff09;是浏览器提供的 Javascript 对象&#xff0c;通过它&#xff0c;可以请求服务器上的数据资源。之前所学的 jQuery 中的 Ajax 函数&#xff0c;就是基于 xhr 对象封装出来的。二、了解xhr…

java面试

java面试目录概述需求&#xff1a;设计思路实现思路分析1.代码&#xff1a;参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Surv…

【数据结构】保姆级队列各接口功能实现

目录 &#x1f34a;前言&#x1f34a;&#xff1a; &#x1f95d;一、队列概述&#x1f95d;&#xff1a; 1.队列的概念&#xff1a; 2.队列的结构&#xff1a; &#x1f349;二、队列的各接口功能实现&#x1f349;&#xff1a; 1.初始化队列&#xff1a; 2.入队&#…

k8s之挂载NFS到POD中

写在前面 在k8s之挂载本地磁盘到POD中 一文中我们看了如何将POD中的数据写到本地磁盘中&#xff0c;这种方式要求POD只能在指定的Node上&#xff0c;一旦POD更换Node&#xff0c;数据依然会丢失&#xff0c;所以本文看下如何通过将数据写到NFS中来解决这个问题。下面我们就开始…

sklearn数据降维之字典学习

文章目录字典学习简介构造函数实战Step1 制作实验数据Step2 小批字典学习Step 3 参数调整字典学习简介 如果把降维理解成压缩的话&#xff0c;那么字典学习的本质是编码&#xff0c;其目的是找到少量的原子&#xff0c;用以描述或构建原始样本。举个一维的例子&#xff0c;以a…

程序员护眼指南

前言 前言&#xff1a;脱发和近视是当代年轻人的两大痛点&#xff0c;今天来聊聊如何护眼。 文章目录前言一、护眼的核心二、调节睫状肌的方法1. 眨眼2. 望远3. 睡觉4. 促进血液循环5. 吃补剂6. 好的屏幕一、护眼的核心 护眼的核心就是保护睫状肌。 睫状肌是眼内的一种平滑肌…

一起自学SLAM算法:7.7 典型SLAM算法

连载文章&#xff0c;长期更新&#xff0c;欢迎关注&#xff1a; 针对式&#xff08;7-38&#xff09;所述的在线SLAM系统&#xff0c;以扩展卡尔曼滤波&#xff08;EKF&#xff09;为代表的滤波方法&#xff0c;是求解该状态估计问题最典型的方法&#xff0c;在7.4节中已经详细…

GY-US42超声波传感器模块介绍

GY-US42超声波传感器模块简介GY-US42 是一款低成本高品质测距传感器模块。工作电压 3-5v&#xff0c;功耗小&#xff0c;体积小&#xff0c;安装方便。其工作原理是&#xff0c;探头发射超声波&#xff0c;照射到被测物体后&#xff0c;探头接收返回声波&#xff0c;利用时间差…

学人工智能电脑主机八大件配置选择指南

来源&#xff1a;深度之眼 作者&#xff1a;frank 编辑&#xff1a;学姐 本篇主要是帮助大家构建高性能、高性价比的AI开发的硬件平台。如何不把钱浪费到不必要的硬件上&#xff0c;并合理搭配硬件配置节省预算是本文想要去讨论的问题。如果预算充足&#xff0c;笔者建议购买一…