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

Linux关于 gdb 调试器的使用

坚持看完,结尾有思维导图总结

这里写目录标题

  • debug 和 release 版本
  • gdb 常见命令
    • 断点
    • 逐行调试和观察变量
  • 总结

debug 和 release 版本

首先要说的是 ,在 Linux 中 gcc 直接编译是不能进行调试的
而是要在加上 -g 选项才能得到可调试的文件
以下程序用一个例子来讲解

在这里插入图片描述
c 语言文件就一个 printf
在这里插入图片描述

Makefile 文件中就是两个编译
一个编译是 debug 和 release 版本(单词写错了)

然后进行编译后得到两个文件
在这里插入图片描述

可以使用 readelf 的命令看看 二进制文件,二进制文件以 elf 的格式保存起来
我们可以看看里面的debug 信息
在这里插入图片描述
使用的是命令
readelf -S debug |grep -i debug
关于 debug 版本的调试信息

gdb 常见命令

gdb 是Linux中使用的调试的工具
就和vs 中进入调试状态是相似的

断点

调试最重要的一个操作是打断点和看断点

l 这个后面可以跟行数 n 或函数 x,能够列出的 n 行开始的源程序和 函数 x 的 源程序,用来看代码
在这里插入图片描述
break + 行号 /函数 在对应的行号或者函数打上断点
info break 可以看到 断点的信息
在这里插入图片描述
delete breakpoints 断点号码 可以删除标号 NUM 为 n 的断点
在这里插入图片描述
delete breakpoints 可以删除所有断点

利用 enable 和 disable 可以保留断点痕迹 但是禁用或者使用断点
在这里插入图片描述
原来断点 Enb 都是 y
disable breakpoints n 可以禁用断点 n
在这里插入图片描述
enable breakpoints n 可以使能断点 n
执行后发现 Enb 再次变成了 y
在这里插入图片描述
r 是运行到断点处的命令
当没有断点的时候就执行完
在这里插入图片描述
有断点的时候就会
在这里插入图片描述
阐述了到达对应的断点处并且显示原码
到这里,关于断点的知识就讲完了

逐行调试和观察变量

因为前面的程序没有什么变量和循环,所以这里写一个阶乘和相加的循环来进行另一个说明
现在的例子变成了这个程序,可以看到 阶乘中有循环,也有函数
在这里插入图片描述

如果我在第 20 行打断点,然后 r (运行),就会停止在 断点处
在这里插入图片描述
然后我们有两个参数 add 和 stepret
利用 display + 变量 就能够随时查看变量 需要 r 了之后才能 display
在这里插入图片描述
利用 n 能够逐过程进行(不进入函数),向下运行两次,得到两个变量的变化
在这里插入图片描述
利用 s 可以进入函数看函数的运行(逐语句运行)
重新运行后,走到断点的位置(阶乘位置),s 进入函数,不断回车可以看到 循环在不断进行
我把 ret 和 i 都display 出来,能够看到在不断循环

在这里插入图片描述

如果觉得循环太烦,用 until x 直接运行到 x 行
就能够直接运行到循环跳出
在这里插入图片描述
或者可以使用 finish 运行完这个函数
可以看到 运行完后由返回到进入的位置
并且记录和函数的 return 值是 $1 = 6
在这里插入图片描述
最后 q 退出 gdb

总结

在这里插入图片描述

希望大家看完,能够有所收获
如果有错误,请指出我一定虚心改正
动动小手点赞
鼓励我输出更加优质的内容

相关文章:

  • 网站搜索引擎优化公司/企业网站营销
  • 网站怎么做支付接口/企业营销策略分析论文
  • wordpress底部导航插件/广告投放平台都有哪些
  • 重庆大型网站建设/域名查询ip138
  • 协会网站方案/广西网站seo
  • 网站建设走的路线风格/网络销售平台
  • 数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (八)使用generate…for语句简化代码
  • 【寒假每日一题】洛谷 P8254 [NOI Online 2022 入门组] 王国比赛
  • 【SpringBoot 学习】52、SpringBoot 使用 grpc 实现远程服务调用
  • [激光原理与应用-64]:激光器-器件 - 光电二极管
  • MyBatis 详解 (1) -- 环境搭建、查询操作
  • 深度学习——长短期记忆网络LSTM(笔记)
  • ROS2机器人编程简述humble-第二章-DEVELOPING THE FIRST NODE .2
  • libtorch c++ 使用预训练权重(以resnet为例)
  • 10.1 概述
  • Spark 核心编程
  • 【C/C++无聊练手(四)】用C++模板写一个带迭代器的树状数组,用于求前缀和
  • springboot整合Freemarker模板引擎