实验一:实验环境配置与使用

一、实验目标:

 

熟悉Linux上C程序的编译和调试工具,包括以下内容:

1. 了解Linux操作系统及其常用命令

2. 掌握编译工具gcc的基本用法

3. 掌握使用gdb进行程序调试

 

二、实验环境与工件

1.个人电脑

2. Fedora 13 Linux 操作系统

3. gcc

4. gdb

 

三、实验内容与步骤

1.根据实验一:实验环境配置与使用.ppt熟悉Linux基本操作(P.1 – P.28),然后根据以下过程创建用户:用户名为学生名称加学号,如赖丹辉,学号2013150040,则该用户名为Laidanhui_2013150040。按照1.1~1.3完成并截图,截图需要有运行的命令及其结果。另外:后面的题目必须在该新建用户下完成。

实验步骤:

1.1.首先切换为超级用户

在终端环境下,$su

1.2. 参考以下命令创建新用户, 设置新建用户的密码,注意:只有设置了密码才能激活用户,否则无法以该用户身份登录

#useradd  (your name)

#passwd (your password)

1.3. 注销当前用户,并以新建的用户身份登录,登录后运行 $ whoami,并进行截图;

2.新建用户主目录下创建子目录:gdbdebug, 并进入gdbdebug 子目录。将过程和结果截图。

先切换到超级用户,然后使用mkdir命令在home/XuXianyuan_2015150147目录下创建gdbdebug子目录,再使用ls显示该目录下内容,黄色部分结果表示创建成功。

进入gdbdebug目录下:

进入成功。

3.使用vi编辑以下两个文件并编译和运行,截图

3.1.编辑reverse.h

最后在最后使用:wq保存并退出

在gdbdebug目录下使用ls命令:(黄色标注部分表示reverse.h文件创建成功。)

3.2.编辑reverse.c

3.3.按以下步骤编译,如有警告信息,请修改代码至无警告信息

$gcc –Wall reverse.c –o reverse:生成的所有警告信息如下图所示:

分析相应的警告信息:

第一条:隐式声明函数‘strlen’,很明显没有包含相应头文件,故只需在reverse.c中    添加头文件<string.h>即可。

第二条:格式 ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[1024]’,这个警告是说输入格式不对,将scanf(“%s”,&str)中的&去掉。

第三条:在有返回值的函数中,控制流程到达函数尾,这个警告的意思是函数声明存在返回值但是并未返回,将reverse函数返回声明为void,并且为main函数最后面添加return 0语句

(在linux下,main函数声明为void会产生警告如下图:)

所有警告处理完以后,结果截图如下图所示:

3.4.运行程序

$./reverse

此时发现输入的abcdefg,但是最终结果是aecdcba,结果是与预期结果gfedcba完全不同的。

4.按照以下过程调试并修正reverse.c,请参考过程截图。

4.1.   编译时加入调试信息

$gcc -g reverse.c -o reverse1

4.2.   启用GDB调试

使用file 命令,装入想要调试的可执行程序 reverse1;

4.3.   键入list,查看源代码并根据行号/函数名设置断点

断点设置总体如下:

接下来是运行:

4.4.   观察变量值,并作分析,推测错误

分析如下:

图中所标示的1,2,3分别表示经过断点以后,输入的字符串变化情况;

在第一步中,由于只是执行了c=*str+i,也就是说字符串不会发生变化,对比图片所给出的变化情况,可以得知这个结果是正确的,也就是说第一步不存在错误;

在第二步中,执行代码*(str+1)=*str+len-i-1,按照正常情况,字符串第一个字符应该被最后一个字符所替代,但结果却是第二个字符被最后一个字符替代,所以很可能在这里出错了;

在第三步中,执行c=*str+i;也即是最后一个字符串被变量c所指代的字符替代,由第一步,可以知道,最后一个结果应该是被第一个字符所替代,对比图片的结果,结果是正确的,也即是说该代码不存在错误;

4.5.   修正程序并运行

在上述步骤的分析中,有如下修改方案:将第二步中的*(str+1)=*str+len-i-1修改为*(str+i)=*str+len-i-1

修改完成后尝试运行reverse.c:

结果是:结果更加离谱-。-

没办法,接下来重新进入gdb调试:

4.6.   观察变量值,并作分析,推测错误

调试结果如下:

分析过程同4.4,这里直接给出最终分析结果:1-4步结果是符合实际的,而在第5步中,hbcdefga本应该是转化为hgcdefga,也即是倒数第二个赋值给第二个,但是结果却是hncdefga,这个n来的有点莫名其妙,但在仔细分析代码后发现,代码竟然是*(str+i)=*str+len-i-1,omg!后面的表达式竟然没加大括号!-.-

如果不加大括号后面的表达式的意思是*str=‘h’,然后len=8,i=1,就有‘h’+8-1-1----->‘n’,转化为字符‘n’;

恩,知道哪里错了以后,先在reverse.c相应位置加上大括号(截图如下)

然后再来运行一次。

4.7.   修正程序并运行

显然,实验结果是正确无误的。

至此,“计算机系统概论”这门课的第一次实验算是总体完成了,另外,在学习过程中难免会有疏漏,如果发现了本文中的某些错误,欢迎提出指正ヽ(???)?(???)?

时间: 2024-08-24 21:51:56

实验一:实验环境配置与使用的相关文章

OVS + dpdk 安装与实验环境配置

***DPDK datapath的OVS的安装与实验环境配置 首先肯定是DPDK的安装 0:安装必要的工具 make gcc libssl libcap-ng0 libtool autoconf python 2.7 python module six(可用PIP安装) 1:设置hugepages,host最好有4G以上的内存可用, 共搞1024个hugepage,每个page 2M,所以光hugepages就占用2G内存 $  grep Huge /proc/meminfo $ echo 10

传感器仿真平台——实验环境配置(四)

实验环境配置,最初的想法是这样: 要有一个类,专门管理各种各样的实验环境参数,如场地长.宽等,为了方便起见,可以在该类的构造函数中进行文件读取,将外部xml作为配置文件加载各类参数.这样的话,使用的时候就可以如下这么做: Config config = new Config();//这个是我说的环境配置管理类 var width = config.width; 但是对于框架来说,这个方法看似好用,实际上却很难做到,为什么?参数不确定呀,不同的实验有不同种类的参数,实验一的参数是长.宽.实验二的是

Ubuntu 18.04 实验环境配置

Ubuntu 18.04 实验环境配置 系统:Ubuntu 18.04 64bit 显卡:Nvidia GeForce 1080Ti 下载 CUDA.cuDNN.NVIDIA间存在某种关系,建议先确定要安装的CUDA版本. 注意:后续要安装的一些包不支持CUDA9.1. CUDA下载地址:https://developer.nvidia.com/cuda-toolkit-archive cuDNN下载地址:https://developer.nvidia.com/rdp/cudnn-archiv

20145225 《信息安全系统设计基础》实验一 开发环境的熟悉

写在前面:娄老师您好,上周四的实验由于机器不够,我后面和5202马超.5234黄斐一组了,忘记和您说了,还麻烦您做下登记,不好意思. 一.实验原理 交叉编译,就是在一个平台上生成另一个平台上的可执行代码.同一个体系结构可以运行不同的操作系统:同样,同一个操作系统也可以在不同的体系结构上运行.在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码. 二.实验内容与步骤 实验一: 连接arm开发板 将arm开发板电源线接好,保持开发板开关处于闭合状

20145216 20145330《信息安全系统设计基础》实验一 开发环境的熟悉

20145216 20145330<信息安全系统设计基础>实验一 开发环境的熟悉 实验报告封面 实验内容 1.连接arm开发板 2.建立超级终端 3.启动实验平台 4.修改 xp 系统与 redhat 虚拟机的 ip, 使得它们均与 arm 机的 ip 在同一网段 5.安装 arm 编译器 6.配置环境变量 7.建立 hello.c 文件并编译 8.下载调试 实验步骤 1.连接 arm 开发板 将 arm 开发板电源线接好,保持开发板开关处于闭合状态.再分别将串口线. 并口线和网线与 pc 机

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CCNA实验二 路由基本配置 &nbsp;

CCNA实验二 路由基本配置 环境: Windos XP ,GNS3.0.7   VPCS.exe 目的: 掌握路由的基本配置 步骤: 1.首先打开GNS创建一个工程,然后单击"编辑"选择"图标管理"进入操作"Available symbols"窗口中选择computer ,然后点击小于号">"添加到右的"Customized nodes" 窗口再在"name"中输入"c

&nbsp; &nbsp; &nbsp; &nbsp; CCNA实验三 把路由器配置成PC

CCNA实验三 把路由器配置成PC 环境:Windows XP, GNS3.0.7 步骤: 1. 首先打开GNS创建下面的拓扑:      分别右键查看R1 和PC的console端口:R1:2000 , PC:2002   2.首先Telnet到R1进行路由基本配置:在cmd命令行输入:telnet  127.0.0.1  2000登陆然后配置 查看R1所有端口信息: 3.Telnet到PC路由器,把它配置成PC在进入cmd命令行输入:telnet  127.0.0.1  2002登陆然后配置

实验十三 OSPF 基本配置

实验十三  OSPF 基本配置 [实验名称] OSPF 单区域基本配置. [实验目的] 掌握在路由器上配置 OSPF 单区域. [背景描述] 假设校园网通过 1 台三层交换机连到校园网出口路由器,路由器再和校园外的另 1 台 路由器连接,现做适当配置,实现校园网内部主机与校园网外部主机的相互通信. 本实验以两台路由器.1 台三层交换机为例.S3550 上划分有 VLAN10 和 VLAN50, 其中 VLAN10 用于连接 RA,VLAN50 用于连接校园网主机. [需求分析] 需要在路由器和交

实验用虚拟机环境初始化

实验用虚拟机环境初始化 1. 通过virt-viewer方式进入虚拟机, 配置对应的ip地址, 重启网络 2. 在宿主机中依次对每个虚拟机执行如下操作 tar -cf - init_vhost.sh | ssh node102 "tar -xf -; sh init_vhost.sh" init_vhost.sh内容如下: # hostname echo -e "\n 1. hostname" echo =========== sed -i -r 's/(HOSTN