【Linux】Linux环境基础开发工具使用之Linux调试器-gdb使用

news2024/9/20 13:14:51

在这里插入图片描述

目录

  • 一、程序发布模式
    • 1.1 debug模式
    • 1.2 release模式
  • 二、默认发布模式
  • 三、gdb的使用
  • 结尾

一、程序发布模式

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

1.1 debug模式

  • 目的:主要用于开发和测试阶段,目的是让开发者能够更容易地调试和跟踪程序中的错误(bugs),以确保软件在发布前无重大错误。
  • 特性
    • 编译时不会进行过多的优化,以便更容易地通过调试工具(如GDB)查看程序的状态,包括变量值、函数调用栈等。
    • 包含详细的调试信息(如符号表),这些信息对于理解程序的行为和定位问题至关重要。
    • 运行时可能包含额外的检查,如数组边界检查、空指针检查等,以帮助捕获潜在的错误。
    • 通常执行速度较慢,因为缺少优化并且增加了额外的调试信息。

1.2 release模式

  • 目的:用于将软件部署到生产环境,目标是提供稳定、高效的运行体验,将软件部署到生产环境,供最终用户使用。
  • 特性
    • 编译时会进行各种优化,如代码重排、循环展开、内联函数等,以提高程序的执行速度和效率。
    • 不包含调试信息(如符号表),以减少可执行文件的大小并提高加载速度。
    • 移除所有运行时检查(如数组边界检查、空指针检查等),以减少运行时开销。
    • 进行了严格的代码检查和测试,以确保程序的稳定性和安全性。
    • 通常执行速度快,因为经过了优化并且去除了不必要的检查。

二、默认发布模式

Linux gcc/g++出来的二进制程序,默认是release模式,在release模式下是无法进行调试的,要使用gdb调试,必须在源代码生成二进制程序的时候,加上 -g 选项。

那么要怎么才能证明上面的结论呢?

  1. 首先不带任何选项使用gcc编译Test.c文件生成可执行程序a.out,再使用gdb调试a.out,我们会发现没有调试信息。然后使用gcc带-g选项编译Test.c文件生成可执行程序a.out,再使用gdb调试a.out,会发现没有刚刚那个提示。

    在这里插入图片描述

    在这里插入图片描述

  2. 分别使用gcc以不带选项和带-g选项分别生成可执行程序release版本和debug版本,我们可以发现debug版本的大小比release版本的大,因为debug版本的可执行程序中添加了调试信息

在这里插入图片描述

  1. 我们在Linux中形成的可执行程序的格式为可执行与可链接格式(ELF格式),在Linux中,readelf是一个用于显示ELF文件信息的工具,我们可以使用readelf指令通过管道筛选出调试信息。

    我们发现release版本下并没有调试信息,而debug版本下有调试信息。

在这里插入图片描述


三、gdb的使用

gdb 文件名:进入调试

  • list/l 行号:从输入的换行处显示源文件的源代码,接着上次的位置往下列,每次列10行。若没有输入行号,那么gdb会根据上下文开始显示源代码。
    在这里插入图片描述

  • list/l 函数名:显示函数的源代码。
    在这里插入图片描述

  • break(b) 行号:在某一行设置断点
    在这里插入图片描述

  • break 函数名:在某个函数开头设置断点
    在这里插入图片描述

  • info(i) break(或breakpoints) :查看断点信息。
    在这里插入图片描述

  • disable breakpoints n:禁用序号为n的断点
    在这里插入图片描述

  • enable breakpoints n:启用序号为n的断点
    在这里插入图片描述

  • delete(d) breakpoints n:删除序号为n的断点,断点的序号是线性增长的,只会越来越大,不会因为新添加的断点是前面删除的断点,导致新的断点的序号变为原来的序号。
    在这里插入图片描述

  • delete(d) breakpoints:删除所有断点
    在这里插入图片描述

  • r或run:当没有断点时运行程序,当有断点时运行到断点处。
    在这里插入图片描述

  • n 或 next:单步调试,当使用n命令进行单步调试时,gdb会执行下一行代码。如果下一行代码是一个函数调用,它会将函数调用的结果一次性显示出来,但不会深入到函数内部去逐行执行。
    在这里插入图片描述

  • s或step:单步调试,当使用s命令进行单步调试时,gdb同样会执行下一行代码。但是,如果下一行代码是一个函数调用,s命令会进入这个函数内部,并从函数的第一条语句开始逐行执行。这意。
    在这里插入图片描述

  • finish:执行到当前函数返回,然后挺下来等待命令
    在这里插入图片描述

  • print ( p ):打印表达式的值,通过表达式可以修改变量的值或者调用函数
    在这里插入图片描述

  • p 变量:打印变量值。
    在这里插入图片描述

  • set var:修改变量的值
    在这里插入图片描述

  • continue(或c):继续执行被调试的程序,直到遇到下一个断点、程序结束或遇到其他导致程序停止的事件。
    在这里插入图片描述

  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值
    在这里插入图片描述

  • undisplay n:取消对序号为n的变量的跟踪
    在这里插入图片描述

  • until :主要作用是继续执行程序,直到当前栈帧(通常是当前函数)的返回点,或者遇到下一个断点。

  • until n:n为某一行代码的行号,该命令会使程序运行至第n行代码处停止。
    在这里插入图片描述

  • breaktrace(或bt):查看各级函数调用及参数
    在这里插入图片描述

  • info (i) locals:查看当前栈帧局部变量的值
    在这里插入图片描述

  • quit (q):退出gdb


结尾

如果有什么建议和疑问,或是有什么错误,大家可以在评论区中提出。
希望大家以后也能和我一起进步!!🌹🌹
如果这篇文章对你有用的话,希望大家给一个三连支持一下!!🌹🌹

在这里插入图片描述

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

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

相关文章

【Go】实现字符切片零拷贝开销转为字符串

package mainimport ("fmt""unsafe" )func main() {bytes : []byte("hello world")s : *(*string)(unsafe.Pointer(&bytes))fmt.Println(s)bytes[0] Hfmt.Println(s) }slice的底层结构是底层数组、len字段、cap字段。string的底层结构是底层…

第1章-04-Chrome及Chrome Driver安装及测试

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师&am…

MYSQL定时任务使用手册

开发和管理数据库时,经常需要定时执行某些任务,比如每天备份数据库、每周统计报表等。MySQL提供了一个非常有用的工具,即事件调度器(Event Scheduler),可以帮助我们实现定时任务调度的功能。本文将介绍如何…

Excel中的“块”操作

在Excel中,有offset、index、indirect三个对“区域”操作的函数,是较高版本Excel中“块”操作的利器。 (笔记模板由python脚本于2024年08月20日 19:25:21创建,本篇笔记适合喜欢用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Pytho…

46、Python之模块和包:一切皆对象,模块和包也不例外

引言 在前面的文章中,我们介绍了变量、函数、类,在实际编程中,始终在贯彻的有两点: 1、在Python中一切皆对象,所以函数、类、模块、包也都是一等公民。 2、不管是基于面向过程还是面向对象,我们在实际编…

使用Element UI组件时,icon图标不显示

问题描述: 我在使用Element UI组件的日期选择器时,发现图标不显示(左边是原图,右边的问题图)。 经过检查我发现,我的JS,CSS文件都没有问题,只是缺少了element-icons.tff和element-icons.woff这两个文件。 …

JSON, YAML, XML, CSV交互可视化

1、jsoncrack https://jsoncrack.com/editor

O2OA(翱途)服务器配置与管理-如何修改服务器内存占用率?

o2server 启动后一般占用大约4G~6G内存空间,在启动脚本中默认设置 -Xms2g 限定heap(堆)的大小最小2G,可以通过设置-Xmx来设置堆的上限. Xms -Xms2g:设置JVM初始堆内存为2g.此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存. Xmx -Xmx5g:设置JVM最大堆内存为5g.…

LLM 压缩之二: ShortGPT

0. 资源链接 论文: https://arxiv.org/pdf/2403.03853 项目代码: 待开源 1. 背景动机 现有的大语言模型 LLM 推理存在以下问题: LLM 模型因为 scale law 极大的提高模型的预测能力,但是同样带来较大的推理延时;对于 LLM 应用部署带来较大…

软件设计师全套备考系列文章6 -- 线性表、栈和队列、串、数组、矩阵、广义表

软考-- 软件设计师(6)-- 线性表、栈和队列、串、数组、矩阵、广义表 文章目录 软考-- 软件设计师(6)-- 线性表、栈和队列、串、数组、矩阵、广义表前言一、线性表二、栈和队列三、串、数组、矩阵、广义表 前言 考试时间&#xff…

反向代理:定义与核心作用

反向代理:定义与核心作用 一、反向代理的定义二、反向代理的核心作用 💖The Begin💖点点关注,收藏不迷路💖 反向代理,作为网络架构中的重要组件,扮演着关键角色。本文将简洁介绍反向代理的定义及…

出现 2003 - Can’t connect to MySQL server on ‘xxx‘(10060) 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 sql链接远程服务器的时候,出现如下问题: 2003 - Can’t connect to MySQL server on xxx(10060)截图如下所示: 2. 原理分析 错误代码 10060 表示“连接超时”,说明客户端在尝试连接到服务器时,服务器没有响应或者响…

qtsql连接达梦数据库

odbc window和linux都有odbc的中间件,可以通过odbc中间件配合qtsql连接数据库 windows下配置odbc linux配置odbc apt install unixodbc unixodbc-dev /etc/odbcinst.ini配置 [DM8 ODBC DRIVER] DescriptionDM8 ODBC Driver DRIVER/opt/dmdbms/bin/libdodbc.so/et…

LevelDB源码分析(一)安装编译和简单Demo

初识LevelDB 认识LevelDB & 源码下载编译Mac源码下载和编译运行 认识LevelDB & 源码下载编译 LevelDB是 Google 编写的key-value存储库,提供从Key到Value的有序映射。 LevelDB的代码量相比其他开源项目较少,除了测试之外大约有不到两万行代码。 …

LabVIEW软件定制开发公司的前景如何?

LabVIEW软件定制开发公司的前景在当前的技术发展环境下展现出一定的潜力与挑战。这一领域的市场前景主要受到工业自动化、物联网、智能制造等技术趋势的推动,同时也受到行业竞争、技术更新以及人才市场的制约。 ​ 市场需求与增长潜力 随着工业4.0、物联网和智能制…

halcon的HObject被释放

经过简述 某项目由我统一管理HObject(区域和图像)的释放。发现某区域被系统外部所释放。可能有两种情况:a,区域交给我后,释放了。b,获取我的区域后释放了。 最终证明是第二种情况,证明如下: a,…

百度地图SDK Android版开发 7 覆盖物示例1

百度地图SDK Android版开发 7 覆盖物示例1 前言界面布局MapMarker类常量成员变量初始值Marker点击事件Marker拖拽事件创建覆盖物移除覆盖物设置属性 MapMarkerActivity类控件响应事件 运行效果图 前言 文本介绍Marker的常用属性、交互和碰撞示例。 示例功能如下: …

设计模式六大原则(一)–单一职责原则(C#)

文章目录 1. 什么是单一职责原则?2. 单一职责原则的定义3. 单一职责原则的重要性4. 单一职责原则的示例(C#)5.如何判断是否违反单一职责原则6. 单一职责原则的应用场景7. 总结 在软件开发领域,设计模式是解决常见问题的经典解决方…

【实现100个unity特效之24】使用ShaderGraph将图片转变为像素艺术

ShaderGraph连线图 效果 参考 https://www.youtube.com/watch?vBmhj7RgVDzc 完结 赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章…

@DateTimeFormat和@JsonFormat

DateTimeFormat 用于接收前端传入的参数,变成自己想要的格式 JsonFormat用于格式化后端返回给前端的参数 DateTimeFormat(pattern "yyyy-MM-dd HH:mm:ss") JsonFormat(pattern "yyyy-MM-dd HH:mm:ss", timezone "GMT8") private …