【实验内容】
将原来有错的程序经过 gdb 调试,找出问题所在,并修改源代码,输出正确的倒序显示字符串的结果。
【实验目的】
通过调试一个有问题的程序,使读者进一步熟练使用 vi 操作,熟练使用 gcc 编译命令及 gdb 的调是命
令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。这是一个很小的程序,只有
35 行,希望读者认真调试。用 Gdb 调试有问题的程序
【实验平台】
带有 Linux 操作系统的 PC 机。
【实验步骤】
1、 使用 vi 编辑器,将以下代码输入到名为 greet.c 的文件中。此代码的原意为输出倒序输出 main 函
数中定义的字符串,但结果显示没有输出。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int display1(char *string);
int display2(char *string);
int main (int argc,char **argv)
{
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);
Linux 系统实验手册
2
for (i = 0; i < size; i++)
string2[size - i] = string1[i];
string2[size+1] = ' ';
printf("The string afterward is %s\n",string2);
free(string2);
}
2、使用 gcc 编译这段代码,gcc –g greet.c –o greet,注意要加上‘-g’选项以方便之后的调试。
3、运行生成的可执行文件./greet,观察运行结果。
4、使用 gdb 调试程序,通过设置断点、单步跟踪,一步步找出错误所在。
5、纠正错误,更改源程序并得到正确的结果。
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-i’。由于 i
只能增到‘size-i’,这样 string2[0]就永远不能被赋值而保持 NULL,故输不出任何结果。
17、退出 gdb,使用命令 q
18、重新编辑 greet.c,把其中的“string2[size - i] = string1[i]”改为“string2[size – i - 1] = string1[i];”
即可
19、使用 gcc 重新编译:gcc –g greet.c –o greet
20、查看运行结果:./greet,得到结果正确
The original string is Embedded Linux
The string afterward is xuniL deddedbmE