【深大计算机系统(2)】实验一 实验环境配置与使用 附常用指令
目录
一、 实验目标:
二、实验环境与工件:
三、实验内容与步骤
1. 学习并熟悉Linux基本操作,按照要求创建用户。(30分)
2.新建用户主目录下创建子目录:gdbdebug,并进入gdbdebug子目录。将过程和结果截图。(10分)
3. 用vi编辑以下两个文件并编译和运行,截图(30分)
4. 调试并修正reverse.c文件。(30分)
四、实验结果
五、实验总结与体会
附:虚拟机常用指令
写在前面:
上交的实验报告需要包含账户的姓名全拼以及学号,本报告的相应部分已经打码处理,请在自己的环境中完成实验!
一、 实验目标:
1. 了解Linux操作系统及其常用命令
2. 掌握编译工具gcc的基本用法
3. 掌握使用gdb进行程序调试
二、实验环境与工件:
1.个人电脑
2. Linux操作系统
3. gcc编译器
4. gdb调试工具
三、实验内容与步骤
1. 学习并熟悉Linux基本操作,按照要求创建用户。(30分)
1.1. 首先使用命令$ su切换为超级用户(此处的密码不会显示,照常输入并回车即可)
图:切换为超级用户
1.2. 使用命令# adduser 姓名_学号 创建新用户, 设置新建用户的密码,此处由于最开始的用户名就已经设置正确,故提示用户已经存在。
图:尝试创建新用户
1.3. 注销当前用户,并以新建的用户身份登录,登录后输入命令$ whoami,并进行截图。
2.新建用户主目录下创建子目录:gdbdebug,并进入gdbdebug子目录。将过程和结果截图。(10分)
图:尝试创建gdbdebug子目录
由图可知,由于目录已经存在,无法执行再次创建命令。
接下来使用指令$ ls查看所有已存在的目录,可见gdbdebug目录已存在。再使用指令$ cd gdbdebug进入子目录
图:进入gdbdebug子目录
3. 用vi编辑以下两个文件并编译和运行,截图(30分)
3.1. 编辑reverse.h文件:
输入命令$ vi reverse.h创建reverse.h文件,编辑完成后按“esc”退出,并输入“:wq”用于保存代码。
图:reverse.h文件的创建与编辑
3.2. 编辑reverse.c文件
输入命令$ vi reverse.c创建reverse.c文件,并写入要求内容:
图:编辑reverse.c文件
接着退出编辑模式并保存。
3.3. 编译并修改代码:
输入指令 $ gcc -Wall reverse.c -o reverse 对reverse.c进行编译,接着出现报错:
图:编译报错
接下来对错误进行分析与解决:
①strlen()函数位于<string.h>头文件中,而代码中并没有包含,需要在头文件部分加上#include <string.h>。
②在使用scanf()函数时,不需要为str添加&,因为str已经是一个数组,它本身就是一个地址。去掉&符号即可。
③原先给出的指令有误,应该是由于符号错误引起的。
将以上错误修改,再次进行编译,结果如下:
图:第二次编译结果
警告来自于没有返回值的int型函数,加上语句return 0;即可。
再次进行编译,发现没有报错或者警告信息,说明此阶段任务完成。
图:编译成功
3.4. 运行程序:
输入命令$./reverse运行编译完成的代码:
图:运行结果
4. 调试并修正reverse.c文件。(30分)
4.1. 编译时加入调试信息
使用命令:gcc -g reverse.c -o reverse1进行编译,同时生成调试信息并且输出一个名为reverse1的可执行文件。
4.2. 启用GDB调试
输入命令:gdb ./reverse1
图:调试信息
4.3. 键入list,查看源代码并根据行号、函数名设置断点:
图:查看代码以及对应行号
图:设置断点并查看断点信息
4.4. 观察变量值,并作分析,推测错误:
图:调试过程(前半)
图:调试过程(后半)
由图可知,在运行第15行语句时,变量str出现了错误的改变,语句*str + len - i – 1并没有正确表示目的位置的字符,而是表示了错误位置的字符经过加减后得到的字符,应当修改为(*str + len - i – 1),同理,14行的*str + i应当修改为(*str + i)。
4.5. 修正程序并运行:
根据以上分析,重新打开代码文件,对相应部分作出修改,结果如下:
图:修改后的代码
修改后重新进行编译与运行,可见结果正确:
图:运行结果
四、实验结果
运行修改完成后的代码,得到的正确结果如图所示:
图:运行结果
五、实验总结与体会
实验总结:本实验首先完成了VMware软件的下载与安装,在软件中配置了ubuntu虚拟机环境,并在此Linux虚拟机环境中配置了gcc编译器。
在完成以上基础环境的配置后,完成了新建账户、新建目录、新建代码文件并对其进行编译的操作。接着对编译结果进行改错、实现代码的运行。然后进行了断点的设置、代码的调试与修改,并最终得到了正确的结果。
实验体会:本次实验是第一次使用Linux环境,期间遇到了不少环境操作上的问题;在代码相关操作上与熟悉的Windows环境也有诸多不同。经过了查阅资料与相关知识的学习,我对Linux环境有了一定的了解,学会了初步的操作,并能完成此环境下c++的编程任务,解决了上述问题。
尾注
本实验是本课程的第一次实验,难度较低。
如有疑问欢迎讨论,如有好的建议与意见欢迎提出,如有发现错误则恳请指正!
附:虚拟机常用指令
实验一:/*首先需要进入root:su直接输入密码(不会有显示)进入gdbdebug目录:cd gdbdebug打开reverse.h:vi reverse.h打开reverse.c:vi reverse.c编译reverse.c(*):gcc -Wall reverse.c -o reverse运行:./reverse编译时加入调试信息:gcc -g reverse.c -o reverse1启用GDB调试:gdb ./reverse1调试语句:设置断点:break 行号删除断点:delete行号删除所有断点:delete查看所有断点信息:info break开始运行:run或r继续运行:continue或c结束运行:quit或q(*)解释gcc -Wall reverse.c -o reverse :-Wall:意为"开启所有警告"。reverse.c:是要编译文件。-o reverse:-o是指定输出文件的选项,reverse是编译后生成的可执行文件名。*/
相关文章:

【深大计算机系统(2)】实验一 实验环境配置与使用 附常用指令
目录 一、 实验目标: 二、实验环境与工件: 三、实验内容与步骤 1. 学习并熟悉Linux基本操作,按照要求创建用户。(30分) 2.新建用户主目录下创建子目录:gdbdebug,并进入gdbdebug子目录。将过程和…...
目标检测经典模型之YOLOV5-detect.py源码解析(持续更新)
detect文件框架 一、导入模块包二、定义run函数1. 归一化操作代码解析uint8精度转换归一化 2. 扩展维度为什么扩展维度?代码解释 3. 对检测结果类别计数检查是否有检测结果统计每个类别的出现次数构建描述性字符串 三、定义命令行参数四、主函数 本帖是YOLOV5推理部…...
PF4J+SpringBoot
plugin-common pom.xml相关配置 <groupId>pub.qingyun</groupId> <artifactId>plugin-common</artifactId> <version>0.0.1-SNAPSHOT</version> <description>插件配置类</description><dependency><groupId>or…...

设计模式11-原型模式
设计模式11-原型模式 写在前面对象创建模式典型模式原型模式动机结构代码推导应用特点要点总结 原型模式与工厂方法模式对比工厂方法模式原型模式什么时候用什么模式 写在前面 对象创建模式 通过对象创建模式绕开动态内存分配来避免创建过程中所导致的耦合过紧的问题。从而支…...
Tomcat长连接源码解析
长连接: 客户端发送Http请求至服务端,请求发送完之后socket连接不断开,可以继续接收下一个Http请求并且解析返回。接手并解析这些Http请求的时候socket连接不断开,这种过程被称为长连接。 需要注意的点就在于,在满足什么条件的情况…...
C++编程:实现一个跨平台安全的定时器Timer模块
文章目录 0. 概要1. 设计目标2. SafeTimer 类的实现2.1 头文件 safe_timer.h源文件 safe_timer.cpp 3. 工作流程图4. 单元测试 0. 概要 对于C应用编程,定时器模块是一个至关重要的组件。为了确保系统的可靠性和功能安全,我们需要设计一个高效、稳定的定…...

PyTorch的自动微分模块【含梯度基本数学原理详解】
文章目录 1、简介1.1、基本概念1.2、基本原理1.2.1、自动微分1.2.2、梯度1.2.3、梯度求导1.2.4、梯度下降法1.2.5、张量梯度举例 1.3、Autograd的高级功能 2、梯度基本计算2.1、单标量梯度2.2、单向量梯度的计算2.3、多标量梯度计算2.4、多向量梯度计算 3、控制梯度计算4、累计…...

AI 绘画|Midjourney设计Logo提示词
你是否已经看过许多别人分享的 MJ 咒语,却仍无法按照自己的想法画图?通过学习 MJ 的提示词逻辑后,你将能够更好地理解并创作自己的“咒语”。本文将详细拆解使用 MJ 设计 Logo 的逻辑,让你在阅读后即可轻松上手,制作出…...

LeNet实验 四分类 与 四分类变为多个二分类
目录 1. 划分二分类 2. 训练独立的二分类模型 3. 二分类预测结果代码 4. 二分类预测结果 5 改进训练模型 6 优化后 预测结果代码 7 优化后预测结果 8 训练四分类模型 9 预测结果代码 10 四分类结果识别 1. 划分二分类 可以根据不同的类别进行多个划分,以…...

【BUG】已解决:java.lang.reflect.InvocationTargetException
已解决:java.lang.reflect.InvocationTargetException 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发…...

配置kali 的apt命令在线安装包的源为国内源
目录 一、安装VMware Tools 二、配置apt国内源 一、安装VMware Tools 点击安装 VMware Tools 后,会加载一个虚拟光驱,里面包含 VMware Tools 的安装包 鼠标右键单击 VMware Tools 的安装包,点击复制到 点击 主目录,再点击选择…...

JAVA 异步编程(线程安全)二
1、线程安全 线程安全是指你的代码所在的进程中有多个线程同时运行,而这些线程可能会同时运行这段代码,如果每次运行的代码结果和单线程运行的结果是一样的,且其他变量的值和预期的也是一样的,那么就是线程安全的。 一个类或者程序…...

Golang | Leetcode Golang题解之第260题只出现一次的数字III
题目: 题解: func singleNumber(nums []int) []int {xorSum : 0for _, num : range nums {xorSum ^ num}lsb : xorSum & -xorSumtype1, type2 : 0, 0for _, num : range nums {if num&lsb > 0 {type1 ^ num} else {type2 ^ num}}return []in…...
IDEA自带的Maven 3.9.x无法刷新http nexus私服
问题: 自建的私服,配置了域名,使用http协议,在IDEA中或本地Maven 3.9.x会出现报错,提示http被blocked,原因是Maven 3.8.1开始,Maven默认禁止使用HTTP仓库地址,只允许使用HTTPS仓库地…...

56、本地数据库迁移到阿里云
现有需求,本地数据库迁移到阿里云上。 库名xy102表 test01test02test01 test023条数据。1、登录阿里云界面创建免费试用ECS实列。 阿里云登录页 (aliyun.com)](https://account.aliyun.com/login/login.htm?oauth_callbackhttps%3A%2F%2Fusercenter2.aliyun.com%…...

新时代多目标优化【数学建模】领域的极致探索——数学规划模型
目录 例1 1.问题重述 2.基本模型 变量定义: 目标函数: 约束条件: 3.模型分析与假设 4.模型求解 5.LINGO代码实现 6.结果解释 编辑 7.敏感性分析 8.结果解释 例2 奶制品的销售计划 1.问题重述 编辑 2.基本模型 3.模…...
单例模式详解
文章目录 一、概述1.单例模式2.单例模式的特点3.单例模式的实现方法 二、单例模式的实现1. 饿汉式2. 懒汉式3. 双重校验锁4. 静态内部类5. 枚举 三、总结 一、概述 1.单例模式 单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类…...
WebGIS主流的客户端框架比较|OpenLayers|Leaflet|Cesium
实现 WebGIS 应用的主流前端框架主要包括 OpenLayers、Leaflet、Mapbox GL JS 和 Cesium 等。每个框架都有其独特的功能和优势,适合不同的应用场景。 WebGIS主流前端框架的优缺点 前 端 框架优点缺点OpenLayers较重量级的开源库,二维GIS功能最丰富全面…...

【LabVIEW作业篇 - 2】:分数判断、按钮控制while循环暂停、单击按钮获取book文本
文章目录 分数判断按钮控制while循环暂停按钮控制单个while循环暂停 按钮控制多个while循环暂停单击按钮获取book文本 分数判断 限定整型数值输入控件值得输入范围,范围在0-100之间,判断整型数值输入控件的输入值。 输入范围在0-59之间,显示…...

Kafka架构详解之分区Partition
目录 一、简介二、架构三、分区Partition1.分区概念2.Offsets(偏移量)和消息的顺序3.分区如何为Kafka提供扩展能力4.producer写入策略5.consumer消费机制 一、简介 Apache Kafka 是分布式发布 - 订阅消息系统,在 kafka 官网上对 kafka 的定义…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践
01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...

如何把工业通信协议转换成http websocket
1.现状 工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时…...