Linux——gdb|准备工作查看代码|r命令|断点相关命令|逐语句|逐过程|调用堆栈|冯诺依曼结构

简介: 笔记

准备工作


1.png

注意makefile要加-g选项

我们写一段代码,并且使用makefile

输入gdb 可执行程序:进入调试模式


输入quit退出gdb模式

查看代码

l 0:从第0行开始显示代码

若想继续显示后面的代码,我们不断按回车即可,因为gdb具有记忆功能,当未输入指令时,按回车它会执行最近一次的指令

r命令


r:开始调试,如果没有设置断点,就直接运行结束

image.png

此时未设置断点,直接出结果了,相当于vs下按F 5

断点相关命令


b 行号:可以打断点

查看断点 info b

注意第一列num,删断点时要用到

d num:去断点

有断点之后输入r,就可以跑到断点处

逐语句|逐过程|调用堆栈


n:逐过程(等同于vsF10)


p 变量名:打印变量内容


s:逐语句


bt:查看当前调用堆栈


finish:将当前函数跑完,就停下来


display 变量名:长显示变量


undisplay :取消长显示


until:跳转到指定行,对一个函数局部跳转


c或continue:运行至下一个断点处停下来


disa 序号:关闭断点


enable:打开断点


断点在第22行,输入n没有进入函数,直接来到下一条语句,第23行语句是回车

当我们想查看函数里,result值是多少时,输入p result,可直接查看

再次按r会重新调试

输入s会进入函数里面



输入bt可查看调用堆栈



当进入函数后又想退出,输入finish即可,之后我们发现函数已经跑完了,我们可以看到结果4950,此时我们输入bt,发现已经没有刚才函数的栈帧了


进入循环



如果想查看当前i时多少,输入display i



如果想查看当前地址输入p &i,p是打印只显示一次



如果想取消长显示,输入undisplay i是不能取消的



我们在设置常显示值之后,前面是有编号的,undisplay 编号 取消常显示



此时就看不到i了



若想跳出循环,这里直接想跳到15行 until 15,此时结果已经出来


.



如果想由一个断点直接跳到下一个断点


修改一下程序,便于观察




输入c直接跳转



这行是显示断电的打开与关闭状态



disa 序号:可关闭该序号断点



输入disa关闭所有断点


enable可打开断点



也可加序号



冯诺依曼结构  


cpu读取数据(数据+代码),都是要从内存中读取,站在数据的角度骂我们人为cpu不和外设直接交互


cpu要处理数据,需要先将外设中的数据,加载到内存,站在数据的角度,外设之和内存打交道


程序要运行,必须先被加载到内存中,因为体系结构的特点决定



管理:先描述,在组织


操作系统要给用户提供一个稳定,安全,简单的执行环境


习题 1

冯诺依曼体系结构中数据输入设备的有?A D


A.键盘


B.显示器


C.内存


D.磁盘


注意:内存不是输入设备


习题2

不属于冯诺依曼体系结构必要组成部分是:B


A.CPU


B.Cache


C.RAM


D.ROM


CPU   运算器与控制器,Cache 缓存(一种技术), RAM 内存(存储器),ROM 磁盘(输入输出设备)


冯·诺依曼 提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成( 运算器 、 控制器 、 存储器 、 输入设备 、 输出设备 )

习题3

冯诺依曼体系结构计算机的基本原理是?


A.信息存储


B.存储智能


C.数字控制


D.存储程序和程序控制


D


计算机就是为了完成指定的数据处理,而通过指令按指定流程完成指定功能,指令的合集就是一段程序。说白了计算机就是按照指定的指令执行流程完成对指定数据的处理


习题4

操作系统的主要功能有(A)


A.控制和管理计算机系统软硬件资源


B.对汇编语言,高级语言和甚高级语言程序进行翻译


C.管理用各种语言编写的源程序


D.管理数据库文件


操作系统的定位就是控制和管理计算机上软硬件资源让计算机更加好用,因此A选项是 正确的

对汇编语言,高级语言和甚高级语言程序进行翻译,这个功能是编译器的功能,将高级语言解释为机器指令能够被机器识别执行。因此B选项不正确,这不是操作系统的主要功能,而是一个外部应用的主要功能

源程序以及数据库文件都是存储在磁盘上的,这是操作系统中,文件系统管理部分的主要功能,因此C和D选项不正确。


习题5

下面关于系统调用的描述中,错误的是(B)


A.系统调用把应用程序的请求传输给系统内核执行


B.系统调用函数的执行过程应该是在用户态


C.利用系统调用能够得到操作系统提供的多种服务


D.是操作系统提供给编程人员的接口


E.系统调用给用户屏蔽了设备访问的细节


F.系统调用保护了一些只能在内核模式执行的操作指令


系统调用是操作系统向上层提供的用于访问内核特定功能的接口。

A正确,应用程序通过系统调用将自己需要完成的功能传递给内核,进行执行完成

B错误,系统调用的运行过程是在内核态完成的,操作系统并不允许用户直接访问内核,也就是说用户运行态并不满足访问内核的权限。

C正确,因为系统调用就是想上层提供用于完成特定内核服务或功能的。

D正确,

E正确,用户只需要将自己的请求以及数据通过系统调用接口传递给内核,内核中完成对应的设备访问过程,最终返回结果正确

F正确,系统向上层提供系统调用接口用于访问内核服务或功能的很大原因也是因为这样可以最大限度的保护内核的稳定运行。


习题6

下面的函数哪个是系统调用而不是库函数()?


A.printf


B.scanf


C.fgetc


D.read


E.print_s


F.scan_s


库函数是用户对系统调用接口的进一步封装接口

printf函数是glibc中封装的用于实现格式化输出的接口

scanf函数是glibc中封装的用于实现格式化输入的接口

fgetc函数是glibc中封装的用于实现从输入流中获取字符的接口

read是系统提供的用于从输入设备获取数据的接口

print_s以及scan_s这两个函数不存在,至少在C语言的常见典型的跨平台移植代码库中不存在


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
5天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
1月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
156 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
2月前
|
Java Linux Python
Linux环境下 代码java调用python出错
Linux环境下 代码java调用python出错
43 3
|
3月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
59 10
|
2月前
|
Linux Shell Python
9-7|salt代码在linux机子那个目录
9-7|salt代码在linux机子那个目录
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
3月前
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
121 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
3月前
|
Linux 程序员 开发者
源社区的兴起:从“代码隐士”到Linux引领的“全球编程嘉年华”
在编程的古老森林中,曾有“代码隐士”默默耕耘,惧怕智慧外泄。直到“开源”春风拂过,源社区如全球编程嘉年华盛开!开源文化颠覆了“独门秘籍”的传统,像“武林秘籍共享”般在网络上公开,鼓励知识传播与智慧碰撞。程序员组队开发,分享代码,提升科技实力。Linux则从“首席大厨”变身为“总导演”,以强大内核调制出诱人应用,引领潮流并推动技术创新。加入这场没有血腥厮杀,只有知识盛宴的“编程版《饥饿游戏》”吧!与全球开发者共享编程的乐趣与成就感!别忘了带上你的“独门秘籍”,可能下一个改变世界的创意就在其中!
66 7
|
2月前
|
Linux 开发者 Python
从Windows到Linux,Python系统调用如何让代码飞翔🚀
【9月更文挑战第10天】在编程领域,跨越不同操作系统的障碍是常见挑战。Python凭借其“编写一次,到处运行”的理念,显著简化了这一过程。通过os、subprocess、shutil等标准库模块,Python提供了统一的接口,自动处理底层差异,使代码在Windows和Linux上无缝运行。例如,`open`函数在不同系统中以相同方式操作文件,而`subprocess`模块则能一致地执行系统命令。此外,第三方库如psutil进一步增强了跨平台能力,使开发者能够轻松编写高效且易维护的代码。借助Python的强大系统调用功能,跨平台编程变得简单高效。
37 0
|
2月前
|
机器学习/深度学习 Linux 开发工具
Linux内核开发流程指南 - 5. 编写正确的代码【ChatGPT】
Linux内核开发流程指南 - 5. 编写正确的代码【ChatGPT】