• 一起talk GDB吧(第五回:GDB查看信息)



    各位看官们。大家好,上一回中我们说的是GDB的调用栈调试功能,而且说了怎样使用GDB进行查看调用

    栈。这一回中,我们继续介绍GDB的调试功能:查看信息。当然了。我们也会介绍怎样使用GDB查看程序

    执行时的信息。闲话休提,言归正转。让我们一起talk GDB吧!


    看官们,我们在调试的时候须要查看程序中的相关信息。比方变量值。

    GDB提供了查看信息的功能,这些

    查看功能主要有:查看源码和变量值,跟踪变量。

    以下我们具体说说这些查看功能。


    查看源码:list 或者list n.list默认列出源码中前10的内容,它会从第一行開始显示程序源码,每次

    显示10行。假设再运行一次list命令,它会接着上一次的行数继续显示源码。list n表示显示10行源码。

    当中第n行位于这10行代码的中间。


    查看变量值:info(缩写为i)。样例:i locals表示查看程序执行时全部变量的值。info显示的是程序中全部变

    量的值。假设仅仅想看某个变量的值,那么使用命令:print(缩写为p)能够打印变个变量的值,样例:p iVal

    表示查看变量iVal的值。

    该功能常常和断点配合使用,假设想查看程序执行过程中某个变量的值,能够先让程

    序停止下来,然后再使用该功能查看变量的值。


    跟踪变量:display.样例:display index表示跟踪显示变量index的值。

    GDB提供的该功能能够看作是对查看

    变量功能的补充。由于使用p和i显示变量值时,仅仅会显示一次。而display能够一直显示变量的值。该功能可

    以用来在循环语句中显示循环中的索引值,循环每运行一次。它就能自己主动显示一次,不须要手动查看索引值。

    这对跟踪数组越界非常实用。假设不想跟踪变量变量了,使用undisply能够取消跟踪显示。

    样例undisply index

    表示不再跟踪显示变量index的值。


    古诗云:纸上得来终觉浅,绝知此事要躬行。我们举个样例来实践一下:

         1    #include<stdio.h>
         2    
         3    void exchange(int a, int b)
         4    {
         5        int s = 0;
         6    
         7        s = a;
         8        a = b;
         9        b = s;
        10    }
        11    
        12    int main()
        13    {
        14        int a,b,i;
        15        a = 3;
        16        b = 5;
        17        i = 0;
        18    
        19        printf("Before change a = %d,b = %d  
    ",a,b);
        20        exchange(a,b);
        21        printf("After change  a = %d,b = %d  
    ",a,b);
        22    
        23        while(i++ < 3)
        24            printf("i =%d 
    ",i);
        25    
        26        return 0;
        27    }
    
    


    1.编敲代码

    打开VIM。输入上面的程序。而且保存到m.c文件里

    2.编译程序。在终端中输入:gcc -g m.c -o s

    3.执行程序

    在终端中输入:./s ,得到下面执行结果:

    Before change a = 3,b = 5  

    After change  a = 3,b = 5  

    i =1

    i =2

    i =3

    通过结果我们能够看到,i的值打印没有问题。只是exchange函数的执行结果不对,a和b交换前后的

    值全然一样。看来程序存在逻辑问题,我们使用GDB进行调试。


    4.调试程序。在终端中输入:gdb s。

    (gdb) b exchange   //在函数exchange哪里设置位置断点

    Breakpoint 1 at 0x8048423: file m.c, line 5.

    (gdb) run          //启动调试,遇到断点会停止

    Starting program: xxx/test/s

    Before change a = 3,b = 5  


    Breakpoint 1, exchange (a=3, b=5) at m.c:5   //在断点处停止

    5        int s = 0;

    (gdb) n           //单步调试

    7        s = a;

    (gdb)             //输入回车,继续单步调试

    8         a = b;

    (gdb)             //输入回车,继续单步调试

    9        b = s;

    (gdb)             //输入回车,继续单步调试

    10    }

    (gdb) p a         //查看变量a的值

    $1 = 5

    (gdb) p b         //查看变量b的值

    $2 = 3


    通过调试的结果。大家能够看到在断点停止处哪里,a=3, b=5。到函数结束处我们通过p查看它们的值时

    已经发生交换。可是函数结束后。它们的值还没有交换。大家能知道什么原因吗?这个是C语言中典型的

    传值调用,学习过C语言的。肯定知道当中的原因。我就不多说了。


    接下来。我们再体会一下路径变量的功能。

    (gdb) display i //跟踪变量 i

    (gdb) n         //单步调试,  省略前面单步调试的结果

    i =1            //程序执行进显示变量的值

    23        while(i++ < 3)

    1: i = 1       //跟踪显示变量的值

    (gdb)          //输入回车,继续单步调试

    24            printf("i =%d ",i);

    1: i = 2        

    (gdb)         //输入回车,继续单步调试

    i =2

    23        while(i++ < 3)

    1: i = 2

    (gdb)         //输入回车,继续单步调试

    24            printf("i =%d ",i);

    1: i = 3

    (gdb)         //输入回车,继续单步调试

    i =3

    23        while(i++ < 3)

    1: i = 3

    (gdb)          //输入回车,继续单步调试

    26        return 0;


    大家从调试的结果中能够看到,每次执行单步调试都会显示i的值,并且路径显示的值和程序执行时打印出

    来的值一样。这便是跟踪变量的功能。


    我们通过样例说明了怎样使用GDB提供的查看信息功能。通过查看程序执行时的信息,能够方便地找出程序

    中的错误,希望大家可以灵活使用该功能,进而提高调试程序的效率。


    看官们,关于GDB的内容,今天咱们就讲到这里。

    欲知后事怎样。且听下回分解!



  • 相关阅读:
    如何实时抓取动态网页数据?
    产品经理面试——简历填写
    项目章程
    IDEA 必要配置
    项目章程
    基础知识02 零基础入门学习汇编语言02
    基础知识03 零基础入门学习汇编语言03
    进制转换教程
    基础知识04 零基础入门学习汇编语言04
    基础知识01 零基础入门学习汇编语言01
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6749656.html
Copyright © 2020-2023  润新知