GDB 调试工具的使用

【实验内容】
将原来有错的程序经过 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式Dora

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值