当前位置: 首页 > news >正文

Linux下调试代码——gdb的使用

1. 文件准备:

  • 测试代码:

  • Makefile文件: 

  • 执行结果:

此时,我们的结果是存在问题的,即最终结果少了100。现在我们用gdb来调试它。

我们发现我们还没有安装gdb,这里安装一下。

2. 环境准备:

sudo yum install -y gdb

作用:安装gdb。 

 gdb 【目标文件】

作用:开始调试可执行目标文件。

q

作用:退出调试。 

但是,此时gdb还调试不了。因为在linux中,gcc/g++生成的软件,默认是release版本的。 

这里需要在gcc命令后面跟上 -g ,标识以debug方式发布。

为了和原来的release版本做区分,我们这里将可执行目标文件的名称改为 mytest_g 。 

 

同时,我们也会发现debug版本的程序的大小大于release版本的程序的大小。

原因在于debug版本要加入更多的调试信息。

证明: 

readelf -S 【可执行文件名】 

作用:读取可执行程序的二进制构成 。

release版本:

debug版本:

通过grep过滤,我们发现debug版本的可执行程序的确比release版本的可执行程序多了调试信息。  

 3 命令大全:

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

相关文章:

  • 深入理解计算机系统 CSAPP 家庭作业6.34
  • 零基础入门学用Arduino 第四部分(三)
  • 【单片机毕业设计选题24003】-基于STM32和阿里云的家庭安全监测系统
  • ARM架构简明教程
  • 项目3:从0开始的RPC框架(扩展版)-3
  • STM32学习笔记(八)--DMA直接存储器存取详解
  • css display:grid布局,实现任意行、列合并后展示,自适应大小屏幕
  • VMR,支持30+种编程语言的SDK版本管理器,支持Windows/MacOS/Linux。
  • 手写实现call函数和应用场景
  • 刷题记录(240619)
  • JSON学习
  • .Net多线程Threading相关详解
  • 数据库大作业——音乐平台数据库管理系统
  • 爬虫的法律风险是什么?以及合法使用爬虫技术的建议。
  • 基于深度学习的光流预测
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【知识碎片】第三方登录弹窗效果
  • 2018一半小结一波
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Bootstrap JS插件Alert源码分析
  • js ES6 求数组的交集,并集,还有差集
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Nodejs和JavaWeb协助开发
  • React-redux的原理以及使用
  • scrapy学习之路4(itemloder的使用)
  • Spark RDD学习: aggregate函数
  • supervisor 永不挂掉的进程 安装以及使用
  • Vue2.x学习三:事件处理生命周期钩子
  • 闭包,sync使用细节
  • 订阅Forge Viewer所有的事件
  • 工程优化暨babel升级小记
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 聊一聊前端的监控
  • 你不可错过的前端面试题(一)
  • 实习面试笔记
  • 微信小程序填坑清单
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • Hibernate主键生成策略及选择
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • #### go map 底层结构 ####
  • #if #elif #endif
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)