1.用gdb调试有问题的程序:练习使用gcc编译器和gdb调试器;
2.练习使用make工程管理器。
实操流程:
此代码的原意为倒序输出main函数中定义的字符串,但结果显示没有输出。代码如下所示:
//greet.c #include #include #include 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); } |
为了达到这项要求,我首先要建立一个文件夹储存这个C代码,当做存储位置。
文件夹名称为test,之后创建了greet.c文件
基本操作流程,复制代码,选择黏贴到终端,
退出.c文件流程,
1.先按esc键,退出插入模式。
2.之后,按住shift和:键,输入wq,保存退出。
之后,使用gcc命令,对greet.c文件进行编译
./greet,运行生成的可执行文件,观察运行结果。
之后,运行了一下,就会发现这个程序的目的本来是让语句能够倒序输出,但是结果并没有,我们需要进行debug来看看到底是哪里出了问题。
(打了gdb greet之后出现了介绍,我看到了著名的红帽 red hat)
之后是下断点,之后指导书上写的是 设在30
但是一直提示我,这个不太行,因为我的程序行数还没有到30,之后我vim进去数了一下我的for循环位置在哪里,发现是第24行,下移三行27是printf的位置。
之后执行了一下,看了一下运行过程。
k)程序在printf前停止运行,此时依次查看string2[0]、string2[1]…,发现string[0]没有被正确赋值,而后面的复制都是正确的,这时,定位程序第31行,发现程序运行结果错误的原因在于“size-1”。由于i 只能增到“size-1”,这样string2[0]就永远不能被赋值而保持NULL,故输不出任何结果。
l)退出gdb,使用命令q。
接着,按照指导书要求退出gdb
a)重新编辑greet.c,把其中的“string2[size - i] = string1[i]”改为“string2[size – i - 1] =string1[i];”即可。
之后,进去按照要求修改,之后再执行 . /greet 成功
运行倒序。