操作系统实验lab0

news/2024/6/17 20:06:20 标签: linux, 操作系统

目录

实验目的:

熟悉命令行方式的编译、调试工程

1.编译——gcc的使用

2.调试——gdb使用

熟悉基于硬件模拟器的调试技术

安装硬件模拟器QEMU


实验目的:

  1. 了解操作系统开发实验环境
  2. 熟悉命令行方式的编译、调试工程
  3. 掌握基于硬件模拟器的调试技术
  4. 熟悉C语言编程和指针的概念
  5. 了解X86汇编语言

开始实验:(报告内容主要是一些环境配置步骤)

熟悉命令行方式的编译、调试工程

1.编译——gcc的使用

①编写程序test_gcc.c并gcc编译生成可执行目标文件test_gcc.o

选项 -Wall 开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。编译器有很多其他的警告选项,但 -Wall 是最常用的。默认情况下GCC 不会产生任何警告信息。当编写 C 或 C++ 程序时编译器警告非常有助于检测程序存在的问题

②最后运行程序test_gcc.o

2.调试——gdb使用

gdb 是功能强大的调试程序,可完成如下的调试任务:

  1. 设置断点
  2. 监视程序变量的值
  3. 程序的单步(step in/step over)执行
  4. 显示/修改变量的值
  5. 显示/修改寄存器
  6. 查看程序的堆栈情况
  7. 远程调试
  8. 调试线程

在可以使用 gdb 调试程序之前,必须使用 -g 或 –ggdb编译选项编译源文件。运行 gdb 调试程序时通常使用如下的命令:gdb progname

break FILENAME:NUM

在特定源文件特定行上设置断点

clear FILENAME:NUM

删除设置在特定源文件特定行上的断点

run

运行调试程序

step

单步执行调试程序,不会直接执行函数

next

单步执行调试程序,会直接执行函数

backtrace

显示所有的调用栈帧。该命令可用来显示函数的调用顺序

where continue

继续执行正在调试的程序

display EXPR

每次程序停止后显示表达式的值,表达式由程序定义的变量组成

file FILENAME

装载指定的可执行文件进行调试

help CMDNAME

显示指定调试命令的帮助信息

info break

显示当前断点列表,包括到达断点处的次数等

info files

显示被调试文件的详细信息

info func

显示被调试程序的所有函数名称

info prog

显示被调试程序的执行状态

info local

显示被调试程序当前函数中的局部变量信息

info var

显示被调试程序的所有全局和静态变量名称

kill

终止正在被调试的程序

list

显示被调试程序的源代码

quit

退出 gdb

 

代码例子:

报错:Segment fault 段错误

①下面用gdb来调试:

运行 “gdb test_gdb” ,加载 test_gdb可执行文件;

[2] 执行装入的 test_gdb命令;

[3] 使用 where 命令查看程序出错的地方;

[4] 利用 list 命令查看调用 gets 函数附近的代码;

[5] 在 gdb 中,我们在第 11 行处设置断点,看看是否是在第11行出错;

[6] 程序重新运行到第 11 行处停止,这时程序正常,然后执行单步命令next

[7] 程序确实出错,能够导致 gets 函数出错的因素就是变量 string。重新执行测试程,用 print 命令查看 string 的值;

[8] 问题在于string指向的是一个无效指针,修改程序,在10行和11行之间增加一条语句 “string=buff; ”,重新编译程序,然后继续运行,将看到正确的程序运行结果。

"layout src"命令查看源代码:

用gdb查看源代码可以用list命令,但是这个不够灵活。可以使用"layout src"命令,或者按Ctrl-X再按A,就会出现一个窗口可以查看源代码。也可以用使用-tui参数,这样进入gdb里面后就能直接打开代码查看窗口。

其他代码窗口相关命令:

info win

显示窗口的大小

layout next

切换到下一个布局模式

layout prev

切换到上一个布局模式

layout src

只显示源代码

layout asm

只显示汇编代码

layout split

显示源代码和汇编代码

layout regs

增加寄存器内容显示

focus cmd/src/asm/regs/next/prev

切换当前窗口

refresh

刷新所有窗口

tui reg next

显示下一组寄存器

tui reg system

显示系统寄存器

update

更新源代码窗口和当前执行点

winheight name +/- line

调整name窗口的高度

tabset nchar

设置tab为nchar个字符

[1] 

[2] 用b linenumber添加三个断点,并用info b查看断点信息:

[3] 使用display跟踪变量i

 

熟悉基于硬件模拟器的调试技术

安装硬件模拟器QEMU

下载qemu安装包:https://download.qemu.org/qemu-4.1.0.tar.xz

解压源代码:tar xvJf qemu-4.1.0.tar.xz

进入qemu目录内:cd qemu-4.1.0

配置qemu,可模拟X86-32硬件环境

编译qemu

安装qemu

在/usr/local/bin下看到安装的qemu程序

建立符号链接文件qemu


http://www.niftyadmin.cn/n/1714461.html

相关文章

简单工厂模式介绍和应用(Java画图程序UML、项目代码)

目录 介绍 工程UML图: 工程压缩包: 介绍 工程UML图: 工程压缩包: 链接:https://pan.baidu.com/s/1R9b5mMhtnIQZoEAVPtu9rQ 提取码:3mre

动态规划:斐波那契数列

斐波那契数列一般是使用递归来做&#xff0c;但是用递归来做当数量很大时&#xff0c;往往会超时。所以可以使用动态规划来做。 def fib(n):dp[]if n<0:return -1if n0:return 0if n1:return 1else:dp.append(0)dp.append(1)for i in range(2,n1):dp_tmpdp[i-1]dp[i-2]dp.a…

工厂方法模式介绍和应用(Java画图程序)

目录 介绍 UML图 项目代码 介绍 UML图 项目代码 链接&#xff1a;https://pan.baidu.com/s/1iXXSWav09OUXwuIO2K6Dig 提取码&#xff1a;q3e8

动态规划:青蛙跳台阶问题

问题描述&#xff1a;青蛙可以一次跳一个台阶&#xff0c;也可以一次跳两个台阶&#xff0c;总共有10层台阶&#xff0c;青蛙有多少种选择 动态规划&#xff1a;设第n层的最多选择为Stage(n),根据题意&#xff0c;可得如下状态转移方程&#xff1a; Stage(n)Stage(n-1)Stage(n…

抽象设计模式介绍和应用(Java画图程序)

介绍 UML图&#xff1a; 工程压缩包 链接&#xff1a;https://pan.baidu.com/s/16c6oNL7J8xFUTt7pyNxBHw 提取码&#xff1a;bt2o

dfs实现任意n个数的全排列

arr[4,7,3,8] # 这里可以把它替换成任意的数组 a[0 for i in range(10)] #存放每一种组合遍历过程中的数字 book[0 for i in range(10)] #标记数组 n3 def dfs(step):# 尝试每一种可能for num in arr:if book[num]0:a[step]numbook[num]1dfs(step1)book[num]0# 边界判断if ste…

eclipse安装Spring+建立Spring工程

目录 安装Spring 新建Spring工程 1.新建Spring starter project 安装Spring &#xff08;参考博客&#xff1a;https://www.jianshu.com/p/584ca95853f0&#xff09; 1.help-> market place搜索STS-> Install 问题&#xff1a;下载的时候出现read time out 解决办法…

动态规划:蜗牛爬井问题

动态规划&#xff1a;蜗牛爬井问题 一只蜗牛白天爬4米&#xff0c;晚上掉2米&#xff0c;n米的井&#xff0c;蜗牛几天才能爬出来 def costDay(n):if n0:return 0elif n<4:return 1else:ans[]ans.append(0)ans.append(2)i 2ans_temp0while 1:ans_tempans[i-1]4if ans_temp…