文章目录
- 实验目标:
- 实验环境与工件
- 实验内容与步骤
- 实验步骤:
- 1.1.首先切换为超级用户
- 1.2.创建新用户, 设置新建用户的密码
- 1.3.注销当前用户,并以新建的用户身份登录
- 2.1创建子目录gdbdebug
- 2.2输入ls命令查看文件夹
- 2.3进入gdbdebug 子目录
- 2.4输入pwd命令查看当前用户所处工作目录
- 3.1.编辑reverse.h
- 3.2.编辑reverse.c
- 3.3.按以下步骤编译,如有警告信息,请修改代码至无警告信息
- 3.4.运行程序
- 4.1.编译时加入调试信息
- 4.2.启用GDB调试
- 4.3.键入list,查看源代码并根据行号/函数名设置断点(断点位置仅供参考,不需雷同)
- 4.4.观察变量值,并作分析,推测错误(过程仅供参考,不需雷同)
- 4.5.修正程序并运行
实验目标:
熟悉Linux上C程序的编译和调试工具,包括以下内容:
- 了解Linux操作系统及其常用命令
- 掌握编译工具gcc的基本用法
- 掌握使用gdb进行程序调试
实验环境与工件
1.个人电脑
2. Ubuntu 操作系统
3. gcc
4. gdb
实验内容与步骤
1.根据实验一:实验环境配置与使用.ppt 熟悉Linux基本操作(P.1 – P.28),然后根据以下过程创建用户:用户名为学生名称加学号,如吴坤汉,学号2015170297,则该用户名为wukunhan_2015170297。按照1.1~1.3完成并截图,截图需要有运行的命令及其结果。另外:后面的题目必须在该新建用户下完成。(30分)
实验步骤:
1.1.首先切换为超级用户
$su
这是运行命令及截图:
如果出现Authentication failure的情况,则可以用sudo passwd root
来给root重设密码:
1.2.创建新用户, 设置新建用户的密码
注意:只有设置了密码才能激活用户,否则无法以该用户身份登录
#adduserwukunhan_2015170297
写入命令 adduser chenxiaoyi_2020151034 , 创建新用户成功,并将密码设成123456:
1.3.注销当前用户,并以新建的用户身份登录
登录后运行 $ whoami,并进行截图:
2.新建用户主目录下创建子目录:gdbdebug, 并进入gdbdebug 子目录。将过程和结果截图。(10分)
2.1创建子目录gdbdebug
2.2输入ls命令查看文件夹
2.3进入gdbdebug 子目录
2.4输入pwd命令查看当前用户所处工作目录
3.使用vi编辑以下两个文件并编译和运行,截图(30分)
3.1.编辑reverse.h
①创建reverse.h文件:
输入vi reverse.h并运行
②编辑reverse.h
按“i”从光标当前位置开始输入文件,然后输入如下代码
输入完成后按“esc”结束输入,并键入“:wq”对代码进行保存:
3.2.编辑reverse.c
①创建并编写reverse.c,输入vi reverse.c并运行。
②编辑reverse.c
按“i”从光标当前位置开始输入文件,然后输入如下代码:
同上一步操作,进入末行模式,按“wq”退出存盘;
3.3.按以下步骤编译,如有警告信息,请修改代码至无警告信息
$gcc –Wall reverse.c –o reverse
出现警告信息如下:
因此,进去reverse.c修改代码:
增加头文件<string.h>;将reverse()函数的返回值改为void,因为该函数不需要返回任何数据;将scanf()函数后的取址符号删除,不需要对str取址。
修改后的代码如下:
写入命令$gcc –Wall reverse.c –o reverse,无警告信息:
3.4.运行程序
$./reverse
运行程序后输入“cccxyij”,虽然程序执行了,但输出是错误的,因此我们需要进行debug并对代码进行修改调试。
4.按照以下过程调试并修正reverse.c,请参考过程截图。(30分)
4.1.编译时加入调试信息
$gcc -g reverse.c -o reverse1
4.2.启用GDB调试
4.3.键入list,查看源代码并根据行号/函数名设置断点(断点位置仅供参考,不需雷同)
①输入list对代码进行查看:
②添加并查看断点:
根据自己的代码设置5个断点如下,完成断点添加后,可以输入info break对断点信息进行查看:
③开始调试:
输入run进行调试
4.4.观察变量值,并作分析,推测错误(过程仅供参考,不需雷同)
从程序运行间可以看到,当第一次对字符数组操作时,第一个“a”本应被替换成“d”却是第二个字符被替换成了“d”,通过分析代码可知,代码的本意应该是通过指针交换第一个与最后一个字符,而实际上却是发生了偏移,而且也不应该是1而是i。这是因为,每次的指针应该是*(str+i)而不是*str+i,在C语言运行时,将先执行指针符号,再执行加法,因此需将两处都加上括号。
4.5.修正程序并运行
修改后的程序:
运行结果如下:
四、实验结果
本次实验,通过使用vi编辑器编辑代码,再通过gcc对代码进行编译,发现了代码中的语法错误,并进行修改,成功编译了代码,最后通过gdb对代码进行调试,使用设置断点以及查看变量等方法,发现了代码中的逻辑错误,成功实现了reverse代码的实现。通过此代码,我们可以成功的将字符串进行反转。
如上图,程序运行无误,最后也输出了正确的结果。
五、实验总结与体会
编写C程序代码时要注意程序运行的优先级。本次实验中就是因为忽略了指针运算符(*)会在加法运算符(+)前执行导致程序错误。不过最后通过debug问题得到解决。
通过这次实验,我熟悉了Linux上C程序的编译和调试工具,了解了Linux操作系统及其常用命令,掌握了编译工具gcc的基本用法,也掌握了使用gdb进行程序调试。同时本次实验也让我重新回顾了c语言的知识,加深了对c语言的熟悉程度。
熟练掌握Linux系统上的操作是将来学习过程中的重要基础,这次实验使我对其有了基础的了解,在以后的学习过程中,我也会继续学习了解Linux系统,熟练掌握Linux系统的操作,提升自己的专业能力。