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

目录

一.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.mzph.cn/bicheng/59087.shtml

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

相关文章

Kafka相关知识点(上)

为什么要使用消息队列? 使用消息队列的主要目的主要记住这几个关键词:解耦、异步、削峰填谷。 解耦: 在一个复杂的系统中,不同的模块或服务之间可能需要相互依赖,如果直接使用函数调用或者 API 调用的方式,会造成模块之间的耦合…

ureport配置方法

1、项目启动后登录这个网址,ip和端口自己系统的 http://localhost:8080/ureport/designer 点击这个地方,图标类似一个文件夹选择下图标注的两个文件,这两个文件就是eoa系统要用到的报表文件,还是点击类似文件夹图标的图标 正在上…

在Linux上搭建Minecraft服务器的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 在 Linux(Ubuntu 12.04)上设置 Minecraft 服务器是一个相当简单的任务,只需通过命令行即可完成。 在…

/检测是否json格式参数;对现在 上月时间参数;JS判断数组(数组对象)是否发现变化;js判断对象是否是空对象

//检测是否json格式参数 isValidJSON(str) { if (/^[\],:{}\s]*$/.test(str.replace(/\\["\\\/bfnrtu]/g, ). replace(/"[^"\\\n\r]*"|true|false|null|-?\d (?:\.\d*)?(?:[eE][ \-]?\d )?/g, ]). replace(/(?:^|:|,)(?:\s*\[) /g, ))) { return t…

Java学习路线:JUnit单元测试

目录 使用JUnit 导入依赖 使用Junit 添加前置/后置操作 当项目十分庞大时,如果想测试一个很小的功能,都要启动整个项目来测试,会很浪费时间。 那能否将某个小功能单独拆出来进行测试呢? 这就是单元测试的作用。而JUnit就是一…

RK3568平台(camera篇)车载摄像头串行器和解串器方案

一.串行器和解串器简介 SerDes是Serializer/Deserializer的缩写,即串行器和解串器。由于同轴线的传输延迟几乎可以忽略不计(ns级别),相当于将原来只能短距离传输的高速并行信号(MIPI/I2C/CLK等)的传输距离延长,真正做到高带宽、低延迟、长距离的数据传输。 串行器(Seri…

问:Redis为什么这么快?

Redis,全称Remote Dictionary Server,是一个开源的高性能键值对数据库。它以其卓越的性能、丰富的数据结构和灵活的使用方式,在现代互联网应用中扮演着重要角色。本文将探讨Redis之所以快的原因,包括其数据结构、内存管理、IO多路…

Qt 窗口部件的焦点策略

setFocusPolicy 函数是 Qt 框架中的一个成员函数,用于设置窗口部件(widget)的焦点策略(focus policy)。具体来说,Qt中的焦点策略(Qt::FocusPolicy)决定了控件是否可以通过键盘&#…

【A】【Maven项目热部署】将Maven项目热部署到远程tomcat服务器上

将Maven项目热部署到远程tomcat中 文章目录 将Maven项目热部署到远程tomcat中1.解决方案:2.实现3.Tomcat中的Root项目的配置和使用4.在tomcat-user.xml中配置远程服务器tomcat的账户信息5.修改 IP 访问权限6.登录ROOT项目,使用Manager App功能管理tomcat…

Scrum价值观

五大价值观 尊重,勇气,专注,承诺,开放 三大支柱(经验主义的三大支柱) 透明度,检查,适应 三大职责(不是三大角色) 产品负责人,开发人员&#xff0c…

过渡,2D,3D 转换

## 3D 转换 ### 1、旋转:rotateX、rotateY、rotateZ javascript transform: rotateX(360deg); //绕 X 轴旋转360度 transform: rotateY(360deg); //绕 Y 轴旋转360度 transform: rotateZ(360deg); //绕 Z 轴旋转360度 1. rotateY 举例: html…

【机器学习】26. 聚类评估方法

聚类评估方法 1. Unsupervised Measure1.1. Method 1: measure cohesion and separationSilhouette coefficient Method 2:Correlation between two similarity matricesMethod 3:Visual Inspection of similarity matrix 2. Supervised measures3. 决定…

YOLOv11改进策略【Backbone/主干网络】| ICLR-2023 替换骨干网络为:RevCol 一种新型神经网络设计范式

一、本文介绍 本文记录的是基于RevCol的YOLOv11目标检测改进方法研究。RevCol是一种新型神经网络设计范式,它由多个子网(列)及多级可逆连接构成,正向传播时特征逐渐解缠结且保持信息。可逆变换借鉴可逆神经网络思想,设计多级可逆单元用于解决模型对特征图形状的限制以及与…

线性代数求特征值和特征向量的技巧

考场时间很重要,所以学会方法计算挺重要。 一、求特征值: 大部分题目我们都可以通过矩阵行变化将矩阵的某一行的元素化简成只剩一个值,再按一行展开。这是我们首先应该想的。 但是考场难免会紧张,导致一时半会无法看出&#xf…

Java内存区域

前言 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机&#xf…

【学员提问bug】小程序在onUnload里面调接口,用来记录退出的时间, 但是接口调用还没成功, 页面就关闭了。如何让接口在onUnload关闭前调用成功?

这种问题比较通用,并不涉及到具体方法执行障碍,所以,解决起来也不麻烦。但是新手往往不知道如何做。 在小程序中,如果在 onUnload 中调用 API 记录页面退出时间,但因为页面关闭速度较快导致请求未完成,可以…

“七巨头”(The Magnificent 7)科技公司财报喜忧参半看AI

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

图片分割--UNet

1.网络结构 结构可以分为两部分 左边部分是编码结构,进行特征提取 右边是解码结果,进行特征还原 2.数据集准备 import os.path from torchvision import transforms from torch.utils.data import Dataset from utils import *#数据归一化 transform transforms.Compose([tr…

Shiro安全认证技术实践

为Java后端项目添加Shiro进行身份验证&#xff0c;授权操作&#xff1a; 步骤1.引入相关依赖&#xff1a; <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-starter</artifactId><version>1.9.1</vers…

【论文速读】| RED QUEEN: 保护大语言模型免受隐蔽多轮越狱攻击

基本信息 原文标题&#xff1a;RED QUEEN: Safeguarding Large Language Models against Concealed Multi-Turn Jailbreaking 原文作者&#xff1a;Yifan Jiang, Kriti Aggarwal, Tanmay Laud, Kashif Munir, Jay Pujara, Subhabrata Mukherjee 作者单位&#xff1a;Hippocr…