【Linux学习】(9)调试器gdb

news2024/11/30 2:47:49

前言

Linux基础工具:安装软件我们用的是yum,写代码用的是vim,编译代码用gcc/g++,调试代码用gdb,自动化构建用make/Makefile,多人协作上传代码到远端用的是git。

在前面我们把yum、vim、gcc、make、git都已经学习了,今天我们就将学习最后一种基础工具gdb调试器

调试器gdb

1. 背景——debug和release

  1. 源文件编译时有有两种模式,debug模式和release模式
  2. debug通常称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序(因为debug模式在形成可执行程序的时候,添加了debug信息,所以可以被追踪调试)
  3. release称为发布版本,它往往是进行了各种优化,是程序在代码大小和运行速度上都是最优的,以便用户很好的使用
  4. 在Linux系统上gcc/g++形成的可执行程序,默认是release版本
  5. 如果想以debug形式编译,我们需要添加-g选项(-g生成调试信息)
  6. 验证:readelf -S指令可以读取可执行程序对应的二进制构成,再通过grep debug可以将debug信息过滤出来在这里插入图片描述

2. 使用gdb

  • 启动gdb:gdb 可执行程序
  1. 调试需要启动gdb在这里插入图片描述
  2. 注意在Linux系统上gcc/g++形成的可执行程序,默认是release版本。
  3. 如果想以debug形式编译,我们需要添加-g选项
  • 退出gdb:quit/q
  1. 调试结束,退出gdb在这里插入图片描述
  • 查看到调试的代码:list/l
(gdb) l		#list不一定从第一行开始显示调试代码,并且只显示一部分代码
(gdb) l n	#指定显示第n行调试代码
(gdb) l function	#指定显示某函数的代码块
(gdb) l [begin,end]	#指定显示某区间的代码块
  1. list查看调试代码,注意list不一定从第一行开始显示调试代码,并且只显示一部分代码在这里插入图片描述
  2. 如果我们想从第一行开始显示所有调试代码,list 0之后继续不断list或者直接回车即可显示所有代码在这里插入图片描述
  3. gdb会自动记录最近一条指令
  • 运行程序:run/r
  1. 运行程序,直到遇到断点或者程序运行结束在这里插入图片描述
  2. 在gdb中的run指令相当于VS中运行的快捷键Ctrl+F5
  • 设置断点:break/b
(gdb) b 行号	#在某一行设置断点
(gdb) b 函数名	#在某一个函数开头设置断点,即函数代码块的起始位置第一条有效语句
(gdb) b 文件名:行号N	#在某个文件的第N行打断点,即跨文件设置断点
(gdb) b 文件名:函数名	#在指定文件的指定函数设置断点
  1. 要调试代码,我们一般都需要先设置断点在这里插入图片描述
  2. 在VS中我们设置了断点,就可以在该代码行的最左侧显示一个红点,表示在当前行设置了断点,但是在gdb中它不是图形化界面,不会显示红点也没有任何提示,那我们在gdb中我们如何知道在哪里设置了断点了
  • 查看断点信息:info break
  1. 查看断点信息在这里插入图片描述
  2. 注意当我们退出了gdb,那我们在上一次所有设置的断点就没有了
  • 删除断点:delete/d
(gdb) delete [breakpoints] n	#删除断点编号为n的断点
(gdb) delete [breakpoints]		#删除所有断点
  1. 注意删除断点是根据断点编号删除的,不能像通过断点的行号删在这里插入图片描述
  2. 删除所有断点在这里插入图片描述
  • 禁用断点:disable
(gdb) disable 断点编号N	#禁用断点编号为N的断点
  1. 有的时候我们不想删除某个断点,但也不想使这个断点起效那该怎么办呢——禁用断点在这里插入图片描述
  2. 不想删某个断点是因为想保留调试的痕迹,不想使这个断点起效是因为我们已经确定问题不在该断点处
  • 启用断点:enable
(gdb) enable 断点编号N	#启用断点编号为N的断点
  • 逐语句和逐过程:step/s & next/n
  1. 我们调试代码一般先run将代码运行至断点停下来之后,就需要逐语句或逐过程一步一步慢慢的调试代码找出问题所在
  2. 逐语句和逐过程:
    • 逐语句:遇到函数,进入函数体中,不跳过函数体中的语句
    • 逐过程:把函数也当做一个语句,直接调试到下一条语句
    • 区别:逐语句和逐过程都是一次执行一条语句,唯一的区别就在于逐语句会进入函数,逐过程不会进入函数在这里插入图片描述
  3. gdb调试会直接跳过空行,跳转到下一句有效代码处
  4. 我们现在可以gdb中设置断点,逐过程的调试代码了,但是在调试代码时我们还需要监视变量
  • 打印变量值:print/p 变量
  1. 打印变量值在这里插入图片描述
  2. 但是我们发现print打印变量的值不能边调试边打印变量值,即不能常显示变量值
  • 边调试边打印变量值(常显示变量值):display 变量
  1. 跟踪查看一个变量,每次停下来都显示它的值在这里插入图片描述
  • 取消常显示变量值:undisplay
(gdb) undisplay 变量编号	#取消指定变量编号的常显示
(gdb) undisplay			#取消所有变量的常显示
  1. 取消对常显示变量的监视,注意不是通过变量名取消的,而是通过变量编号取消的在这里插入图片描述
  • 跳转到N行:until 行号N
  1. 例如现在我们的代码陷入到了一个循环中,我们想直接把这个循环执行完,那就可以使用until直接跳转到循环的下一行在这里插入图片描述
  • 快速调试一个函数是否有bug:finish
  1. finish:执行到当前函数返回,然后停下来等待命令在这里插入图片描述
  2. 注意:使用finish需要先进入到函数
  • 从一个断点处运行到下一个断点处:continue/c
  1. continue:从当前位置开始连续而非单步执行程序,一般用于从一个断点处运行到下一个断点处在这里插入图片描述
  2. run VS continue
    • run:从开始连续 而非单步执行程序——一般run运行程序到第一个断点处停下来
    • continue:从当前位置开始连续 而非单步执行程序——一般continue从当前断点运行到下一个断点停下来
  3. until & finish & continue
    • until:在函数内范围式 的运行
    • finish:按函数为单位 的运行
    • continue:从一个断点到下一个断点 大面积的范围式的运行
    • 调试:调试的本质是先一定要找到问题,只有找到了问题位置,才能通过分析它周边的数据,分析上下文,分析出问题出错的原因,原因清楚了,我们才知道对应的解决方案!
    • 我们可以通过until、finish、continue、等操作不断地缩小定位问题所在位置。
    • 一般先使用continue不断将问题从多个函数缩小到两个函数,再通过finish将问题缩小到一个函数,最后再通until、逐语句逐过程的定位问题所在位置
  • 修改变量的值:set var 变量=变量值
  1. 例如在一个循环中,我们知道了当循环变量的值为98的时候就会出现bug,那我们怎么可以快速执行到循环变量值为98的时候呢——修改变量的值在这里插入图片描述
  • 查看各级函数调用及参数:breaktrace/bt
  1. 查看各级函数调用及参数在这里插入图片描述
  • 查看当前栈帧局部变量的值:info/i locals

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

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

相关文章

Linux系统下minio设置SSL证书进行HTTPS远程连接访问

文章目录 1.配置SSL证书使用HTTPS访问2.MINIO SDK 忽略证书验证3.使用受信任的证书 1.配置SSL证书使用HTTPS访问 生成域名对应的SSL证书,下载Apache版本,我目前只发现Apache这个里面有对应的私钥和证书 私钥重命名为private.key证书重命名为public.crt&…

Diffusion原理

Diffusion 文章目录 Diffusion前置知识基本介绍数学推导前向过程反向过程损失求解前置知识 马尔科夫链: 第 i i i时刻上的状态条件依赖于且仅依赖于第 i − 1 i-1 i−1时刻的状态条件,即 ​ P ( x i ∣ x i − 1 , x i − 2 , . . . , x 1 ) = P ( x i ∣ x i − 1 ) P(x…

以通俗易懂的仓库来讲解JVM内存模型

JVM内存模型可以想象成一个大型的仓库,这个仓库被分成了几个不同的区域,每个区域都有特定的用途和规则。下面我们用一个仓库的比喻来介绍JVM内存模型: 仓库大门(JVM启动): 当JVM启动时,就像打开…

排查PHP服务器CPU占用率高的问题

排查PHP服务器CPU占用率高的问题通常可以通过以下步骤进行: 使用top或htop命令:这些命令可以实时显示服务器上各个进程的CPU和内存使用情况。找到CPU使用率高的进程。 查看进程日志:如果PHP-FPM或Apache等服务器进程的日志记录了具体的请求…

Django入门教程——用户管理实现

第六章 用户管理实现 教学目的 复习数据的增删改查的实现。了解数据MD5加密算法以及实现模型表单中,自定义控件的使用中间件的原理和使用 需求分析 系统问题 员工档案涉及到员工的秘密,不能让任何人都可以看到,主要是人事部门进行数据的…

su user更换用户后无法打开图形屏幕Cannot open your terminal ‘/dev/pts/0‘ 解决办法

我在docker内使用了su john更换了用户,执行petalinux-config -c kernel时打不开图形屏幕窗口,需要执行命令script /dev/null 进入docker和配置状态的所有命令行命令如下: johnjohn-hp:~/zynq$ ./docker_ubuntu16.sh rootjohn-hp:/home/john/…

2024最新版鸿蒙纯血原生应用开发教程文档丨HarmonyOS 开发准备-成为华为开发者

1. 成为华为开发者 在开始应用开发前,需要先完成以下准备工作。在华为开发者联盟网站上,注册成为开发者,并完成实名认证,从而享受联盟开放的各类能力和服务。 1.1. 注册账号 如果您已经有华为开发者联盟帐号,点击右…

记录如何在RK3588板子上跑通paddle的OCR模型

官网文档地址 rknn_zoo RKNPU2_SDK RKNN Model Zoo 一、PC电脑是Ubuntu22.04系统中完成环境搭建(板子是20.04) 安装模型转换环境 ​conda create -n rknn2 python3.10 conda activate rknn2 安装Ubuntu依赖包 su…

CloudStack云平台搭建:XenServer服务器系统安装

1.打开VMware虚拟机,点击“创建新的虚拟机” 2. 点击“自定义(高级)” → “下一步” 3. 点击“下一步” 4. 点击“稍后安装操作系统” → “下一步” 5. 选择“其他” → “其他64位” → “下一步” 6. 修改“虚拟机名称” 、“位置”&…

记录运维大屏监控平台的开发、springboot实现服务器性能监测分析系统

1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7…

h5小游戏5--杀死国王(附源码)

源代码如下 1.游戏基本操作 用空格键攻击,kill the king。 css样式源码 charset "UTF-8";font-face {font-family: "AddLGBitmap09";src: url("https://assets.codepen.io/217233/AddLGBitmap09.woff2") format("woff2"…

Canvas简历编辑器-选中绘制与拖拽多选交互设计

Canvas简历编辑器-选中绘制与拖拽多选交互设计 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM,并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计。那么此时我们就依然在轻量级DOM的基础上,关注于实现选中绘制与拖拽多选交…

系统安全隐患设计面面观

如果只是靠程序员去设计系统的话,估计会有很多安全问题,所以才需要有架构师、设计师,来面面俱到的设计系统安全模块,来应对外部的威胁。 功能开发在系统设计中往往优先考虑,但忽视安全问题可能导致重大隐患。为了解决…

在线竞赛资源共享和交流:如何利用平台高效备战信息学竞赛

在备战信息学竞赛的过程中,资源共享和交流已经成为不可或缺的一部分。如今,在线平台提供了丰富的学习资源、讨论机会和备考支持,考生可以通过真题解析、考点讨论群、备赛社区等方式,与其他考生互动,提升学习效果。本文…

中国五矿集团采购信息

打开https://ec.minmetals.com.cn/open/home/purchase-info点击第二页可以看到参数被加密了 要使用js的hook脚本为 (function() { var stringify_ JSON.stringify; JSON.stringify function(arg) { console.log("您猜怎么着?断住了! ——> …

不到 30 元的 AX1800 路由器!捷稀 JCG Q20 免拆机刷 Padavan / OpenWRT

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 上次把移动送的 JCG Q30 Pro 刷机之后,又从家里翻出个之前电信送的伊拉克战损 AX1800 路由器,意外的发现品牌也是 JCG,型号是 Q20,想着能不能也给它刷了。目…

企业内训|LLM大模型在服务器和IT网络运维中的应用-某日企IT运维部门

本课程是为某在华日资企业集团的IT运维部门专门定制开发的企业培训课程,本课程旨在深入探讨大型语言模型(LLM)在服务器及IT网络运维中的应用,结合当前技术趋势与行业需求,帮助学员掌握LLM如何为运维工作赋能。通过系统…

遗传算法与深度学习实战(20)——使用进化策略自动超参数优化

遗传算法与深度学习实战(20)——使用进化策略自动超参数优化 0. 前言1. 将进化策略应用于超参数优化2. 使用主成分分析扩展维度小结系列链接 0. 前言 我们已经学习了遗传算法 (Genetic Algorithms, GA) 的工作原理,并使用进化策略 (Evolutio…

进入 Masteria:第三周游戏指南

Alpha 第四季在 The Sandbox 中继续展开,这次为大家带来一个全新的星球!踏上 Masteria——一个专注于追求完美的星球。在这个星球的严酷环境中训练、竞争,并磨练你的技能。无论是通过「The Voice: 教练对决」细致打磨你的声乐技巧&#xff0c…

java-web-day5

1.spring-boot-web入门 目标: 开始最基本的web应用的构建 使用浏览器访问后端, 后端给浏览器返回HelloController 流程: 1.创建springboot工程, 填写模块信息, 并勾选web开发的相关依赖 注意: 在新版idea中模块创建时java下拉框只能选17, 21, 23 这里选17, maven版本是3.6.3, 很…