Linux下cgdb/gdb调试以及关于操作系统那些事

news2024/11/6 11:54:30

目录

一.gdb调试

 1.1debug和release版本有什么区别?

1.2性能优化

1.3gdb的使用

1.4cgdb的安装

二.什么是硬件

三.冯诺依曼体系

四.操作系统(OS)

4.1理解操作系统

4.1.1操作系统是什么?

4.1.2为什么要有操作系统?

4.1.3 OS-银行

4.1.4OS如何管理

理解库文件和系统接口


一.gdb调试

默认系统上应该是没有gdb的;root用户可以使用下面的指令安装;如果没有权限的话,那就sudo;

yum install -y gdb

 ubuntu用户使用下面的指令安装

sudo apt install -y gdb

程序的发行方式有两种:debug/release版本;gdb的调制对象是debug版本的程序;

在linux下C/C++默认编译后产生的可执行文件是release版本;所以我们需要使用-g选项来编译为debug版本;

gcc -g code.c -o code#这里我以code.c文件为例

 1.1debug和release版本有什么区别?

debug和release版本的区别在于debug版本相对于release添加了调试信息;这也就意味着debug中的东西比release多,所占空间更大;

我们可以看到默认编译下的code是release版本的,他所占的内存是8328;而debug版本下的debug_code是10880;这就是两者在内存上的区别;

1.2性能优化

release下编译器可能会对程序代码的内存空间进行优化,就比如之前类和对象中的连续拷贝问题(隐式类型转换),在debug版本下会先产生临时变量,再赋值给目标对象;但是在release版本下就会优化为不产生临时变量

1.3gdb的使用

命令:gdb + 可执行程序

1.代码展示

lilst/l +行号 展示该行源代码,

list/l + 函数名 展示函数的源代码

在不加行号的情况下,每次l会列出10行,直到列完; 

如果l +行号,就会把该行展示在中间部分,

2.执行语句操作

r或run:运行程序(默认会直接结束或者跳到下个断点)相当于vs 中的"继续";

n 或 next:把函数当成一个语句(逐过程),就是不进入函数内部;

s或step:不会跳过代码块(逐语句)遇到好函数就会跳转到内部;

3.设置断点

break(b) 行号:在某一行设置断点

break(b) 函数名:在某个函数开头设置断点

info(i) break(b) :查看断点信息。

delete breakpoints:删除所有断点

delete breakpoints n:删除序号为n的断点

disable breakpoints:禁用断点

enable breakpoints:启用断点

1.设置并查看断电

设置断点:b +行号/函数名    查看info b

 2.关闭断点

disable + 断点编号

我们发现关闭断点之后keep处由y-->n;这就是断点开关标志;有的时候我们只是暂时不需要这个位置的断点,以后可能还会用到,所以没必要删除断点(删除断点和关闭断点是不一样的);

3.打开断点

enable + 编号

4.如何删除断点

delete 

控制变量

p 变量:打印变量值。

set var:修改变量的值

display 变量名:跟踪查看一个变量,每次停下来都显示它的值

undisplay:取消对先前设置的那些变量的跟踪

breaktrace(或bt):查看各级函数调用及参数

info(i) locals:查看当前栈帧局部变量的值

1.手动查看变量的值 

 

2. 跟踪变量的值(监视)

每次执行一条语句都会自动显示n的值

3.设置变量的值(强制修改)

set var 变量=值

跳转定位

finish:执行到当前函数返回,然后挺下来等待命令(走到该函数最后)

until X行号:跳至X行(方便我们快速跳出循环)

continue(或c):从当前位置开始连续而非单步执行程序(帮助我们从当前断点直接跳到下一个断点)

run(或r):从开始连续而非单步执行程序(向下运行程序)

退出调试

q/quit

1.4cgdb的安装

命令:sudo apt install -y cgdb

其余操作与gdb一样;
优点:可以随时看到源代码;

二.什么是硬件

硬件就是看得到摸得着的计算机外部设备;我们使用的笔记本和台式电脑就是各种硬件的组合,其中包括CPU,显示器,磁盘,网卡,内存,键盘...

单看他们仅仅只是一堆物件,需要之间相互建立联系,才能是设备工作起来,而这整个系统就是冯 诺依曼体系;目前的任何计算机设备都采用的是冯诺依曼体系;

发明冯诺依曼体系的人简直就是天才,讲一堆的物件按照体系进行配置安装,使得每一项硬件都可以发挥更好的作用;这是在计算机领域是一项十分伟大的发明;

三.冯诺依曼体系

输入设备:键盘,鼠标,摄像头,触控板等......
输出设备(外设):显示器,磁盘,打印机,耳机等;
存储器:就是指的内存,寄存器.

CPU(中央处理器):
运算器:对数据进行运算,比如+,-,*,/,%等...
控制器: 控制输入和输出设备(外存).

强调:

1.存储器说法太官方,其实就是指的内存
2.红色的线指的是数据线;单论数据上,CPU在体系中只能跟内存打交道,对内存进行读写;
3.黑色的线指的是控制线,CPU其实是可以直接向外部设备发送信号的,比如让磁盘启动/停止/降速/读取..;
4.外设也只能跟内存打交道,写数据到内存中,从内存中读取数据;这就是为什么C语言中要有缓冲区的原因;缓冲区就是一块内存;

总结:内存就如同整个体系的一条必经之路,所有的设备都要与内存建立联系;

问题1:我们的文件是在哪里存储的?

在过去我们写过很多的C/C++等文件,这些文件其实是在磁盘上存储的,磁盘是什么?磁盘是外设;在举个例子,我们的U盘,就是用来保存和存储文件的;

任何程序要运行都需要先加载到内存中,这个其实是OS(操作系统)接受程序员的指令,通过特定的系统接口驱动硬件;此时硬件就是输入设备,只有将数据搞到内存中,CPU才能对数据进行处理和控制;

问题2:为什么必须加载到内存?

文件的本质是代码和数据,代码是需要CPU执行的,运算是需要运算器计算的,总之,文件将来是一定要被CPU读取的;而在数据上,CPU只会访问内存(红色的线),所以文件运行时,就一定要加载到内存中去,这就是冯诺依曼体系所规定的;

问题3:我要做IO,怎么理解?

IO就是input和output,这里肯呢个有人会有疑问了,我们的IO流输入输出不是scanf/cin和printf/cout吗,怎么是input和output呢,其实两者都是的,只是站的角度不同;

scanf/printf那是代码,实在程序的层面上,而程序是什么?程序是文件,是需要加载到内存中的;我们使用的scanf其实就是从键盘读取数据到内存中,在冯诺依曼体系中,这个过程就是input;

 问题4:假如你在北京,你朋友在上海,你们在QQ聊天,请分析下你们的数据流向.

我们的电脑都是冯诺依曼结构,我们都需要先登录qq,qq是一个可执行程序,打开qq就是把QQ加载到内存中;然后我通过键盘输入数据,这个过程就类似于scanf输入;数据然后到达内存qq中,然后再传输到显卡;传输到朋友的输入设备;对于朋友的电脑而言,输入设备及就是你的网卡,最后经过CPU在朋友的电脑显示器上出现信息;

问题5:为什么要有内存?

明明储存器的数据就是外设传递的数据,那我为什么不能直接让外设连接CPU呢,这样岂不是简化了体系了;

这与CPU和外设的处理数据的速度相关;如果CPU处理数据的速度是ns,那外设的速度就是ms;这样一对比,CPU的速度就是外设的100万倍;根据木桶原理,这个时候,计算机的效率就会取决于外部设备,效率很慢;

在计算机中有一个规则:

 硬盘离CPU是很远的,他的速度是很慢的,但是他便宜,而寄存器就比较快了,如果我们让CPU从寄存器中读取数据,那这个速度就会相对提高;

这里如果我们上述三者理解为串型了,那根据木桶原理根本就没有解决任何问题;但实际上,CPU在处理外部设备的数据时,同时也在处理其他的数据;并不是仅仅等着外设传输的数据;这是一个并型结构;

所以为什么叫存储器,是用来暂时存储数据的;

举个例子:老师在班上说周日要交实验报告,同学们谁先写完了就放到办公桌上;放到办公桌上这就相当于是在输入数据,办公桌就是一个存储器;但是同学们去交报告时,难道老师要一直在办公室等着吗?这显然是不可能的,老师也有他自己的事要去做;老师就相当于是CPU;有了办公桌,这样等老师回来的时候,就可以批改了;老师批改的速度是很快的,但是同学们可能有的周二交,周三交,甚至周末交;速度是很慢的;如果没有办公桌这样的存储器就没有地方可以存储数据,那可能会造很多的问题,难受的不仅是老师还有同学;所以存储器/内存是必要的;

四.操作系统(OS)

4.1理解操作系统

4.1.1操作系统是什么?

操作系统最重要的部分是内核,而我们需要使用操作系统的外壳来跟内核打交道;

内核:进行着进程,任务,线程管理,文件系统,内存管理,驱动管理等;

我们程序员都是通过外壳来下达指令,操作系统帮我们处理指令,驱动硬件等..我们下达的指令就是代码,然后通过操作系统的系统接口,来让操作系统帮我们执行;OS更像是一个管家;

 本质:是一款进行软硬件管理的软件! linux内核就是用C语言写的;

4.1.2为什么要有操作系统?

计算机软硬件框架层级关系:采用冯诺依曼的结构构建;

每一种都要有自己的驱动程序,操作系统是不会直接访问硬件的;有些驱动程序是我们买电脑是就已经配置好的;驱动程序就相当于是操作系统的触手,可以摸到硬件;

给用户提供良好稳定的运行环境

我们使用计算机的目的,肯定是要连接现实生活的东西的,不然总是虚拟的,并没有太大用处;所以最终的行为都是在硬盘上体现的;

当我们将买的鼠标插到电脑上时,我们会发现并不能马上移动,虽然物理上已经与电脑连接但是这个时候驱动程序还没有被加载好;是无法驱动硬件的;驱动程序就是操作系统跟硬件打交道的软件;

 OS是一个帮助我们管理软硬件资源的角色,但这仅仅只是他的手段罢了,他的目的是为了给用户提供一个良好(稳定、高效、安全)的运行环境,但我们要知道其实普通用户是不善于和OS打交道的,所以普通用户使用的都是基于程序员开发出来的软件,所以首先是我们专业的程序员需要去跟OS打交道,然后再搞出满足普通用户需求的各种软件!

4.1.3 OS-银行

前面讲了,操作系统的目的是给用户提供良好的运行环境,但其实操作系统是不信任用户的;

现在把操作系统比作是银行,今天张三来存钱,整个流程都是他自己操作的,存钱,登记信息等,,,但是如果很多人都无规矩的这么做,那我银行的安全性岂不是很差,万一有些人不怀好意把我电脑数据清楚了,我找谁说理去;所以在来的客户中,有好人也有坏人,OS是不认识的,为了安全着想,所谓行长就设立的窗口,存钱就到窗口1,取钱就到窗口2,查询就到窗口3...这样就可以保证我内部数据的安全性;这些的小窗口对应的就是OS给用户提供的各种的系统调用接口;

这些接口是设计者设计的,只有我们通过特定的接口,我们的指令才会有效;

但是呢,有些老年人岁数大了,什么都不懂,字都不认识,更不要说银行复杂的业务流程了;那这个时候行长就在门口接待处设置一些辅助人员,一边帮他们更好的完成业务;

这对我们程序员也是一样的,如果直接去使用系统接口,我们是看不懂,不会用滴,所以大神们针对问题设计出了一些软件,来让我们使用;

4.1.4OS如何管理

操作系统为了更加方便的管理软硬件,就把各种的硬件的属性以及硬盘上的信息使用C语言的结构体包装,这就能很好的描述一个物体;

那么既然OS管理对象是使用的结构体,数量又这么多,所以OS就干脆使用链表把所有的信息串起来;这样更加方便管理,从管理者的角度这不就是数据结构吗?那对数据的操作就是增删查改!

理解库文件和系统接口

先举个例子,假如有A和B两个校长,A校长有一个学生数学特别厉害,但是B校长没有,于是B校长就想跟A校长商量借这个同学来打比赛,但是B校长肯定不能直接去找这个学生,因为这个学生是A校长的人,他得负责,所以他必须要通过A校长的同意才行。

      同理我们通过printf把“hello”打在屏幕上,其实并不是我们直接通过调用这个库函数就和硬件打交道了,而是必须要自上而下贯穿下去,也就是要通过系统调用接口然后让OS知道!!!

      所以我们知道了库函数必须通过系统调用接口才能找到OS,所以库函数和系统调用是上下层的关系,库函数是基于系统调用之上的二级开发!

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

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

相关文章

GPU-主板-内存-硬盘-CPU-电源分类及区别总结大全

一、背景 用了7年的笔记本,现在感觉它实在是扛不住了,中间自己缝缝补补坚持到现在,把机械硬盘换成了固态,加装了内存条。换过2次还是3次风扇(不知道为啥坏的,高转速时哧哧响),换过一…

10款舞台剧免费音频剪辑软件分享,你用过哪款?

在舞台剧的世界里,音乐是情感的传递者,是气氛的营造者。一个好的舞台剧,离不开精心剪辑的背景音乐。而选择合适的音频剪辑软件,就如同挑选舞台上的演员一样重要。今天,我们就从舞台剧音乐剪辑的角度,来聊聊…

C#/.NET/.NET Core技术前沿周刊 | 第 11 期(2024年10.21-10.31)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…

w~Transformer~合集8

我自己的原文哦~ https://blog.51cto.com/whaosoft/12419881 #Batch Normalization 本文聚焦于Batch Normalization,Layer Normalization两个标准化方法,对其原理和优势等进行了详细的阐述。 这一篇写Transformer里标准化的方法。在Transformer中&am…

【天线&空中农业】花生霉变检测系统源码&数据集全套:改进yolo11-LVMB

改进yolo11-goldyolo等200全套创新点大全:花生霉变检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.01 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视…

鸿蒙开发融云demo发送图片消息

鸿蒙开发融云demo发送图片消息 融云鸿蒙版是不带UI的,得自己一步步搭建。 这次讲如何发送图片消息,选择图片,显示图片消息。 还是有点难度的,好好看,好好学。 一、思路: 选择图片用:photoVie…

天空卫士澳门交流会:AI赋能数据安全,共话未来挑战

10月31日,天空卫士于澳门举办以“Is Your Data Security Strategy Built for the Future?(您的数据安全策略能否应对未来挑战?)”为主题的澳门用户午餐交流会议。本次活动聚集了来自澳门金融管理局、财政局以及澳门四大酒店集团的…

ELK + Filebeat + Spring Boot:日志分析入门与实践(二)

目录 一、环境 1.1 ELKF环境 1.2 版本 1.3 流程 二、Filebeat安装 2.1 安装 2.2 新增配置采集日志 三、logstash 配置 3.1 配置输出日志到es 3.2 Grok 日志格式解析 3.2 启动 logstash ​3.3 启动项目查看索引 一、环境 1.1 ELKF环境 springboot项目:w…

记录新建wordpress站的实践踩坑:wordpress 上传源码新建站因权限问题导致无法访问、配置新站建站向导以及插件主题上传配置的解决办法

官方文档:How to install WordPress – Advanced Administration Handbook | Developer.WordPress.org 但是没写权限问题,可以下载到 wordpress官方包。 把下载的wordpresscn的包解压并上传到服务器目录下,但是因为是root上传导致了权限问题…

springcloud通过MDC实现分布式链路追踪

在DDD领域驱动设计中,我们使用SpringCloud来去实现,但排查错误的时候,通常会想到Skywalking,但是引入一个新的服务,增加了系统消耗和管理学习成本,对于大型项目比较适合,但是小的项目显得太过臃…

Vue3使用AntV | X6绘制流程图:开箱即用

x6官方地址X6图编辑引擎 | AntV 官方文档仔细地介绍了很多丰富的功能,这里的demo可以满足基本的使用,具体拓展还需要仔细看文档内容 先上效果图 1、安装 通过 npm 或 yarn 命令安装 X6。 # npm npm install antv/x6 --save# yarn yarn add antv/x6 …

day12:磁盘阵列

一,RAID概述 RAID(Redundant Array of Independent Disks)是一种数据存储虚拟化技术,起源于1980年代,旨在提高存储系统的性能和可靠性。最初,由加州大学伯克利分校的研究人员提出,RAID技术的核…

Chromium 中chrome.topSites扩展接口定义c++

一、chrome.topSites 使用 chrome.topSites API 访问新标签页上显示的热门网站(即最常访问的网站)。不包括用户自定义的快捷方式。 权限 topSites 您必须声明“topSites”扩展程序清单中授予使用此 API 的权限。 {"name": "My exten…

Qt自定义控件:汽车速度表

1、功能 制作一个汽车速度表 2、实现 从外到内进行绘制,初始化画布,画渐变色外圈,画刻度,写刻度文字,画指针,画扇形,画内圈渐变色,画黑色内圈,写当前值 3、效果 4、源…

​Java面试经典 150 题.P13. 罗马数字转整数(012)​

本题来自:力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解: class Solution {public int romanToInt(String s) {int sum…

stl_stack/queue

一.适配器 stack和queue实际上并不能算是一种容器,而是一种容器适配器。而适配器作为stl的6大组件之一,其实是一种设计模式。适配器模式其实就是将一个类的接口(该接口无法直接满足客户的需求)转换成客户希望的另一个接口&#x…

计算机网络:网络层 —— 虚拟专用网 VPN

文章目录 虚拟专用网 VPN 概述内联网 VPN外联网 VPN 虚拟专用网 VPN 概述 虚拟专用网(Virtual Private Network,VPN):利用公用的因特网作为本机构各专用网之间的通信载体,这样形成的网络又称为虚拟专用网。 出于安全…

SSM酒店预订住宿管理系统-计算机毕业设计源码01085

摘要 随着互联网和移动技术的快速发展,酒店行业也面临着巨大的变革和机遇。传统的酒店管理方式存在着信息不透明、预订流程繁琐等问题,无法满足现代消费者对便捷、高效、个性化服务的需求。因此,开发酒店预订住宿管理系统具有重要的意义。本文…

STM32CubeMX学习(三) SPI+DMA通信

STM32CubeMX学习(三) SPIDMA通信 一、简介二、新建STM32CubeMX项目并使用外部时钟三、SPI3配置四、相关代码五、测试 一、简介 本文将基于STM32F103RCT芯片介绍如何在STM32CubeMXKEIL5开发环境下进行SPIDMA通信。 操作系统:WIN10 x64硬件电…

LLaMA系列一直在假装开源...

伙伴们,很奇怪~ 关于LLM的开源与闭源模型的竞争又开始愈发激烈。 众所周知,开源模型以其开放性和社区驱动的特点受到一部分用户的青睐,而闭源模型则因其专业性和性能优化被广泛应用于商业领域。由于大模型最近2年的突然兴起,开源…