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


    目录

    准备工作

    查看代码 

     r命令

    断点相关命令

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

    冯诺依曼结构 

    习题 1

    习题2 

    习题3 

    习题4 

    习题5 

    习题6 


    准备工作

     

    注意makefile要加-g选项

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

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

     输入quit退出gdb模式

    查看代码 

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

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

     r命令

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

    此时未设置断点,直接出结果了,相当于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语言的常见典型的跨平台移植代码库中不存在

  • 相关阅读:
    【LeetCode刷题-双指针】--259.较小的三数之和
    多线程——(Callable)(Future)(CompletableFuture)
    Java(98)Java执行时,报错Unsupported major.minor version 52.0
    【数据结构】树(六)—— 二叉平衡树(C语言版)
    vmstat-内存性能分析常用命令
    虎牙 huya 直播源
    SpringBoot读取Resource下文件的几种方式读取jar里的excel,文件损坏
    [架构之路-242]:目标系统 - 纵向分层 - 应用程序的类型与演进过程(单机应用程序、网络应用程序、分布式应用程序、云端应用程序、云原生应用程序)
    产品经理需要熟悉的网站
    .NET异步编程模式(四)-TAP
  • 原文地址:https://blog.csdn.net/weixin_49449676/article/details/126951396