本文共 1838 字,大约阅读时间需要 6 分钟。
通过调试一个有问题的程序,使读者进一步熟练使用Vi 操作,而且熟练掌握Gcc 编译命令及Gdb 的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。这是一个很小的程序,只有35 行,希望读者能够认真调试。 (1)使用Vi 编辑器,将以下代码输入到名为greet.c 的文件中。此代码的原意为输出倒序main函数中定义的字符串,但其结果显示没有输出。代码如下所示: int display1(char *string); int display2(char *string); char string[] = "Embedded Linux"; int display1 (char *string) printf ("The original string is %s \n", string); int display2 (char *string1) string2 = (char *) malloc (size + 1); for (i = 0; i < size; i++) string2[size - i] = string1; printf("The string afterward is %s\n",string2); (2)使用Gcc编译这段代码,注意要加上“-g”选项方便之后的调试。 (4)使用Gdb调试程序,通过设置断点、单步跟踪,一步步找出错误所在。 (1)在工作目录上新建文件greet.c,并用Vi 启动:vi greet.c。 (4)用Gcc进行编译:gcc -g greet.c -o greet。 The original string is Embedded Linux (8)在30 行(for 循环处)设置断点,使用命令“b 30”。 (9)在33 行(printf函数处)设置断点,使用命令“b 33”。 (10)查看断点处设置情况,使用命令“info b”。 (13)查看暂停点变量值,使用命令“p string2[size - i]”。 (14)继续单步运行代码数次,并使用命令查看,发现string2[size-1]的值正确。 (16)程序在printf前停止运行,此时依次查看string2[0]、string2[1]…,发现string[0]并没有被正确赋值,而后面的复制都是正确的,这时,定位程序第31行,发现程序运行结果错误的原因在于“size-1”。由于i 只能增到“size-1”,这样string2[0]就永远不能被赋值而保持NULL,故输不出任何结果。 (18)重新编辑greet.c,把其中的“string2[size - i] = string1”改为“string2[size – i - 1] =string1;”即可。 (19)使用Gcc重新编译:gcc -g greet.c -o greet。 The original string is Embedded Linux The string afterward is xuniL deddedbmE 将原来有错的程序经过Gdb调试,找出问题所在,并修改源代码,输出正确的倒序显示字符串的结果。 本文转载于,【Linux基础】用Gdb调试有问题的程序 (出处: )