Linux中的调试器gdb与冯·诺伊曼体系

news2025/7/13 13:38:32

一、Linux中的调试器:gdb

1.1安装与版本查看

可以使用yum进行安装:

yum install -y gdb

版本查看:使用指令

gdb --version

1.2调试的先决条件:release版本与debug版本的切换

debug版本:含有调试信息

release版本:无调试信息

如果我们需要进行调试,则必须选择debug版本

gcc/g++默认的是release版本,如果要更浑阿伟debug,需要在gcc后加上-g选项

如:

可执行程序的具体信息可以利用

file+[可执行程序]

来进行查看(debug和release模式在ubuntu系统下会有信息上的区别,但CentOS只能看到程序大小上的差距)

1.3调试的使用

进入gdb的指令:

gdb+[可运行程序]

1.3.1简单的使用

一般我们在VS2022调试过程中,用到的功能主要是(冒号后就是对应的指令)

打断点:b

删断点:d

运行到第一个断点处:r

一个断点运行到下一个断点:c

F10逐过程:n

F11逐语句:s

监视窗口:display/p

1.3.2具体的调试指令

①查看代码(推荐使用cgdb

1>l+[行号] 可以一次展示十行代码,会尽量展示行号上下五行

2>l+[函数名] 列出指定函数位置的上下五行代码

3>l+[文件名]+[行号] 列出指定文件 对应行号的上下五行

注:gdb会默认记录最近的一次指令,直接回车就继续/重新执行它

②断点设置/删除

1>打断点

b+[行号]

b+[文件名]+[行号]

b+[文件名]:[函数名]

2>查看断点信息

info b

可以查看对应断点的编号

3>删除断点

d+[断点序号]

注:在一次调试下,断点的序号只会线性递增

4>禁用断点

disable+[断点序号]

5>启用断点

enable+[断点序号]

③启动程序

1>断点间运行

r

直接开始运行,运行第一个断点,没有的话到结束

c

是continue的简写,从一个断点运行到下一个断点(如果遇到错误,会告知错误在哪一行)

2>逐步调试

n

是next的简写,相当于VS2022中的F10,逐过程运行(单步执行,不进入函数内部)

s

是step的简写,相当于VS2022中的F11,逐语句调试,可以进函数

3>运行函数栈的查看

bt

可以查看函数栈(所谓函数栈其实就是当前调用函数列表,在汇编层面需要借助栈这种数据结构来辅助组织函数的调用与返回)

4>变量名的展示

display+[变量名]

相当于调试的监视窗口,之后n的时候会自动显示

p+[变量名]

相当于调试的监视窗口,之后n的时候不会自动显示(但是p可以用来查表达式)

info locals

自动监视窗口,一次性查看

undisplay+[监视列表中变量的序号]

不同于添加监视使用变量名,undisplay使用的是监视列表中的序号来确定移除对哪一个变量的监视

watch+[变量名]

对一个变量添加隐式监视,在变量值改变的时候会停止运行并显式部分内容,未改变则不会显示

他也类似于一种断点,会有编号,删除方式与普通断点相同

4>快速执行

until+[行数]

快速执行/回退到对应行

finish

快速执行完当前函数

④退出调试

quit

退出调试模式

⑤调试期间修改值

set var [变量=?]

如set var i=5;

这个功能支持我们运行中进行修改尝试

1.3补:条件断点

条件断点打法有两种

①新增

b+[行号]+if+[条件]

b 11 if n==6

②为已有的断点添加条件

condition+[断点编号]+[条件]

如condition 2 n==6

1.4更方便的cgdb(推荐)

依旧可以使用yum进行安装

yum install -y cgdb

他与gdb唯一的区别就是将代码和终端同时展示

gdb:

cgdb:

 

 在cgdb中,可以使用ESC键切换光标到上窗口,再按i键返回命令行中

1.5调试过程遇到问题的处理

1.5.1首先明确调试的本质

调试本质上是为了找到并定位问题,而解决问题的是程序员

1.5.2结合例子理解

假如在代码中添加一个除以0的错误

 运行到最后会提示

打印的是inf这样一个未知的值 ,由此可以定位到f的计算过程有问题,进而进行修改

1.5.3调试过程推荐的指令组合

cgdb中比较常用的一个组合是:断点+finish+until+c

用来对大的代码块区间进行debug

二、冯·诺伊曼体系

2.1体系结构图示

①输入设备: 如键盘,鼠标,网卡,磁盘(又名外存),摄像头等等

②输出设备:如显示屏,磁盘,网卡,打印机等等

③存储器:就是内存

④CPU:由运算器和控制器构成

2.2分析体系结构得出的结论

控制信号上:CPU可以直接与输入/输出设备进行交互

数据信号上:不管是从键盘读取数据交给CPU处理,还是从磁盘读取数据供运算需要,都要经历内存才能到达CPU

总结可以得出结论:

CPU在数据层面,不与外设直接打交道,只会和内存进行交互

因此:任何程序在运行的时候,都必须先(从磁盘)加载到内存

例如一个二进制程序本质上是一个文件,文件存储在磁盘中,磁盘是一种外部设备

Input本质上就是从输入设备向存储器传输的过程 

Onput本质上就是从存储器向输出设备传输的过程 

 

2.3冯诺依曼体系在实践中的体现

例如张三和李四通过自己的电脑在两地间通信:

这期间他们每个人都是一个冯诺依曼体系,张三写的消息经过内存加密后,Output到网卡中

然后通过网络将加密消息发送到李四的网卡中,然后Input到内存中进行解密,最后加载到显示器上

综上,数据在不同计算机内部流转的时候,本质是在不同的设备间进行拷贝

2.4为什么要有内存(即存储器位置)

假设没有内存,那么就会变成这样:

CPU直接和外设打交道,会因为木桶效应:虽然CPU的效率远高于外设,但是外设的效率很低,所以会造成总体效率很低,因此需要通过在CPU和外设之间一个“巨大的缓存”来避免CPU直接和外设打交道

那为什么这个“巨大的缓存”必须是内存呢?

其实它的功能也可以通过寄存器或者三级缓存来实现,

但他们的造价太高了,平常人难以负担,计算机就无法普及大众

存储金字塔:

 因此,正因为有了内存,才有如今互联网的局面

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

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

相关文章

STM32 + keil5 跑马灯

硬件清单 1. STM32F407VET6 2. STLINK V2下载器(带线) 环境配置 1. 安装ST-LINK 2. 安装并配置 keil5 https://blog.csdn.net/qq_36535414/article/details/108947292 https://blog.csdn.net/weixin_43732386/article/details/117375266 3. 接线并下载 点击"LOAD“&a…

盲盒小程序开发平台搭建:打造个性化、高互动性的娱乐消费新体验

在数字化浪潮席卷消费市场的今天,盲盒小程序以其独特的趣味性和互动性,迅速成为了年轻人追捧的娱乐消费新宠。盲盒小程序不仅为用户带来了拆盒的惊喜和刺激,更为商家提供了创新的营销手段。为了满足市场对盲盒小程序日益增长的需求&#xff0…

DuckDB系列教程:如何分析Parquet文件

Parquet 是一种强大的、基于列的存储格式,适用于实现更快捷和更高效的数据分析。您可以使用 DuckDB 这种内存型分析数据库来处理 Parquet 文件并运行查询以对其进行分析。 在这篇文章中,我们将逐步介绍如何使用 DuckDB 对存储在 Parquet 文件中的餐厅订单…

GRE,MGRE

GRE:静态过程,有局限性 R1 : [r1]interface Tunnel 0/0/0 --- 创建一个虚拟的隧道接口 [r1-Tunnel0/0/0]ip address 192.168.3.1 24 --- 给隧道接口分配一个 IP 地址 [r1-Tunnel0/0/0]tunnel-protocol gre --- 定义接口的封装方式 [r1-Tun…

【linux学习】linux系统调用编程

目录 一、任务、进程和线程 1.1任务 1.2进程 1.3线程 1.4线程和进程的关系 1.5 在linux系统下进程操作 二、Linux虚拟内存管理与stm32的真实物理内存区别 2.1 Linux虚拟内存管理 2.2 STM32的真实物理内存映射 2.3区别 三、 Linux系统调用函数 fork()、wait()、exec(…

Azure Speech 赋能,为智能硬件注入 AI 语音 “新灵魂”

在人工智能技术飞速发展的今天,智能硬件正逐步渗透到人们生活的方方面面。AI玩具、AI眼镜、AI鼠标等创新产品不仅提升了用户体验,更带来了前所未有的交互方式。领驭科技凭借微软Azure Speech的强大技术能力,为硬件厂商提供一站式AI语音解决方…

SignalR给特定User发送消息

1、背景 官网上SignalR的demo很详细,但是有个特别的问题,就是没有详细阐述如何给指定的用户发送消息。 2、解决思路 网上整体解决思路有三个: 1、最简单的方案,客户端连接SignalR的Hub时,只是简单的连接&#xff0c…

React: hook相当于函数吗?

一、Hook 是一个函数,但不仅仅是函数 函数的本质 Hook 确实是一个 JavaScript 函数,例如 useState、useEffect 或自定义 Hook 都是函数。它们可以接受参数(如初始状态值或依赖项数组),并返回结果(如状态值和…

【数据分享】2002-2023中国湖泊水位变化数据集(免费获取)

湖泊水位变化是研究水资源动态、生态系统演变和气候变化影响的重要指标。湖泊水位的升降不仅反映了降水、蒸发和入流水量的变化,还与人类活动、气候波动及地质过程密切相关。因此,高精度、长时间序列的湖泊水位数据对于水资源管理、洪水预测以及生态环境…

免费送源码:Java+SSM+Android Studio 基于Android Studio游戏搜索app的设计与实现 计算机毕业设计原创定制

摘要 本文旨在探讨基于SSM框架和Android Studio的游戏搜索App的设计与实现。首先,我们详细介绍了SSM框架,这是一种经典的Java Web开发框架,由Spring、SpringMVC和MyBatis三个开源项目整合而成,为开发企业级应用提供了高效、灵活、…

STM32单片机入门学习——第14节: [6-2] 定时器定时中断定时器外部时钟

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.04 STM32开发板学习——第14节: [6-2] 定时器定时中断&定时器外部时钟 前言开发…

2025-04-03 Latex学习1——本地配置Latex + VScode环境

文章目录 1 安装 Latex2 安装 VScode3 配置环境3.1 汉化 VScode3.2 安装 latex 插件3.3 配置解释 4 编译示例5 加快你的编译5.1 取消压缩5.2 使用 PDF 代替图片 6 参考文章 1 安装 Latex 本文配置环境: Windows11 打开清华大学开源软件镜像站:https://mi…

【CF】Day24——Codeforces Round 994 (Div. 2) D

D. Shift Esc 题目: 思路: 典DP的变种 如果这一题没有这个变换操作,那么是一个很典型的二维dp,每一个格子我们都选择上面和左边中的最小值即可 而这题由于可以变换,那我们就要考虑变换操作,首先一个显然…

【Java集合】LinkedList源码深度分析

参考笔记:java LinkedList 源码分析(通俗易懂)_linkedlist源码分析-CSDN博客 目录 1.前言 2.LinkedList简介 3.LinkedList的底层实现 4.LinkedList 与 ArrayList 的对比 4.1 如何选择 4.2 对比图 5.LinkedList 源码Debug 5.1 add(E e) &#xff…

Python办公自动化(2)对wordpdf的操作

一、操作word文档 终端下载操作word文件的工具库: pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx 1.遍历文档中内容 paragraphs:段落属性,返回列表类型的段落地址,遍历每一个段落地址,通过…

pip安装第三方库,但PyCharm中却无法识别

点击菜单栏File,选择Settings 系统默认的是PyCharm安装目录下的python.exe 解释器,不要用。 选择你的PYTHON的安装目录下的python.exe 解释器。如果不存在的话,增加进去 如果文件》设置打不开,需移除法化包。 打开 pycharm 安装目…

Linux C++编译及g++使用操作

编译的步骤 编译选项参数 编译生成库文件 静态库 动态库 运行可执行文件 静态库由于已经包含了链接的文件所以可以直接执行;动态库方式由于是运行时链接,所以需要指定链接的路径;

【Android】界面布局-线性布局LinearLayout-例子

线性布局(LinearLayout)是一种重要的界面布局中,也是经常使用到的一种界面布局 • 在线性布局中,所有的子元素都按照垂直或水平的顺序在界面上排列 ➢如果垂直排列,则每行仅包含一个界面元素 ➢如果水平排列&…

windows技术基础知识

NT架构 NT 就是new techonology 的英文单词缩写,是微软1993年推出操作系统的重大升级,如内存管理,安全机制,多任务,多线程支持。在此之前操作系统都是基于MS-DOS上面的图形化界面,只有有限的内存管理和多任…

在 Windows 环境下使用 VSCode 和 TinyGo 开发 ESP8266(NodeMcu) or STM32

支持的型号 https://tinygo.org/docs/reference/microcontrollers/ 1. 安装Go 2. 安装TinyGo,并添加环境变量 https://github.com/tinygo-org/tinygo/releases 3. VSCode配置,安装插件,选择设备 package mainimport ("machine"&q…