gdb调试(二)

继续研究gdb相关的调试技巧,话不多说进入正题:

查看运行时数据:
这个上节中已经用过了,这里就不多说了,比较简单
还是有上节中的simple.c例子,不过得稍微做一些修改为了使用这些命令:
simple.c:
#include <stdio.h>
#include <stdlib.h>

long func(int n);

int main(int argc, char *argv[])
{
    int i;
    int x =5;
    double z = 2.5;
    char ch = 'q';

    int arr1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int *arr2 = (int *)malloc(sizeof(int) * 10);
    for (i=0; i<10; ++i)
    {
        arr2[i] = i;
    }

    printf("Entering main ...\n");
    for (i=0; i<argc; ++i)
    {
        printf("%s ", argv[i]);
    }
    printf("\n");
    long result = 0;
    for (i=1; i<=100; ++i)
    {
        result += i;
    }
    printf("result[1-100] = %ld\n", result);
    printf("result[1-10] = %ld\n", func(10));

    printf("Exiting main ...\n");
    return 0;
}

long func(int n)
{
    long sum = 0;
    int i;
    for (i=1; i<=n; ++i)
    {
        sum += i;
    }

    return sum;
}

 
【注意】:打印数组的首地址需要带&才行:
 
 
那对于静态数组是否也可以通过这种方式来查看呢?
 
 
 
 
 
程序错误:
gdb调试逻辑错误:
下面有一段有问题的代码,实现的功能是:实现逆序输出字符串hello,但是却没有任何输出,程序如下:
reverse.c:
#include <stdio.h>

int main(void)
{
    int i;
    char str[6] = "hello";
    char reverse_str[6] = "";

    printf("%s\n", str);
    for (i=0; i<5; i++)
        reverse_str[5-i] = str[i];
    printf("%s\n", reverse_str);
    return 0;
}

先编译运行看下结果:

下面来通过gdb来调试一下该错误:

所以此时问题的原因就被定位了,应该将o放到第一位,目前是放到第二位,然后整体的字符都回退一格,最终应该输出是这样:“olleh\000”,于是程序改装一下:

这时再编译运行:

gdb调试段错误:
下面来看下程序:
第一种情况是使用了0地址:
编译运行:
 
下面来跟踪一下这个问题,在跟踪之前来想一个问题,就是在实际项目中可能代码多较多,那如果出现段错误怎么来定位呢?实际上直接调试运行,当发现有段错误时,则会收到有一个段错误信号,并且告诉你在哪一行,所以,这就比较容易找段错误问题了:
这时可以查看栈回溯:
 
第二种情况是访问了越界的内存:
编译运行:
 
同样来调试一下:
但是对于数组越界这个错误,并不是马上就报错,如下:
编译运行:
所以,对于这种情况就比较难调试了,所以对于数组越界,在实际代码编写中一定得避免这种情况~
core文件调试:
 
默认情况下是不会产生core文件的,我们可以查看一下:
 
下面对其进行设计,我们可以设置大小不受限:
 
下面我们还是以这个程序进行生成core dump调试文件:
下面编译运行:
生成了core文件之后,下面就可以用gdb对其进行调试了。
 
 
好了,关于gdb的内容就学到这,有了它,以后调试程序就方便了~
 

posted on 2014-08-10 21:55  cexo  阅读(309)  评论(0编辑  收藏  举报

导航