一、 实验目标
熟悉Linux上C程序的编译和调试工具,包括以下内容:
1. 了解Linux操作系统及其常用命令
2. 掌握编译工具gcc的基本用法
3. 掌握使用gdb进行程序调试
二、实验环境与工件
1.个人电脑
2. Fedora 13 Linux 操作系统
3. gcc
4. gdb
三、实验内容与步骤
- 根据实验一:实验环境配置与使用.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 参考以下命令创建新用户, 设置新建用户的密码,注意:只有设置了密码才能激活用户,否则无法以该用户身份登录
#adduser wukunhan_2015170297
1.3 注销当前用户,并以新建的用户身份登录,登录后运行 $ whoami,并进行截图;
2. 新建用户主目录下创建子目录:gdbdebug, 并进入gdbdebug 子目录。将过程和结果截图。(10分)
输入sudo mkdir gdbdebug,发现权限不足
输入su获取root权限,再次输入sudo mkdir gdbdebug后,用ls查看文件发现成功创建。
输入cd gdbdebug进入文件夹
3. 使用vi编辑以下两个文件并编译和运行,截图(30分)
3.1编辑reverse.h
创建并进入reverse.h
进行函数声明
按ESC退出编辑模式,并输入:wq保存退出
3.2 编辑reverse.c
创建并进入reverse.c文件
输入代码
保存退出
3.3 按以下步骤编译,如有警告信息,请修改代码至无警告信息
$gcc –Wall reverse.c –o reverse
输入gcc -Wall reverse.c -o reverse,发现末尾提示权限不够
输入su获取root权限后再次输入gcc -Wall reverse.c -o reverse,发现编译成功。
分析警告信息,发现有如下错误:
-
- 使用strlen函数未添加头文件<string.h>。
- scanf输入的格式不应该为char*型,应该去掉&。
- reverse函数没有返回值。应该添加return 1; 。
修改代码
再次编译发现已无警告信息
3.4 运行程序
$./reverse
输入1234,发现输出不是4321,仍然需要debug
4. 按照以下过程调试并修正reverse.c,请参考过程截图。(30分)
4.1 编译时加入调试信息
$gcc -g reverse.c -o reverse1
4.2 启用GDB调试
由于在windows的linux子系统中进行gdb调试时一直报错如下。
多次尝试无果后,决定换用VMware虚拟机的Ubuntu系统继续进行实验
4.3 键入list,查看源代码并根据行号/函数名设置断点(断点位置仅供参考,不需雷同)
4.4 观察变量值,并作分析,推测错误(过程仅供参考,不需雷同)
可以看出断点第15行有错误,因为最先改变的应该是第一个字符q,而不是第二个字符w。分析后发现*(str+1)应该改为*(str+i)。而且字符t并不存在于原始字符串中,说明该字符进行了加减位,分析发现*str+len-i-1应该改为*(str+len-i-1)。
同样可以看出断点第14也有加减位操作,因为第二轮操作中第二个字符从t变成了s,s同样不存在于原始字符串中,而s是变量c的值,所以c的赋值部分出错,分析后将第14行改为c=*(str+i); 。
输入q退出gdb调试并进入reverse.c修改
4.5 修正程序并运行
修改reverse.c
重新编译后运行程序,发现结果正确。
四、实验结果
通过vim编辑器和gdb调试,成功的进行debug并运行了reverse.c程序。
五、实验总结与体会
本次实验的实验内容虽然较为简单,但是完成实验配置的过程中缺出现了不少麻烦,耗费了大量的时间和精力。
起初我是在windows的linux子系统上进行实验的,前面本来都非常顺利,直到进行gdb调试时,添加断点后报错并且程序无法运行,查阅了各种资料并进行了大量尝试后仍然无果,个人怀疑是windows和linux系统不兼容的缘故,导致在运行像gdb这种较低层的程序极易出现错误。
最终不得已放弃在子系统上进行实验,转而在VMware的Ubuntu系统上进行实验。虽然中途也遇到各种问题,例如VMware安装后无法正常打开Unbutu并报错等等。尝试了各种VMware和Ubuntu的版本后以及各种解决方案后,万幸最终完成了实验。
通过本次实验,我学会了大量的linux指令例如vim,sudo等等,也了解怎么创建文件,编译文件,运行文件,调试文件。
(by 归忆)