告别编程困惑:GDB、冯诺依曼、操作系统速通指南
🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟
🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩
目录
前言
一、GDB 调试器:程序的 “纠错神器”🛠️
(一)GDB 操作指南📖
二、冯诺依曼体系结构:计算机的 “底层蓝图”🗺️
三、操作系统:计算机的 “大管家”👨🏭
(一)操作系统的使命🎯
(二)操作系统的管理智慧🧠
(三)系统调用与库函数:开发的 “助力器”🚀
结尾🎉
前言
编程的道路上,程序时不时就像调皮的小精灵🧚♂️,突然 “闹脾气”,可把不少小伙伴愁坏啦😩。别担心!只要掌握 Linux 调试器 GDB,弄懂计算机底层架构与操作系统原理,这些难题就能轻松化解。现在,就让我们一起踏上探索这些实用知识的旅程吧🧐!
一、GDB 调试器:程序的 “纠错神器”🛠️
程序发布通常有 debug 和 release 两种模式。
- debug可以调试,形成可执行程序的时候会有调试信息
- release不能调试
在 Linux 系统里,gcc/g++ 编译生成的二进制程序,默认是 release 模式,这种模式下程序跑得飞快,但要是出了问题,排查起来就像在黑暗中摸索,难上加难。
而如果想让 GDB 这位 “调试高手” 来帮忙,在编译的时候就得加上 -g 选项,这就好比给程序戴上了一副 “透视镜”🔍,让问题无处遁形。
因此要被gdb调试,必须debug方式发布,必须加 -g
(一)GDB 操作指南📖
- 启动与退出:使用 “gdb binFile” 就能开启调试之旅啦🚀,要是想结束调试,敲下 “ctrl + d” 或者输入 “quit” 就可以和 GDB 说拜拜咯👋。
- 查看代码:“list/l 行号” 可以接着上次的位置列出 10 行代码,就像有个贴心小助手,按你的要求翻代码页📄;“list/l 函数名” 则能直接列出特定函数的代码,比如调试游戏程序时,用它就能快速看到 “jump” 函数是怎么写的🧐。
- 运行程序:“r 或 run” 一下,程序就像听到发令枪响的运动员🏃♂️,“嗖” 地开始跑起来啦,在赛车游戏里,这就相当于赛车发车咯🏎。
- 单步执行:“n 或 next” 就像给程序下了个 “慢动作” 指令,让它一次只执行一条语句,方便你一步一步揪出问题小尾巴🐾。(逐语句)
- 进入函数:“s 或 step” 这个命令超厉害,能像个小侦探一样,带着你钻进函数内部,看看里面到底在搞什么 “小动作”🕵️♂️。(逐过程)
- 设置断点:“break (b) 行号” 可以在指定的行上设个 “关卡”🚧,程序跑到这就会停下来;“break 函数名” 则是在函数开头设卡。要是你觉得 “加速” 函数有点可疑,就在它开头设个断点呗。“info break” 能帮你查看都设了哪些断点,要是设错了,“delete breakpoints” 可以一键删除所有断点,“delete breakpoints n” 能精准删除序号为 n 的那个断点。要是暂时不想让某个断点起作用,“disable breakpoints” 把它 “关禁闭”,后面想用了,“enable breakpoints” 再放它 “出来工作”😜。
- 操作变量:“print (p) 变量” 或者 “p 变量” 都能打印出变量的值,就像给变量来了个 “X 光透视”,看看它里面装的啥;“print (p)” 还能顺便修改变量或者调用函数,厉害吧!“set var” 则是直接给变量 “改头换面”,让它按照你的新想法来。
- 其他命令:“finish” 能让程序把当前函数执行完,然后像个听话的孩子一样停下来等你指示🧒;
“continue (或 c)” 就像你对程序说 “继续跑吧”,它就从当前位置接着跑起来啦;
“display 变量名” 可以像个小跟班一样,一直盯着某个变量,每次程序停下来都给你汇报变量的值,要是不想让它跟了,“undisplay” 让它 “退下”;
“until X 行号” 能让程序像会瞬移一样,直接跳到指定的行;
“disable+断点”可以暂时忽略这个断点,而“enable+断点”则恢复这个断点
“breaktrace (或 bt)” 能帮你画出程序的 “行动路线图”,看看各级函数都被怎么调用的,带了哪些参数;“info(i) locals” 则是帮你查看当前这个 “小环境” 里局部变量的值。
总结表格:
操作类型 | 命令 | 说明 |
---|---|---|
启动与退出 | gdb binFile ctrl + d 或 quit | 开启调试 🚀/ 结束调试 👋 |
查看代码 | list/l 行号 list/l 函数名 | 按行号或函数名查看代码 📄 |
运行程序 | r 或 run | 启动程序 🏃♂️ |
单步执行 | n 或 next | 一次执行一条语句 🐾 |
进入函数 | s 或 step | 深入函数内部 🕵️♂️ |
设置断点 | break (b) 行号 break 函数名 info break delete breakpoints delete breakpoints n disable breakpoints enable breakpoints | 设置断点 🚧/ 查看断点 / 删除所有断点 / 删除指定序号断点 / 禁用断点 / 启用断点 😜 |
操作变量 | print (p) 变量 p 变量 set var | 打印变量值 🎯/ 打印变量值(简版)/ 修改变量值 🔄 |
其他 | finish continue (或 c) display 变量名 undisplay until X 行号 breaktrace (或 bt) info(i) locals | 执行完当前函数返回暂停 🧒 从当前位置继续运行 跟踪变量 📌 取消跟踪变量 跳转到指定行 ⚡ 查看函数调用及参数 🗺️ 查看当前栈帧局部变量值 👀 |
二、冯诺依曼体系结构:计算机的 “底层蓝图”🗺️
先谈硬件,再谈软件,再谈进程
咱们平常使用的电脑,像笔记本、服务器这些,大多都是按照冯诺依曼体系结构来搭建的。这个结构就像是计算机的 “骨架”,支撑着它的各种功能💻。它主要由下面三部分组成:
- 输入单元:像键盘、鼠标这些,就像是计算机的 “耳朵” 和 “眼睛”👂👀,负责把外界的信息传递给计算机,让计算机知道你想干啥。
- 中央处理器 (CPU):这可是计算机的 “超级大脑”🧠,运算器就像个超厉害的计算器,能快速处理各种数据运算,控制器则像个指挥官,指挥着计算机各个部分有条不紊地工作。
- 输出单元:比如显示器、打印机,它们就像计算机的 “嘴巴”👄,把计算机处理好的结果展示给你看。
举个例子👇:
这里要特别注意哦,在冯诺依曼体系里,存储器说的就是内存。CPU 就像个有点 “小傲娇” 的家伙,只愿意和内存 “交流”,外部设备要想和 CPU “说说话”,都得通过内存这个 “中间人” 来传话。就拿 QQ 聊天来说吧,你发消息的时候,通过键盘输入(输入单元),消息就先跑到内存这个 “小驿站” 歇着,然后 QQ 程序在 CPU 这个 “大指挥官” 的指挥下,从内存里把消息拿出来处理,处理完再放回内存,接着通过网络(输出相关功能)发出去给对方。对方收到消息后,也是先把消息放在内存 “驿站”,再由显示器(输出单元)显示出来给对方看。要是发文件,文件数据就像一大包行李,也是先到内存 “驿站”,再处理传输。
总结表格:
组成部分 | 功能 | 举例 |
---|---|---|
输入单元 | 为计算机输入信息 👂👀 | 键盘、鼠标 |
中央处理器 (CPU) | 运算器负责数据计算,控制器指挥各部分工作 🧠 | 处理各种数据运算、控制程序流程 |
输出单元 | 展示计算机处理结果 👄 | 显示器、打印机 |
特殊说明 | CPU 仅与内存交互,外设通过内存中转数据 📩 | QQ 聊天消息、文件传输 |
一个程序要运行,必须要先加载到内存中运行?为什么?
为什么我们当时写的进度条,默认显示的数据,是可能会缓存起来?在哪里缓存?
因为冯诺依曼体系结构规定的,硬件要求
三、操作系统:计算机的 “大管家”👨🏭
(是什么)
操作系统(OS)就像是计算机系统的 “大管家”,把计算机的各种事务安排得明明白白。它主要包括内核和其他程序两部分。内核负责进程管理、内存管理、文件管理、驱动管理这些重要的事儿,就像管家的几个得力助手,各自把自己的活儿干得漂亮;其他程序呢,像函数库、shell 程序这些,就像是管家的小工具,帮我们更方便地使用计算机。
(一)操作系统的使命🎯
- 管理资源:和硬件打交道,合理安排软硬件资源,就像管家要把家里的东西都安排得井井有条,让它们都能发挥自己的作用。
- 提供环境:给应用程序打造一个舒适、稳定的 “小窝”,让它们能顺顺利利地运行,就像音乐软件能在操作系统提供的环境里流畅播放音乐🎵。
(二)操作系统的管理智慧🧠
操作系统会用 struct 结构体来给硬件做个详细的 “档案”📄,就像给每个硬件发了一张 “身份证”,上面记录着各种信息。然后再用链表等数据结构把这些 “身份证” 整理好,方便管理,这样就能快速找到需要的硬件信息啦。
(三)系统调用与库函数:开发的 “助力器”🚀
(为什么)
从开发的角度看,操作系统就像一个神秘的大宝藏,它打开一些小窗口,这些窗口就是系统调用,开发者可以通过这些窗口和操作系统互动。不过系统调用的功能比较基础,就好比给了你一些基础材料,让你自己动手做东西,对开发者要求有点高。这时候,聪明的开发者就把这些基础材料加工了一下,做成了库函数,库函数就像已经组装好的高级工具,用起来更方便,让上层开发变得轻松不少。比如说,盖房子的时候,系统调用给你的是砖头、水泥这些基础材料,库函数就像是已经做好的预制板,直接用就行,是不是方便多啦😃。
(怎么做后文再讲解)
总结表格:
分类 | 内容 | 说明 |
---|---|---|
操作系统组成 | 内核 其他程序 | 管进程、内存等关键任务 👨💼 如函数库、shell 程序辅助使用计算机 🛠️ |
操作系统使命 | 管理资源 提供环境 | 与硬件交互管理资源 🛠️ 保障应用程序稳定运行 🎵 |
管理方式 | struct 结构体描述硬件 链表等组织硬件 | 为硬件做 “身份证” 📄 实现高效管理 📁 |
开发相关 | 系统调用 库函数 | 基础功能,对开发者要求高 🧐 封装系统调用,方便上层开发 😃 |
结尾🎉
好啦,小伙伴们!今天咱们一起探索了 GDB 调试、冯诺依曼体系和操作系统的奇妙世界。
希望这些知识能成为你们编程路上的 “秘密武器”,以后遇到问题,再也不怕不怕啦💪!祝愿大家在编程的海洋里乘风破浪,编写出超酷炫的程序哦🌈!
如果在学习过程中有任何疑问或建议,欢迎随时交流分享哦😉! 👉【A Charmer】
相关文章:

告别编程困惑:GDB、冯诺依曼、操作系统速通指南
🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩 目录 前言 一…...

网络分析工具-tcpdump
文章目录 前言一、tcpdump基础官网链接命令选项详解常规过滤规则tcpdump输出 一、tcpdump实践HTTP协议ICMP状态抓包 前言 当遇到网络疑难问题的时候,抓包是最基本的技能,通过抓包才能看到网络底层的问题 一、tcpdump基础 tcpdump是一个常用的网络分析工…...

基于AI边缘计算盒子的智慧零售场景智能监控解决方案
一、方案背景 随着零售业的快速发展,传统零售模式面临着诸多挑战,如人力成本高、管理效率低、顾客体验不佳等。智慧零售借助人工智能、物联网等技术手段,实现对零售场景的全面感知和智能管理。AI边缘计算盒子作为智慧零售的关键技术之一&…...

STM32G431收发CAN
1.硬件连接 PB8作为CAN_RX,PB9作为CAN_TX,连接一个CAN收发器TJA1051T/3 2. CubeMX里配置CAN 设置连接FDCAN1的参数,使用1个标准过滤器,波特率位500K 使能FDCAN1的中断 3 自动生成代码 3.1 初始化 static void MX_FDCAN1_In…...
如何得到深度学习模型的参数量和计算复杂度
1.准备好网络模型代码 import torch import torch.nn as nn import torch.optim as optim# BP_36: 输入2个节点,中间层36个节点,输出25个节点 class BP_36(nn.Module):def __init__(self):super(BP_36, self).__init__()self.fc1 nn.Linear(2, 36) # …...

2025年股指期货每月什么时候交割?
股指期货交割日是指期货合约到期时,买卖双方根据合约规定的指数价值进行现金结算的日期。在中国市场中,股指期货的交割日通常是合约到期月份的第三个星期五。这一规律适用于所有股指期货合约,无论是当月、下月合约,还是季度月合约…...

自从学会Git,感觉打开了一扇新大门
“同事让我用 Git 提交代码,我居然直接把项目文件压缩发过去了……”相信很多初学者都经历过类似的窘境。而当你真正掌握 Git 时,才会发现它就像一本魔法书,轻松解决代码管理的种种难题。 为什么 Git 能成为程序员的标配工具?它究…...

Ansys Discovery 中的网格划分方法:探索模式
本篇博客文章将介绍 Ansys Discovery 中可用于在探索模式下进行分析的网格划分方法。我们将在下一篇博客中介绍 Refine 模式下的网格划分技术。 了解 Discovery Explore 模式下的网格划分 网格划分是将几何模型划分为小单元以模拟系统在不同条件下的行为的过程。这是通过创建…...

关于 AWTK 和 Weston 在旋转屏幕时的资源消耗问题
关于 AWTK 和 Weston 在旋转屏幕时的资源消耗问题,首先需要理解这两者旋转的本质区别及其资源开销。 AWTK的屏幕旋转: AWTK旋转的实现方式: AWTK 是一个用户界面工具包,它通过图形渲染系统处理所有控件和窗口的旋转。当你使用 w…...

grouped.get_group((‘B‘, ‘A‘))选择分组
1. df.groupby([team, df.name.str[0]]) df.groupby([team, df.name.str[0]]) 这一部分代码表示对 DataFrame df 按照 两个条件 进行分组: 按照 team 列(即团队)。按照 name 列的 首字母(df.name.str[0])。 df.name.s…...

HTML——66.单选框
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>单选框</title></head><body><!--input元素的type属性:(必须要有)--> <!--单选框:(如所住省会,性别选择&…...
Couchbase 和数据湖技术的区别、联系和相关性分析
Couchbase 和数据湖技术(如 Delta Lake、Apache Hudi、Apache Iceberg)分别是两类不同的数据存储与管理系统,但它们也可以在特定场景中结合使用,以下是它们的区别、联系和相关性分析: 区别: 1. 核心用途&a…...
springboot3 性能优化
Spring Boot 3 是基于 Spring Framework 6 的最新版本,支持 Java 17,并引入了多项改进,包括原生镜像支持、性能提升和现代化开发支持。以下是对 Spring Boot 3 应用进行全面优化的详细步骤: 一、开发环境优化 1. 使用最新版本 确保依赖版本为最新: Spring Boot 3.x。 J…...
C++之运算符重载详解篇
1.概念 重载概念: C 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。 运算符重载概念:对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型 这里主要介绍…...
深度学习应用工程化中的节能减排最佳实践
文章大纲 简介为什么要在制造业节能减排能耗估算显卡能耗CPU 能耗树莓派能耗加速卡能耗硬件层面的改进边缘端硬件简介树莓派 + 加速卡软件层面的改进检测逻辑的改进算法层面改进深度学习模型训练,推理,量化的优化外网参考参考文献简介 为什么要在制造业节能减排 一、制造业…...

电脑文件msvcp110.d丢失的解决方法
电脑运行故障全解析:从文件丢失到系统报错,打造无忧使用环境 在数字化浪潮中,电脑作为我们工作、学习和娱乐的得力助手,其稳定运行至关重要。然而,在实际使用过程中,我们难免会遇到各种各样的问题…...
xdoj isbn号码
ISBN 号码 问题描述 每一本正式出版的图书都有一个 ISBN 号码与之对应,ISBN 码包括 9 位数字、1 位识别码和 3 位分隔符,其规定格式如"x-xxx-xxxxx-x", 其中符号“-”是分隔符(键盘上的减号),最…...
qt的utc时间转本地时间
代码如下: #include <QCoreApplication> #include <QDateTime> #include <QDebug>int main(int argc...

mariadb变更数据存放目录
1、停止mariadb服务 # systemctl stop maraidb.server 2、创建数据目录 # mkdir /opt/mysql # chown -R mysql:mysql /opt/mysql 3、配置mariadb 3.1 配置文件说明 # cd /etc/mysql/ && ls -l my.cnf为主配置文件,其他的为子配置,同时配置…...

分布式专题(11)之Zookeeper特性与节点数据类型详解
一、Zookeeper数据结构 Zookeeper数据模型与结构与Unix文件系统很类似,整体上可以看做是一棵树,每个节点称做一个ZNode。 Zookeeper的数据模型是层次模型,层次模型常见于文件系统 。层次模型和Key-Value模型是两种主流的数据模型,…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...