【Linux】调试器 - gdb 的使用

news2024/10/6 0:28:05

目录

一、背景知识

二、debug 与 release

1、生成两种版本的可执行程序

2、debug 与 release 的区别

三、gdb 的使用

1、调试指令与指令集

2、源代码显示、运行与退出调试

3、断点操作

4、逐语句与逐过程

5、调试过程中的数据监视

6、调试过程中快速定位问题


一、背景知识

我们在Linux上编写代码后,也希望能够同 vs 上一样可以进行代码调试,这时我们就需要一个调试工具,名为 gdb

程序的发布方式有两种, debug模式 release模式 ,Linux gcc/g++ 编译出来的二进制程序,默认是 release模式 。要使用 gdb 调试,必须在源代码生成二进制程序的时候, 加上 -g 选项,使它被编译成 debug模式 

二、debug 与 release

1、生成两种版本的可执行程序

我们首先编写一个简单的累加程序:

补充知识:因为老版的 c89 或 c90 标准的C语言语法不支持在 for 语句的括号内定义变量,因此我们需要在 Makefile 中的依赖方法里增加一个选项: -std=c99

 程序编写完成后,我们使用 gcc/g++ 编译出的可执行程序默认是 release 版本的。为了方便区分,我们先把第一次编译出的可执行程序重命名为 mytest-release


gcc/g++ debug 方式编译程序:

gcc -g 

我们修改一下 Makefile: 

此时,我们再次编译出的可执行程序就是 debug 版本的了。为了方便区分,我们把第二次编译出的可执行程序重命名为 mytest-debug

debug版本和release版本的可执行程序都是能够正常执行的。

2、debug 与 release 的区别

为什么 debug 版本的程序可以调试,而 release 版本的不可以呢?

这是因为以 release 版本发布的软件是给客户使用的,而客户不需要调试信息。如果在程序里增加了大量的调试信息,不仅该程序的体积会变大,而且运行速度也会变慢,给客户的使用体验不好。

而 debug 版本是给程序员使用的,程序员需要通过调试信息来调试程序。所以在程序里增加调试信息是非常有必要的。


读取可执行程序的二进制构成的指令:

readelf -S [可执行程序]

搜索调试信息的指令:

readelf -S [可执行程序] | grep debug

查看 mytest-debug 的调试信息: 

查看 mytest-release 的调试信息:

 可以非常直观的看到 debug 版本的可执行程序里包含调试信息,而 release 版本的可执行程序里没有包含。

三、gdb 的使用

1、调试指令与指令集

gdb [debug版本可执行程序]

 当出现如上字样时,gdb调试的准备工作就已经完成。

指令集:

  • list / l 行号:显示可执行程序源代码,接着上次的位置往下列,每次列10行。
  • list / l 函数名:列出某个函数的源代码。
  • r / run:运行程序。
  • n / next:单条执行。
  • s / step:进入函数调用
  • break(b) 行号:在某一行设置断点
  • break 函数名:在某个函数开头设置断点
  • info break :查看断点信息。
  • finish:执行到当前函数返回,然后挺下来等待命令
  • print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • 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

gdb会记住最近一次执行的指令。比如当我们使用指令 l 来查阅下面 10 行代码后,只需要再按 enter 键就可以继续执行 l 指令的功能。


2、源代码显示、运行与退出调试

list / l 行号:显示源代码


 r / run:运行程序

 因为没有设置断点,所以程序正常执行正常退出。

 quit :退出调试


3、断点操作

break(b) 行号:在某一行设置断点

break(b) 函数名:在某个函数开头设置断点

 info b:查看断点

 在屏幕上显示断点信息,从左到右依次为:

  • Num:断点编号。从 1 开始,依次递增
  • Enb:断点使能。y 为打开, n 为关闭
  • what:说明这个断点的位置等信息

 这时,我们再输入命令 r 运行程序,程序就会在断点处停下:

 同时显示断点已经被命中了一次。

disable breakpoint [断点编号]:关闭断点使能

 enable breakpoint [断点编号]:打开断点使能

 关闭断点使能:在不删除断点的条件下,使断点不生效。

 d [断点编号] :删除指定断点

 编号为 1 的断点被删除。

 d break :删除所有断点


4、逐语句与逐过程

 n / next :逐过程。类比到 vs 中的 F10 ,一步可以走过一个函数。

 直接执行完 addToTop 函数,并且该函数中的内容也被打印出来。执行完毕后,显示当前行号及当前行内容。

 s / step :逐语句。类比到 vs 中的 F11,逐条语句调试,遇到函数会跳转到函数内。

 跳转到 addToTop 函数内的第一行语句,显示当前行号及当前行内容。

因为在一个程序中可能会出现 A 函数调用 B 函数,B 函数调用 C 函数的情况。所以我们有时希望看到当前程序中函数的调用链。

 bt :查看当前的调用链

 因为函数调用是一个压栈的过程,所以我们可以看到 addToTop 函数被压栈到了 main 函数之上。


5、调试过程中的数据监视

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

 可以查看当前时刻变量的内容及地址等信息。在显示时,会给 被显示变量 一个编号,编号以 $ 开头,从 1 开始递增。 p 命令每使用一次,就打印一次变量信息。

 display [变量名/地址] :常显示变量(内置类型, 结构体等自定义类型,stl)

 只需要设置一次,接下来每次操作,都会显示 已设置变量 的当前时刻的信息。

 undisplay [编号] :取消常显示

 被取消常显示的变量,在接下来执行程序时不再被显示。


6、调试过程中快速定位问题

 until [行号] :在函数内,进行指定行位置跳转,执行完区间代码

 直接执行完了程序 12 行之前的所有代码,并且停留在第 12 行。

 finish :进入一个函数,只执行完该函数就停下来

当已经进入一个函数后,该函数中没有任何断点。就跑完当前函数停下来等待命令。

 执行完函数后,返回结果。

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

 直接运行至下一个断点处,并把运行过程打印了出来。


 set var n=XXX:设置某一个变量为特定的值

 直接把 i 的值设为了 90。


以上就是Linux调试器 gdb 的全部内容,同学们要多上手,边操作边学习。本章的内容就讲到这里,希望同学们多多支持,如果有不对的地方欢迎大佬指正,谢谢!

 

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

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

相关文章

吴恩达机器学习笔记(三)逻辑回归

机器学习(三) 学习机器学习过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。 —— 吴恩达机器学习第五章 —— 四、逻辑回归 线性回归局限性 线性回归对于分类问题的局限性:由于离群点…

LeetCode动态规划经典题目(九):入门

学习目标: 了解动态规划 学习内容: 1. LeetCode509. 斐波那契数https://leetcode.cn/problems/fibonacci-number/ 2. LeetCode70. 爬楼梯https://leetcode.cn/problems/climbing-stairs/ 3. LeetCode746. 使用最小花费爬楼梯https://leetcode.cn/proble…

ice规则引擎==启动流程和源码分析

启动 git clone代码 创建数据库ice,执行ice server里的sql,修改ice server的配置文件中的数据库信息 启动ice server 和ice test 访问ice server localhost:8121 新增一个app,默认给了个id为1,这个1可以看到在ice test的配置文件中指定…

MP503空气质量气体传感器介绍

MP503空气质量气体传感器简介MP503空气质量气体传感器采用多层厚膜制造工艺,在微型Al2O3陶瓷基片的两面分别制作加热器和金属氧化物半导体气敏层,封装在金属壳体内。当环境空气中有被检测气体存在时传感器电导率发生变化,该气体的浓度越高&am…

Spring Boot开发自定义的starter

目录 一、Spring Boot的starter概述 二、自定义starter的命名规则 三、自定义starter实战 1. 创建spring工程 2. 修改pom.xml 3. 编写配置类 4. 安装到本地maven仓库 5. 在其他项目中引入 6. 测试 一、Spring Boot的starter概述 SpringBoot中的starter是一种非常重要的机…

【web前端】CSS浮动

多个块级元素纵向排列找标准流,横向排列找浮动 浮动的特性: (1)浮动元素会脱离标准流(脱标) (有的浮动,有的没浮) (2)浮动的元素会在一行内显示…

C#中[]的几种用法

一、导入外部DLL函数 如[DllImport(“kernel32.dll”)]这叫引入kernel32.dll这个动态连接库。这个动态连接库里面包含了很多WindowsAPI函数,如果你想使用这面的函数,就需要这么引入。举个例子: [DllImport(“kernel32.dll”)] private static extern vo…

栈与队列总结

文章目录栈栈的概述栈的实现栈API设计栈代码实现栈的应用栈在系统中的应用括号匹配问题字符串去重问题逆波兰表达式问题队列队列的概述队列的实现队列的API设计队列代码实现队列的经典题目滑动窗口最大值问题求前 K 个高频元素栈 栈的概述 栈是一种基于先进后出(FILO)的数据结…

Android开发环境搭建

前面从全局和整体角度看了下Android包含哪些东西,自然,也涵盖了开发需要了解的内容,具体参见博文:从技术角度看Android大系统的构成_龙赤子的博客-CSDN博客 写完博文,感觉对Android开发也胸有成竹了,于是就…

ActiveReports.NET 17.0 Crack

ActiveReports.NET 17 添加新的 RDL 仪表板报告类型、新的 Blazor Web Designer,以及对 .NET 7 的全面支持。 2023 年 1 月 25 日 - 15:28新版本 特征 RDL 仪表板 - 新报告类型 RDL 仪表板提供了一种在可滚动的交互式容器中显示数据可视化控件(例如图表、…

【Typescript学习】使用 React 和 TypeScript 构建web应用(三)所有组件

教程来自freecodeCamp:【英字】使用 React 和 TypeScript 构建应用程序 跟做,仅记录用 其他资料:https://www.freecodecamp.org/chinese/news/learn-typescript-beginners-guide/ 第三天 以下是视频(0:40-0:60) 的内容 目录第三天1 创建Todo…

JavaEE day6 初识JavaScript

什么是JS JS是通行在各种浏览器的一种语言,JAVA后端代码运行在服务器上,JS代码内容配合HTML,浏览器对JS代码进行解释运行,然后展现在浏览器上,web开发离不开JS。 一般步骤为:(index.html与scr…

LinuxC—高级IO

高级IO 1 非阻塞IO/有限状态机编程 1.1 基本概念 定义 有限状态机(Finite State Machine) 缩写为 FSM,状态机有 3 个组成部分:状态、事件、动作。 状态:所有可能存在的状态。包括当前状态和条件满足后要迁移的状态。事件:也称为…

自动驾驶环境感知——视觉传感器技术

文章目录1. 摄像头的成像原理1.1 单目视觉传感器的硬件结构1.2 单目视觉的成像原理 –小孔成像模型1.3 单目视觉的成像原理 – 像素坐标系1.4 单目视觉三维坐标系转换 – 外参1.5 单目视觉的坐标系转换 – 从世界坐标点到像素坐标1.6 单目视觉的特性2. 视觉传感器的标定2.1 视觉…

CSS之精灵图

1. 精灵图 1.1 为什么需要精灵图 一个网页中往往会应用很多小的背景图像作为修饰,当网页中的图像过多时,服务器就会频繁地接收和发送请求图片,造成服务器请求压力过大,这将大大降低页面的加载速度。 为什么使用精灵图&#xff…

9、断点调试

文章目录9、断点调试9.1 为什么需要Debug9.2 Debug的步骤1 添加断点2 启动调试3 单步调试工具介绍9.3 多种Debug情况介绍1 行断点2 方法断点3 字段断点4 条件断点5 异常断点6 线程断点7 强制结束9.4 自定义调试数据视图9.5 常见问题【尚硅谷】idea实战教程-讲师:宋红…

Linux安装mysql--CentOS系统

Linux安装mysql 安装包: https://pan.baidu.com/s/10xvFpfl4nTktaEdhKbY3og 首先启动虚拟机,我是用FinalShell连接的 然后将下载的安装包上传至Linux系统中,直接rz回车就会跳出选择文件的窗口,选择需要上传的安装包即可等待上传…

计算机网络01_---软考高级系统架构师010

计算机网络知识点汇总: IPV4中有单播,组播,广播.IPV6没有广播 网络标准喝协议中要知道有IEEE802.3 以太网协议 局域网是以太网的一种 然后,IEEE802.11是无线局域网协议. TCP/IP协议族,这里,要知道从网络层开始,这里到传输层,然后传输层有个 TCP协议,这里TCP链接的时候有…

【沐风老师】3DMAX地板生成器插件FloorGenerator使用教程

FloorGenerator地板生成器插件,创建任何形状的地板几何图形,你可以完全控制从斜边到木板倾斜的所有参数。 伴随该地板的是”多重纹理贴图(MultiTexture)“插件,它使你能够将任意数量的位图随机指定给生成的地板。还提…

听障人士亲述:我们在VRChat用手语交流,成员规模5000人

如果你在B站上搜索VRChat,排在前面的热门视频几乎都是与老外聊天的内容。除了练习语言、交文化流外,你还能在VRChat上遇到不少哇哇乱叫的小孩。作为一款VR社交应用,除了有趣的小游戏外,说话聊天也是VRChat关键的玩法之一。而有这么…