Linux下C编程基础之:实验内容
3.7 实验内容
3.7.1 vi使用练习
1.实验目的
通过指定指令的vi操作练习,使读者能够熟练使用vi中的常见操作,并且熟悉vi的3种模式,如果读者能够熟练掌握实验内容中所要求的内容,则表明对vi的操作已经很熟练了。
2.实验内容
(1)在"/root"目录下建一个名为"vi"的目录。
(2)进入"vi"目录。
(3)将文件"/etc/inittab"复制到"vi"目录下。
(4)使用vi打开"vi"目录下的inittab。
(5)设定行号,指出设定initdefault(类似于"id:5:initdefault")的所在行号。
(6)将光标移到该行。
(7)复制该行内容。
(8)将光标移到最后一行行首。
(9)粘贴复制行的内容。
(10)撤消第9步的动作。
(11)将光标移动到最后一行的行尾。
(12)粘贴复制行的内容。
(13)光标移到"si::sysinit:/etc/rc.d/rc.sysinit"。
(14)删除该行。
(15)存盘但不退出。
(16)将光标移到首行。
(17)插入模式下输入"Hello,this is vi world!"。
(18)返回命令行模式。
(19)向下查找字符串"0:wait"。
(20)再向上查找字符串"halt"。
(21)强制退出vi,不存盘。
分别指出每个命令处于何种模式下?
3.实验步骤
(1)mkdir /root/vi
(2)cd /root/vi
(3)cp /etc/inittab ./
(4)vi ./inittab
(5):set nu(底行模式)
(6)17<enter>(命令行模式)
(7)yy
(8)G
(9)p
(10)u
(11)$
(12)p
(13)21G
(14)dd
(15):w(底行模式)
(16)1G
(17)i 并输入"Hello,this is vi world!"(插入模式)
(18)Esc
(19)/0:wait(命令行模式)
(20)?halt
(21):q!(底行模式)
4.实验结果
该实验的最终结果是对"/root/inittab"增加了一行复制的内容:"id:5:initdefault"。
3.7.2 用gdb调试程序的bug
1.实验目的
通过调试一个有问题的程序,使读者进一步熟练使用vi操作,而且熟练掌握gcc编译命令及gdb的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。这是一个很小的程序,只有35行,希望读者认真调试。
2.实验内容
(1)使用vi编辑器,将以下代码输入到名为greet.c的文件中。此代码的原意为输出倒序main函数中定义的字符串,但结果显示没有输出。代码如下所示:
#include <stdio.h>
int display1(char *string);
int display2(char *string);
int main ()
{
char string[] = "Embedded Linux";
display1 (string);
display2 (string);
}
int display1 (char *string)
{
printf ("The original string is %s \n", string);
}
int display2 (char *string1)
{
char *string2;
int size,i;
size = strlen (string1);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
{
string2[size - i] = string1[i];
}
string2[size+1] = ' ';
printf("The string afterward is %s\n",string2);
}
(2)使用gcc编译这段代码,注意要加上"-g"选项以方便之后的调试。
(3)运行生成的可执行文件,观察运行结果。
(4)使用gdb调试程序,通过设置断点、单步跟踪,一步步找出错误所在。
(5)纠正错误,更改源程序并得到正确的结果。
3.实验步骤
(1)在工作目录上新建文件greet.c,并用vi启动:vi greet.c。
(2)在vi中输入以上代码。
(3)在vi中保存并退出,使用命令":wq"。
(4)用gcc编译:gcc -g greet.c -o greet。
(5)运行greet,使用命令"./greet",输出为:
The original string is Embedded Linux
The string afterward is
可见,该程序没有能够倒序输出。
(6)启动gdb调试:gdb greet。
(7)查看源代码,使用命令"l"。
(8)在30行(for循环处)设置断点,使用命令"b 30"。
(9)在33行(printf函数处)设置断点,使用命令"b 33"。
(10)查看断点设置情况,使用命令"info b"。
(11)运行代码,使用命令"r"。
(12)单步运行代码,使用命令"n"。
(13)查看暂停点变量值,使用命令"p string2[size - i]"。
(14)继续单步运行代码数次,并检查string2[size-1]的值是否正确。
(15)继续程序的运行,使用命令"c"。
(16)程序在printf前停止运行,此时依次查看string2[0]、string2[1]…,发现string[0]没有被正确赋值,而后面的赋值都是正确的,这时,定位程序第31行,发现程序运行结果错误的原因在于"size-1"。由于i只能增到"size-1",这样string2[0]就永远不能被赋值而保持NULL,故不能输出任何结果。
- Linux下C编程基础之:常用编辑器(08-13)
- Linux下C编程基础之:gcc编译器(08-13)
- Linux下C编程基础之:gdb调试器(08-13)
- Linux下C编程基础之:make工程管理器(08-13)
- Linux下C编程基础之:使用autotools(08-13)
- Linux下C编程基础之:本章小结与思考与练习(08-13)