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

内容

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

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

实操流程:

1)编制greet.c文件。

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

//greet.c

#include

#include

#include

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,保存退出。

用gdb调试有问题的程序:练习使用gcc编译器和gdb调试器_第1张图片

之后,使用gcc命令,对greet.c文件进行编译

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

用gdb调试有问题的程序:练习使用gcc编译器和gdb调试器_第2张图片

        之后,运行了一下,就会发现这个程序的目的本来是让语句能够倒序输出,但是结果并没有,我们需要进行debug来看看到底是哪里出了问题。 

(打了gdb greet之后出现了介绍,我看到了著名的红帽 red hat)

用gdb调试有问题的程序:练习使用gcc编译器和gdb调试器_第3张图片用gdb调试有问题的程序:练习使用gcc编译器和gdb调试器_第4张图片

 之后是下断点,之后指导书上写的是 设在30

但是一直提示我,这个不太行,因为我的程序行数还没有到30,之后我vim进去数了一下我的for循环位置在哪里,发现是第24行,下移三行27是printf的位置。

之后执行了一下,看了一下运行过程。

用gdb调试有问题的程序:练习使用gcc编译器和gdb调试器_第5张图片

用gdb调试有问题的程序:练习使用gcc编译器和gdb调试器_第6张图片 

k)程序在printf前停止运行,此时依次查看string2[0]、string2[1]…,发现string[0]没有被正确赋值,而后面的复制都是正确的,这时,定位程序第31行,发现程序运行结果错误的原因在于“size-1”。由于i 只能增到“size-1”,这样string2[0]就永远不能被赋值而保持NULL,故输不出任何结果。

l)退出gdb,使用命令q。

接着,按照指导书要求退出gdb

用gdb调试有问题的程序:练习使用gcc编译器和gdb调试器_第7张图片

 

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

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

用gdb调试有问题的程序:练习使用gcc编译器和gdb调试器_第8张图片

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

运行倒序。

你可能感兴趣的:(linux,运维,服务器)