Linux中的调试器gdb与冯·诺伊曼体系
一、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直接和外设打交道
那为什么这个“巨大的缓存”必须是内存呢?
其实它的功能也可以通过寄存器或者三级缓存来实现,
但他们的造价太高了,平常人难以负担,计算机就无法普及大众
存储金字塔:

因此,正因为有了内存,才有如今互联网的局面
相关文章:
Linux中的调试器gdb与冯·诺伊曼体系
一、Linux中的调试器:gdb 1.1安装与版本查看 可以使用yum进行安装: yum install -y gdb 版本查看:使用指令 gdb --version 1.2调试的先决条件:release版本与debug版本的切换 debug版本:含有调试信息 release版本…...
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…...
Ruby语言的代码重构
Ruby语言的代码重构:探索清晰、可维护与高效的代码 引言 在软件开发的过程中,代码的质量直接影响到项目的可维护性、扩展性和整体性能。随着时间的推移,系统的需求变化,代码可能会变得混乱和难以理解,因此࿰…...
leetcode 数组总结篇
基础理论 数组:下标时从 0 开始的,地址是连续的,不能删除,只能覆盖;数组的实现:vector动态数组 常用操作 头文件 #include <iostream> #include <vector> #include <cstdint> // IN…...
盲盒小程序开发平台搭建:打造个性化、高互动性的娱乐消费新体验
在数字化浪潮席卷消费市场的今天,盲盒小程序以其独特的趣味性和互动性,迅速成为了年轻人追捧的娱乐消费新宠。盲盒小程序不仅为用户带来了拆盒的惊喜和刺激,更为商家提供了创新的营销手段。为了满足市场对盲盒小程序日益增长的需求࿰…...
DuckDB系列教程:如何分析Parquet文件
Parquet 是一种强大的、基于列的存储格式,适用于实现更快捷和更高效的数据分析。您可以使用 DuckDB 这种内存型分析数据库来处理 Parquet 文件并运行查询以对其进行分析。 在这篇文章中,我们将逐步介绍如何使用 DuckDB 对存储在 Parquet 文件中的餐厅订单…...
深入解析:使用Python爬取Bilibili视频
深入解析:使用Python爬取Bilibili视频 引言 Bilibili,作为中国领先的年轻人文化社区,拥有海量的视频资源。对于想要下载Bilibili视频的用户来说,手动下载不仅费时费力,而且效率低下。本文将介绍如何使用Python编写一…...
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语音解决方…...
力扣DAY35 | 热100 | LRU缓存
前言 中等 ⚪ 这个题原本打算用双链表最小堆做,发现无解。没想到双向链表。 题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int …...
Python 助力人工智能与机器学习的深度融合
技术革新的 “源动力” 在当今数字化时代,人工智能(AI)与机器学习(ML)无疑是最具影响力的技术领域,它们如同强大的引擎,推动着各个行业的变革与发展。Python 凭借其简洁易读的语法、丰富的库和…...
ARXML文件解析-1
目录 1 摘要2 ARXML文件2.1 作用及典型应用场景2.2 ARXML文件的结构树2.3 TAG(XML元素)2.4 ARXML文件关键元素解析2.4.1 XML声明与处理指令2.4.2 XML注释2.4.3 XML声明与根元素4.4.3.1 xmlns(默认命名空间)4.4.3.2 xmlns:xsi&…...
SignalR给特定User发送消息
1、背景 官网上SignalR的demo很详细,但是有个特别的问题,就是没有详细阐述如何给指定的用户发送消息。 2、解决思路 网上整体解决思路有三个: 1、最简单的方案,客户端连接SignalR的Hub时,只是简单的连接,…...
React: hook相当于函数吗?
一、Hook 是一个函数,但不仅仅是函数 函数的本质 Hook 确实是一个 JavaScript 函数,例如 useState、useEffect 或自定义 Hook 都是函数。它们可以接受参数(如初始状态值或依赖项数组),并返回结果(如状态值和…...
Ubuntu 安装 VLC
最近项目中需要用VLC查看NVR下子设备的RTSP流,特此记录,便于日后查阅。 1、安装snap $ sudo apt update $ sudo apt install snapd 2、安装vlc $ sudo snap install vlc 3、可能遇到的问题 snap beta install on ubuntu 22.04 failing to start Qt: Se…...
【数据分享】2002-2023中国湖泊水位变化数据集(免费获取)
湖泊水位变化是研究水资源动态、生态系统演变和气候变化影响的重要指标。湖泊水位的升降不仅反映了降水、蒸发和入流水量的变化,还与人类活动、气候波动及地质过程密切相关。因此,高精度、长时间序列的湖泊水位数据对于水资源管理、洪水预测以及生态环境…...
UBUNTU编译datalink
参考文档 datalink 语雀 下载 git clone https://gitee.com/liyang9512/datalink 源码打包 mvn -Prelease-datalink -Dmaven.test.skiptrue clean install -U 启动准备 # unzip ./distribution/target/datalink-server-1.0.0.tar.gz tar -xvf ./distribution/target/da…...
免费送源码: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) ÿ…...
第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组:5.回文数组
题目1 回文数组 小蓝在无聊时随机生成了一个长度为 n 的整数数组,数组中的第 i 个数为 ai,他觉得随机生成的数组不太美观,想把它变成回文数组,也是就对于任意 i∈[1,n] 满足 a i a n − i 1 a_ia_{n−i}1 aian−i1。 小蓝…...
高并发系统架构设计的深度解析与实施指南【大模型总结】
以下是对高并发系统架构设计的深度解析与实施指南,通过技术分层拆解和场景化案例说明,呈现完整的系统设计方法论: 一、容错优先思维的系统级实现 1. 混沌工程落地框架 # 混沌实验设计模板 class ChaosExperiment:def __init__(self, scope,…...
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 安装目…...
新浪财经股票每天10点自动爬取
老规矩还是先分好三步,获取数据,解析数据,存储数据 因为股票是实时的,所以要加个cookie值,最好分线程或者爬取数据时等待爬取,不然会封ip 废话不多数,直接上代码 import matplotlib import r…...
Vue2 父子组件数据传递与调用:从 ref 到 $emit
提示:https://github.com/jeecgboot/jeecgboot-vue2 文章目录 案例父组件向子组件传递数据的方式父组件调用子组件方法的方式子组件向父组件传递数据的方式流程示意图 案例 提示:以下是本篇文章正文内容,下面案例可供参考 以下是 整合后的关…...
Linux C++编译及g++使用操作
编译的步骤 编译选项参数 编译生成库文件 静态库 动态库 运行可执行文件 静态库由于已经包含了链接的文件所以可以直接执行;动态库方式由于是运行时链接,所以需要指定链接的路径;...
