告别编程困惑:GDB、冯诺依曼、操作系统速通指南

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟
🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩


目录

前言

[一、GDB 调试器:程序的 "纠错神器"🛠️](#一、GDB 调试器:程序的 “纠错神器”🛠️)

[(一)GDB 操作指南📖](#(一)GDB 操作指南📖)

[二、冯诺依曼体系结构:计算机的 "底层蓝图"🗺️](#二、冯诺依曼体系结构:计算机的 “底层蓝图”🗺️)

[三、操作系统:计算机的 "大管家"👨‍🏭](#三、操作系统:计算机的 “大管家”👨‍🏭)

(一)操作系统的使命🎯

(二)操作系统的管理智慧🧠

[(三)系统调用与库函数:开发的 "助力器"🚀](#(三)系统调用与库函数:开发的 “助力器”🚀)

结尾🎉


前言

编程的道路上,程序时不时就像调皮的小精灵🧚‍♂️,突然 "闹脾气",可把不少小伙伴愁坏啦😩。别担心!只要掌握 Linux 调试器 GDB,弄懂计算机底层架构与操作系统原理,这些难题就能轻松化解。现在,就让我们一起踏上探索这些实用知识的旅程吧🧐!


一、GDB 调试器:程序的 "纠错神器"🛠️

程序发布通常有 debug 和 release 两种模式。

  • debug可以调试,形成可执行程序的时候会有调试信息
  • release不能调试

在 Linux 系统里,gcc/g++ 编译生成的二进制程序,默认是 release 模式,这种模式下程序跑得飞快,但要是出了问题,排查起来就像在黑暗中摸索,难上加难。

而如果想让 GDB 这位 "调试高手" 来帮忙,在编译的时候就得加上 -g 选项,这就好比给程序戴上了一副 "透视镜"🔍,让问题无处遁形。

因此要被gdb调试,必须debug方式发布,必须加 -g

(一)GDB 操作指南📖

  1. 启动与退出 :使用 "gdb binFile" 就能开启调试之旅啦🚀,要是想结束调试,敲下 "ctrl + d" 或者输入 "quit" 就可以和 GDB 说拜拜咯👋。
  2. 查看代码 :"list/l 行号" 可以接着上次的位置列出 10 行代码,就像有个贴心小助手,按你的要求翻代码页📄;"list/l 函数名" 则能直接列出特定函数的代码,比如调试游戏程序时,用它就能快速看到 "jump" 函数是怎么写的🧐。
  3. 运行程序 :"r 或 run" 一下,程序就像听到发令枪响的运动员🏃‍♂️,"嗖" 地开始跑起来啦,在赛车游戏里,这就相当于赛车发车咯🏎。
  4. 单步执行 :"n 或 next" 就像给程序下了个 "慢动作" 指令,让它一次只执行一条语句,方便你一步一步揪出问题小尾巴🐾。(逐语句)
  5. 进入函数 :"s 或 step" 这个命令超厉害,能像个小侦探一样,带着你钻进函数内部,看看里面到底在搞什么 "小动作"🕵️‍♂️。(逐过程)
  6. 设置断点 :"break (b) 行号" 可以在指定的行上设个 "关卡"🚧,程序跑到这就会停下来;"break 函数名" 则是在函数开头设卡。要是你觉得 "加速" 函数有点可疑,就在它开头设个断点呗。"info break" 能帮你查看都设了哪些断点,要是设错了,"delete breakpoints" 可以一键删除所有断点,"delete breakpoints n" 能精准删除序号为 n 的那个断点。要是暂时不想让某个断点起作用,"disable breakpoints" 把它 "关禁闭",后面想用了,"enable breakpoints" 再放它 "出来工作"😜。
  7. 操作变量:"print (p) 变量" 或者 "p 变量" 都能打印出变量的值,就像给变量来了个 "X 光透视",看看它里面装的啥;"print (p)" 还能顺便修改变量或者调用函数,厉害吧!"set var" 则是直接给变量 "改头换面",让它按照你的新想法来。
  8. 其他命令 :"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 执行完当前函数返回暂停 🧒 从当前位置继续运行 跟踪变量 📌 取消跟踪变量 跳转到指定行 ⚡ 查看函数调用及参数 🗺️ 查看当前栈帧局部变量值 👀

二、冯诺依曼体系结构:计算机的 "底层蓝图"🗺️

先谈硬件,再谈软件,再谈进程

咱们平常使用的电脑,像笔记本、服务器这些,大多都是按照冯诺依曼体系结构来搭建的。这个结构就像是计算机的 "骨架",支撑着它的各种功能💻。它主要由下面三部分组成:

  1. 输入单元:像键盘、鼠标这些,就像是计算机的 "耳朵" 和 "眼睛"👂👀,负责把外界的信息传递给计算机,让计算机知道你想干啥。
  2. 中央处理器 (CPU) :这可是计算机的 "超级大脑"🧠,运算器就像个超厉害的计算器,能快速处理各种数据运算,控制器则像个指挥官,指挥着计算机各个部分有条不紊地工作。
  3. 输出单元:比如显示器、打印机,它们就像计算机的 "嘴巴"👄,把计算机处理好的结果展示给你看。

举个例子👇:

这里要特别注意哦,在冯诺依曼体系里,**存储器说的就是内存。**CPU 就像个有点 "小傲娇" 的家伙,只愿意和内存 "交流",外部设备要想和 CPU "说说话",都得通过内存这个 "中间人" 来传话。就拿 QQ 聊天来说吧,你发消息的时候,通过键盘输入(输入单元),消息就先跑到内存这个 "小驿站" 歇着,然后 QQ 程序在 CPU 这个 "大指挥官" 的指挥下,从内存里把消息拿出来处理,处理完再放回内存,接着通过网络(输出相关功能)发出去给对方。对方收到消息后,也是先把消息放在内存 "驿站",再由显示器(输出单元)显示出来给对方看。要是发文件,文件数据就像一大包行李,也是先到内存 "驿站",再处理传输。

总结表格

组成部分 功能 举例
输入单元 为计算机输入信息 👂👀 键盘、鼠标
中央处理器 (CPU) 运算器负责数据计算,控制器指挥各部分工作 🧠 处理各种数据运算、控制程序流程
输出单元 展示计算机处理结果 👄 显示器、打印机
特殊说明 CPU 仅与内存交互,外设通过内存中转数据 📩 QQ 聊天消息、文件传输

一个程序要运行,必须要先加载到内存中运行?为什么?

为什么我们当时写的进度条,默认显示的数据,是可能会缓存起来?在哪里缓存?

因为冯诺依曼体系结构规定的,硬件要求


三、操作系统:计算机的 "大管家"👨‍🏭

(是什么)

操作系统(OS)就像是计算机系统的 "大管家",把计算机的各种事务安排得明明白白。它主要包括内核和其他程序两部分。内核负责进程管理、内存管理、文件管理、驱动管理这些重要的事儿,就像管家的几个得力助手,各自把自己的活儿干得漂亮;其他程序呢,像函数库、shell 程序这些,就像是管家的小工具,帮我们更方便地使用计算机。

(一)操作系统的使命🎯

  1. 管理资源:和硬件打交道,合理安排软硬件资源,就像管家要把家里的东西都安排得井井有条,让它们都能发挥自己的作用。
  2. 提供环境:给应用程序打造一个舒适、稳定的 "小窝",让它们能顺顺利利地运行,就像音乐软件能在操作系统提供的环境里流畅播放音乐🎵。

(二)操作系统的管理智慧🧠

操作系统会用 struct 结构体来给硬件做个详细的 "档案"📄,就像给每个硬件发了一张 "身份证",上面记录着各种信息。然后再用链表等数据结构把这些 "身份证" 整理好,方便管理,这样就能快速找到需要的硬件信息啦。

(三)系统调用与库函数:开发的 "助力器"🚀

(为什么)

从开发的角度看,操作系统就像一个神秘的大宝藏,它打开一些小窗口,这些窗口就是系统调用,开发者可以通过这些窗口和操作系统互动。不过系统调用的功能比较基础,就好比给了你一些基础材料,让你自己动手做东西,对开发者要求有点高。这时候,聪明的开发者就把这些基础材料加工了一下,做成了库函数,库函数就像已经组装好的高级工具,用起来更方便,让上层开发变得轻松不少。比如说,盖房子的时候,系统调用给你的是砖头、水泥这些基础材料,库函数就像是已经做好的预制板,直接用就行,是不是方便多啦😃。

(怎么做后文再讲解)

总结表格

分类 内容 说明
操作系统组成 内核 其他程序 管进程、内存等关键任务 👨‍💼 如函数库、shell 程序辅助使用计算机 🛠️
操作系统使命 管理资源 提供环境 与硬件交互管理资源 🛠️ 保障应用程序稳定运行 🎵
管理方式 struct 结构体描述硬件 链表等组织硬件 为硬件做 "身份证" 📄 实现高效管理 📁
开发相关 系统调用 库函数 基础功能,对开发者要求高 🧐 封装系统调用,方便上层开发 😃

结尾🎉

好啦,小伙伴们!今天咱们一起探索了 GDB 调试、冯诺依曼体系和操作系统的奇妙世界。

希望这些知识能成为你们编程路上的 "秘密武器",以后遇到问题,再也不怕不怕啦💪!祝愿大家在编程的海洋里乘风破浪,编写出超酷炫的程序哦🌈!


如果在学习过程中有任何疑问或建议,欢迎随时交流分享哦😉! 👉【A Charmer】

相关推荐
沐雨风栉10 分钟前
如何利用群晖NAS实现远程访问你的网页版Linux虚拟桌面环境
linux·运维·服务器
代码星辰10 分钟前
Nginx——静态资源部署(二/五)
运维·nginx·静态资源
Toormi15 分钟前
Python实现一个简单的 HTTP echo 服务器
服务器·python·http
童安格粉丝1 小时前
linux下安装达梦数据库v8详解
linux·数据库·centos·达梦·安装·客户端·v8
genggeng不会代码1 小时前
操作系统大题整理
linux·运维·服务器
梦幻通灵1 小时前
Ansible之批量管理服务器
服务器·github·ansible
ExcaliburUnlimited1 小时前
【AutoSAR】【底软自动化】Arxml自动配置平台
运维·自动化
微学AI2 小时前
GPU算力平台的应用之任意门:任意穿搭匹配模型的应用教程
服务器·人工智能·gpu算力
讓丄帝愛伱2 小时前
使用JMeter对Linux生产服务器进行压力测试
linux·jmeter·压力测试
lamb张2 小时前
CentOS常用命令
linux·运维·centos