『Linux升级路』基础开发工具——gdb篇

🔥博客主页:小王又困了

📚系列专栏:Linux

🌟人之为学,不日近则日退

❤️感谢大家点赞👍收藏⭐评论✍️

目录

一、背景知识介绍

二、gdb指令介绍


一、背景知识介绍

     在软件开发中,通常会有两种主要的构建配置:Debug(调试)和Release(发布)。这两种配置的存在是为了在不同的开发和使用阶段提供不同的优化和调试支持。以下是它们存在的主要原因:

📝调试配置:

  • 符号信息: Debug 配置通常包含完整的符号信息,这使得在调试过程中能够准确地追踪到源代码的行号和调用堆栈信息。这对于开发人员在调试应用程序时非常重要。
  • 优化程度低: Debug 配置一般不进行代码优化,以确保生成的代码更易于调试。变量和表达式的值通常保留在内存中,而不进行过多的优化操作。

📝发布配置:

  • 符号信息: Release 配置通常会剔除符号信息,减小可执行文件的大小,并防止未经授权的人员通过符号信息获取源代码的详细信息。
  • 优化成程度高: Release 配置通常会进行更多的代码优化,以提高应用程序的性能。这包括删除不必要的代码、内联函数、变量寄存器优化等。

gcc/g++编译器默认是以release的模式编译得到可执行程序,我们使用gdb是无法进行调试的。

想进行代码调试,我们就要让代码以debug的模式发布,需要加-g选项。

gcc code.c -o mycode -g

我们可以通过readelf mycode-d -S | grep debug查看mydoe-d文件中的debug信息

二、gdb指令介绍

     我会通过下面这段代码,来给大家演示gdb的使用。

#include <stdio.h>
int Add(int n)
{int ret=0;int i=0;for(i=0;i<n;i++){ret+=i;}return ret;
}int main()
{int num=50;int sum=Add(num);printf("%d\n",sum);return 0;
}

📒进入gdb环境

  • gdb binFile:进入gdb环境,binFile是一个可执行程序。

📒退出gdb环境:

  • ctrl + d quit :退出gdb环境

📒显示代码:

  •  list l :显示binFile源代码,接着上次的位置往下列,每次列10行。

  • list numnum是行号,将源代码的第num行在中间位置显示。

gdb会自动记录上一次执行的指令,我们执行一次 list 后,可以直接回车,就可以看到完整的源代码。

📒查看函数:

  • list Func l FuncFunc是函数名,列出某个函数的源代码。

📒运行程序:

  • run r 运行程序,不是单步执行程序。

📒设置断点:

  • break numb num:num表示行号,在某行设置断点。

📒查看断点:

  • info break:查看断点信息。

📒删除断点:

  • d numnum表示断点的编号,删除断点。

我们在删除断点时,这里的num表示的不是行号,我们要输入要删除断点的编号。

注意:如果在调试过程中退出,那么再次进入调试环境,上一次的调试信息会丢失,即之前设置的断点都没了。

📒单步执行:

  •  n next:逐过程,单条执行,当有函数调用时,不会进入函数内部。
  •  s step:逐语句,进入函数调用。
  • finish:跳出当前函数,执行完当前函数返回,然后停下来等待命令。

flish指令可以快速的帮我们查看问题是不是出在当前函数中。 

📒查看变量的值:

  •  p 变量:打印变量的值。
  • display 变量:跟踪查看一个变量,每次停下来都显示它的值。

  • undisplay num:取消对先前设置的那些变量的追踪,其中num是先前设置的跟踪变量所对应的编号。 
  • info locals:查看当前函数栈帧中所有局部变量的值。

📒其他指令:

  • until x:跳至x行,可以让我们快速的运行代码块。
  •  c continue:继续执行直到下一个断点。
  • disable breakpoints:禁用断点。
  • enable breakpoints:启用断点
  • break 函数名:在函数开头设置断点。
  • backtrace:查看堆栈。
  • set var:修改变量的值。
  • break filename:line_number:在文件的特定行设置断点。示例:
b code.c:15

code.c这个源文件的第15行设置断点。


🎁结语: 

     本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cilium原理之ebpf尾调用与trace

背景 在深入剖析cilium原理之前&#xff0c;有两个关于epbf的基础内容需要先详细介绍一下&#xff1a; 1. ebpf尾调用 尾调用类似于程序之间的相互跳转&#xff0c;但它的功能更加强大。 2. trace 虽然之前使用trace_printk输出日志&#xff0c;但这个函数不能多用&#x…

Fl Studio 20.9 中文汉化破解版永久版下载(含Keygen)

FL Studio 20.9.0.2736破解版是最优秀、最繁荣的数字音频工作站 (DAW) 之一&#xff0c;日新月异。 它是一款录音机和编辑器&#xff0c;可让您不惜一切代价制作精美的音乐作品并保存精彩的活动画廊。 为方便用户&#xff0c;FL Studio Keygen提供三种不同的版本——Fruity 版…

css图片属性,图片自适应

CSS 图片属性指南&#xff1a;background-size 和 object-fit 在前端开发中&#xff0c;使用图片是非常常见的。为了让图片在网页中显示得更好&#xff0c;CSS 提供了多种属性来调整和控制图片的大小和布局。其中&#xff0c;background-size 和 object-fit 是两个常用的属性&a…

邮政物流快递查询,并筛选出其中的提前签收件

批量查询邮政快递单号的物流信息&#xff0c;并将其中的提前签收件筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 邮政快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的朋友记得先注册&#xff…

深⼊理解指针

1. 内存和地址 1.1 内存 在讲内存和地址之前&#xff0c;我们想有个⽣活中的案例&#xff1a; 假设有⼀栋宿舍楼&#xff0c;把你放在楼⾥&#xff0c;楼上有100个房间&#xff0c;但是房间没有编号&#xff0c;你的⼀个朋友来找你玩&#xff0c; 如果想找到你&#xff0c;就…

爬虫课程考试方式说明

爬虫课程考试方式说明 一、开课情况 考查课 082116415 50人&#xff0c;0864211&#xff0c;1-15单周 理论学时16 实验学时0 上课地点&#xff1a;周一 3-4节 十号教学楼A303 51人&#xff0c;0864212&#xff0c;1-15单周 理论学时16 实验学时0 上课地点&#xff1a;周四 3-4…

Ubuntu 常用命令之 date 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 date命令在Ubuntu系统中用于显示或设置系统的日期和时间。 date常见的参数 -d, --dateSTRING&#xff1a;显示STRING指定的时间&#xff0c;而不是当前时间。-u, --utc, --universal&#xff1a;显示或设置协调世界时间。-R, --…

协作机器人(Collaborative-Robot)安全碰撞的速度与接触力

协作机器人&#xff08;Collaborative-Robot&#xff09;的安全碰撞速度和接触力是一个非常重要的安全指标。在设计和使用协作机器人时&#xff0c;必须确保其与人类或其他物体的碰撞不会对人员造成伤害。 对于协作机器人的安全碰撞速度&#xff0c;一般会设定一个上限值&…

057:vue组件方法中加载匿名函数

第057个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

mysql主从复制(在虚拟机centos的docker下)

1.安装docker Docker安装(CentOS)简单使用-CSDN博客 2.部署2个mysql docker run --name some-mysql1 -p 33061:3306 -e MYSQL_ROOT_PASSWORD123456 -d mysql:5.7 --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_cidocker run --name some-mysql2 -p 330…

YACS(上海计算机学会竞赛平台)三星级挑战——牛奶供应(一)

题目描述 有一家牧场每天都会产出牛奶&#xff0c;在第 i 天&#xff0c;牛奶的产量为p[i]​。生产的牛奶可以卖到市场上&#xff0c;在第 i 天&#xff0c;市场需求为 c[i]​。如果市场需求不大&#xff0c;卖不掉牛奶&#xff0c;则多余的牛奶就会放进冷库保存。牛奶有一个保…

PyGame实现打砖块游戏

文章目录 砖块实现小车小球初始化和主循环 打砖块也是一个非常经典的小游戏&#xff0c;玩法大致如下&#xff0c;用一个小车接一个小球&#xff0c;然后反射小球&#xff0c;使之打在砖块上&#xff0c;当小球碰到砖块之后&#xff0c;则砖块被消掉&#xff0c;逻辑十分清晰。…