Linux调试器-gdb使用与冯诺依曼体系结构

2024-03-01 20:44

本文主要是介绍Linux调试器-gdb使用与冯诺依曼体系结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

前言

Linux调试器-gdb使用

1. 背景

2. 开始使用

冯诺依曼体系结构

总结


前言

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!


提示:以下是本篇文章正文内容,下面案例可供参考

Linux调试器-gdb使用

1. 背景

  • 程序的发布方式有两种,debug模式和release模式
  • Linux gcc/g++出来的二进制程序,默认是release模式
  • 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g选项

debug版本可调试,那是因为编译器形成可执行程序的时候,会给可执行程序添加添加调试信息;而release版本不能调试。

2. 开始使用

gdb binFile(文件)   退出:ctrl + d 或 quit   

调试命令:

  • list/l (list简写) + 行号:显示binFile源代码,接着上次的位置往下列,每次显示10行(一般是从这一行的上下文的代码开始显示);如果向继续显示下面的代码,可以按回车,每次显示10行。
  • list / l + 函数名 : 行号:默认从函数名的第几行号开始,默认显示10行。
  • list / l + 文件名 : 行号:默认从文件的第几行开始,默认显示10行。
  • r或run:(或重新)运行程序。(相当于F5,要和断点一块使用)
  • break(b)  + (文件名) + 行号:在(文件的)某一行设置断点。
  • break + (文件名) :函数名:在某个函数开头设置断点。
  • info / (简写i) break(简写b) :查看打的断点的信息。
  • delete / (d) breakpoints n(序号为n的断点):删除序号为n的断点。
  • disable breakpoints(n:序号为n的断点):禁用断点。(序号为n的断点不想用,但是又不想删除掉)
  • enable breakpoints(n:序号为n的断点):启用断点。
  • n 或 next:单条执行。(逐过程)
  • s或step:进入函数调用。(逐语句)
  • p(print) + 变量名/取地址变量名:打印变量值。(可以在查看循环中的值)
  • display + 变量名/取地址变量名:跟踪查看一个变量,每次停下来都显示它的值。(常显示)
  • undisplay + 变量前面的编号:取消对先前设置的那些变量的跟踪。
  • 断点的本质:是帮我们缩小出问题的范围。
  • continue(或c):从当前位置开始连续而非单步执行程序。(从当前断点直接执行到下一个断点处。)
  • finish:执行到当前函数返回(也就是结束),然后挺下来等待命令。
  • until + X行号:跳转至指定行,中间的代码都是运行了的。比如:在循环的函数里面。
  • set var + 变量=你想要改成的值:修改变量的值。
  • delete breakpoints:删除所有断点。
  • info(i) locals:查看当前栈帧局部变量的值。
  • quit:退出gdb。
  • breaktrace(或bt):查看各级函数调用及参数。

冯诺依曼体系结构

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。

截至目前,我们所认识的计算机,都是有一个个的硬件组件组成

  • 输入单元:包括键盘, 鼠标,扫描仪, 写板等
  • 中央处理器(CPU):含有运算器和控制器等
  • 输出单元:显示器,打印机等

关于冯诺依曼,必须强调几点:

  • 这里的存储器指的是内存
  • 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
  • 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
  • 一句话,所有设备都只能直接和内存打交道。

为什么要加储存器呢?

假如我们的输入设备和输出设备直接和CPU连接起来,会怎么样呢?数据从一个设备流到另一个设备,本质是拷贝过去的,而输入设备和输出设备的效率是非常低的,CPU的拷贝效率是非常高的,两者之间的效率差是非常大的。(想一想木桶效应,木桶存储水的多少,取决于最低的竹板,两者是一样的道理)

这时候加上存储器的话,让输入设备给存储器拷贝数据,存储器给CPU拷贝数据,CPU对数据紧进行处理后,返回给存储器,然后存储器将数据拷贝到输出设备上。以前CPU是直接在外设上拷贝数据,现在变成了CPU直接从存储器上拷贝数据(这两的拷贝效率会更快),而外设的拷贝只用作用到存储器就可以了。而存储器一次性可以存储大量的数据,大大提高了运行的效率。存储器比寄存器的内存容量更大,价格更低,性价比更高,适合广大民众。

结论:

在硬件数据流动角度,在数据层面:

1、CPU不和外设直接打交道,CPU只和内存打交道;

2、外设(输入和输出设备)的数据,不是直接给CPU的,而是要先放入到内存中。

程序运行,为什么要加载到内存?(冯诺依曼体系规定这么做的!!!)

程序=代码+数据:程序的“代码和数据”都要被CPU访问;CPU只会从内存中读取代码和数据

程序还没有加载到内存中的时候,在哪里?

在磁盘(外部设备),当前是二进制文件。

登录上QQ,就代表着QQ的 .exe 的可执行程序被加载到内存当中了。

我们发的信息“你好!”,在输入设备上会直接拷贝到内存中 ------> 存储器将数据拷贝到CPU ----> CPU对数据进行加密运算 -----> 再返回到存储器中 ------> 拷贝到输出设备(网卡) ------> 通过网络传到你朋友的输入设备(网卡) -----> 拷贝到内存的可执行程序中 ------> 拷贝到CPU来进行解密运算 -------> 再拷贝到内存当中 -----> 拷贝到输出设备(显示器)上。


总结

好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。

这篇关于Linux调试器-gdb使用与冯诺依曼体系结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/763749

相关文章

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

使用TomCat,service输出台出现乱码的解决

《使用TomCat,service输出台出现乱码的解决》本文介绍了解决Tomcat服务输出台中文乱码问题的两种方法,第一种方法是修改`logging.properties`文件中的`prefix`和`... 目录使用TomCat,service输出台出现乱码问题1解决方案问题2解决方案总结使用TomCat,

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫