zoukankan      html  css  js  c++  java
  • gdb调试(一)

    对于gdb是什么,这里就不多说了,只要是程序员一般都听说过,像java开发会用到集成开发工具eclipse,里面调试起来非常方便,全是可视化的,但是如果在linux下编写的c程序,用可视化的调试就没这么方便了,这时就得用gdb了,当程序比较大时,在开发肯定会出现很多bug,对于怎么调试这些bug就显得非常重要了,所以下面来详细的学习这一调试工具,进入正题:

    gdb功能:
     
    下面来调试一个简单例子来对gdb有个感性的认识,之后再一一来学习:
    先来编译运行一下该程序:
    【注意】:用gdb调试时,需要加上-g参数,以便生成调试信息。
     下面开启调试一下:
    下面来查看一下源代码:list
    也可以用l缩写:
    【注意】:在gdb中所有的命令都可以用首字母进行缩写。
     以上查看源代码敲一个命令只能查看到一部分,所以要想查看剩余的代码,直接敲回车键既可:
    下面来给代码打断点:
    给某一行代码打断点:
    给一个函数打断点:
    那怎么查看指定行的代码断呢?
    接下来,咱们运行调试,目前打了两个段点,一个是10行,一个是24行,运行时应该就会停在断点处:
    下面单步执行:
    如果想查看一下某变量的值可以这样:
    如果想跳出一个循环,可以敲入如下命令:
    如果想执行运行到下一个断点处,可以这样做:
    下面接着运行,如果想退出函数返回到主干继续执行的话,可以这样:
    下面继续运行则程序就结束了:
     
    通过这个例子,就能感性地认识到gdb的调试流程了。下面则来详细的一一进行介绍:
    运行程序:
    这个比较简单,在上个实验中已经看到了,就是运行gdb调试
    在运行gdb调试时,可以传一些参数,先修改一下原程序,为了看到其效果:
    simple:c:
    #include <stdio.h>
    #include <stdlib.h>
    
    long func(int n);
    
    int main(int argc, char *argv[])
    {
        printf("Entering main ...
    ");
        int i;
        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;
    }

    这时编译并运行看下效果,这次不用gcc单独来敲了,而直接用make,因为已经编写好了Makefile:

    查看源码:
    下面为了更好看到效果,用一个多文件的程序来进行说明:
    main.c:
    #include <stdio.h>
    #include "search.h"
    
    int main(int argc, char *argv[])
    {
        printf("Entering main ...
    ");
        int i;
        for (i=0; i<argc; i++)
        {
            printf("%s ",argv[i]);
        }
        printf("
    ");
        int a[10] = {1, 3, 8, 9, 8, 3, 8, 6, 9, 2};
        int key = 8;
        int pos;
        int count = 0;
        
        pos = 0;
        while ((pos=seq_search(a, pos, 10, key)) != -1)
        {
            count++;
            pos++;
        }
    
        printf("%d occurs %d times in the list
    ", key, count);
        printf("Exiting main ...
    ");
        return 0;
    }
    search.h:
    #ifndef _SEARCH_H_
    #define _SERACH_H_
    
    int seq_search(int list[], int start, int n, int key);
    
    #endif // _SERACH_H_
    search.c:
    #include "search.h"
    
    int seq_search(int list[], int start, int n, int key)
    {
        int i;
        for (i=start; i<n; ++i)
        {
            if (list[i] == key)
                return i;
        }
    
        return -1;
    }

    其中main.c中的seq_search函数的实现是在search.c文件中。

     
    如果代码查看了,那怎么重新查看呢?
     
     
     
     如果我想查看seq_search函数的原代码,由于它在search.c文件中,那就可以利用这种方式查看:
    如果有多个文件中有seq_search同名的函数,那可以跟上文件名:
    设置断点与观察点:
     
     
     
     
    下面以第一个例子来说明:
     
     
     
     
    下面从新开始打断点,为了好说明:
     
     
    下面请瞪大眼睛看:
     
    这个就不用多说了,比较容易理解。 
     
     
    单步调试:
    这个已经在上面实验中使用过了,在实际开发中也经常用,这里就不多说了。
     
     
     
     
     
     
    这个上面已经使用到了,这里就不演示了
     
     
     
    最后再来总结一下gdb调试的命令:
    关于gdb的学习先学到这,纯操作,没有什么难点,但实际工作中应该都会用到,需好好操练下,下节见~
  • 相关阅读:
    oracle数据库创建表
    CMD下常用文件操作指令
    C#中int、long、float、double、decimal最大值最小值
    EF框架一对多 多对多关系总结
    如何用vue做网站,如何学习vue?--写两个经典的项目,算是入手
    swiper的使用方法,以及各种JS插件的使用通用技巧
    HTML快速布局技巧!编程的流程控制语句有三种,HTML又如何编写布局呢?
    CSS的移动端适配原理(一)-----屏幕是如何工作的(发光点原理),PC和手机的屏幕是如何渲染图片和文字
    JS语法糖总结----JS语法糖大全----一直更新
    PHPcms 客户定制的连表查询和结果排序的记录----2018-1-29 14:06
  • 原文地址:https://www.cnblogs.com/webor2006/p/3893336.html
Copyright © 2011-2022 走看看