GDB 调试工具的使用

2017.5.12

【实验内容】

将原来有错的程序经过 gdb 调试,找出问题所在,并修改源代码,输出正确的倒序显示字符串的结果。

【实验目的】

通过调试一个有问题的程序,使读者进一步熟练使用 vi 操作,熟练使用 gcc 编译命令及 gdb 的调是命 令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。这是一个很小的程序,只有 35 行,希望读者认真调试。用 Gdb 调试有问题的程序

【实验平台】

带有 Linux 操作系统的 PC 机。

【实验步骤】

1、 使用 vi 编辑器,将以下代码输入到名为 greet.c 的文件中。此代码的原意为输出倒序输出 main 函数中定义的字符串,但结果显示没有输出。

2、使用 gcc 编译这段代码,gcc –g greet.c –o greet,注意要加上‘-g’选项以方便之后的调试。

3、运行生成的可执行文件./greet,观察运行结果。

4、使用 gdb 调试程序,通过设置断点、单步跟踪,一步步找出错误所在。

5、纠正错误,更改源程序并得到正确的结果。

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,得到结果正确


Tags:
Stats:
36 comments
16 views