zoukankan      html  css  js  c++  java
  • 一起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的内容,今天咱们就讲到这里。

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



  • 相关阅读:
    linux权限补充:rwt rwT rws rwS 特殊权限
    关于Linux操作系统下文件特殊权限的解释
    Java学习笔记——Java程序运行超时后退出或进行其他操作的实现
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 判断名次
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 日期计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 概率计算
    Java实现 蓝桥杯 算法提高 复数四则运算
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6749656.html
Copyright © 2011-2022 走看看