用gdb调试有问题的程序:练习使用gcc编译器和gdb调试器

内容

1.用gdb调试有问题的程序:练习使用gcc编译器和gdb调试器;

2.练习使用make工程管理器。

实操流程:

1)编制greet.c文件。

此代码的原意为倒序输出main函数中定义的字符串,但结果显示没有输出。代码如下所示:

//greet.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

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

 

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

a)重新编辑greet.c,把其中的“string2[size - i] = string1[i]”改为“string2[size – i - 1] =string1[i];”即可。

之后,进去按照要求修改,之后再执行  . /greet  成功

运行倒序。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值