zoukankan      html  css  js  c++  java
  • 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 ...
    ");
        for (i=0; i<argc; ++i)
        {
            printf("%s ", argv[i]);
        }
        printf("
    ");
        long result = 0;
        for (i=1; i<=100; ++i)
        {
            result += i;
        }
        printf("result[1-100] = %ld
    ", result);
        printf("result[1-10] = %ld
    ", func(10));
    
        printf("Exiting main ...
    ");
        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
    ", str);
        for (i=0; i<5; i++)
            reverse_str[5-i] = str[i];
        printf("%s
    ", reverse_str);
        return 0;
    }

    先编译运行看下结果:

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

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

    这时再编译运行:

    gdb调试段错误:
    下面来看下程序:
    第一种情况是使用了0地址:
    编译运行:
     
    下面来跟踪一下这个问题,在跟踪之前来想一个问题,就是在实际项目中可能代码多较多,那如果出现段错误怎么来定位呢?实际上直接调试运行,当发现有段错误时,则会收到有一个段错误信号,并且告诉你在哪一行,所以,这就比较容易找段错误问题了:
    这时可以查看栈回溯:
     
    第二种情况是访问了越界的内存:
    编译运行:
     
    同样来调试一下:
    但是对于数组越界这个错误,并不是马上就报错,如下:
    编译运行:
    所以,对于这种情况就比较难调试了,所以对于数组越界,在实际代码编写中一定得避免这种情况~
    core文件调试:
     
    默认情况下是不会产生core文件的,我们可以查看一下:
     
    下面对其进行设计,我们可以设置大小不受限:
     
    下面我们还是以这个程序进行生成core dump调试文件:
    下面编译运行:
    生成了core文件之后,下面就可以用gdb对其进行调试了。
     
     
    好了,关于gdb的内容就学到这,有了它,以后调试程序就方便了~
     
  • 相关阅读:
    Java 分布式系统 实现session共享
    MySQL 大数据量使用limit分页,随着页码的增大,查询效率越低下。
    Linux下安装Zookeeper
    Mysql Window 下安装
    Spring Boot 教程demo
    全文搜索引擎 Elasticsearch (三)logstash-input-jdbc同步数据 到elasticsearch
    全文搜索引擎 Elasticsearch (二) 使用场景
    67.基于nested object实现博客与评论嵌套关系
    66.基于共享锁和排他锁实现悲观锁并发控制
    65.基于document锁实现悲观锁并发控制
  • 原文地址:https://www.cnblogs.com/webor2006/p/3903469.html
Copyright © 2011-2022 走看看