设为首页 收藏本站
查看: 1098|回复: 0

[经验分享] 一起talk GDB吧(第五回:GDB查看信息)

[复制链接]

尚未签到

发表于 2017-7-4 12:33:05 | 显示全部楼层 |阅读模式
  


  各位看官们。大家好,上一回中我们说的是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  \n",a,b);
20        exchange(a,b);
21        printf("After change  a = %d,b = %d  \n",a,b);
22   
23        while(i++ < 3)
24            printf("i =%d \n",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 \n",i);
  1: i = 2        
  (gdb)         
//输入回车,继续单步调试
  i =2
  23        while(i++ < 3)
  1: i = 2
  (gdb)         
//输入回车,继续单步调试
  24            printf("i =%d \n",i);
  1: i = 3
  (gdb)         //输入回车,继续单步调试

  i =3
  23        while(i++ < 3)
  1: i = 3
  (gdb)          //输入回车,继续单步调试
  26        return 0;
  


  大家从调试的结果中能够看到,每次执行单步调试都会显示i的值,并且路径显示的值和程序执行时打印出
  来的值一样。这便是跟踪变量的功能。
  


  我们通过样例说明了怎样使用GDB提供的查看信息功能。通过查看程序执行时的信息,能够方便地找出程序
  中的错误,希望大家可以灵活使用该功能,进而提高调试程序的效率。
  


  看官们,关于GDB的内容,今天咱们就讲到这里。
  欲知后事怎样。且听下回分解!
  


  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-390723-1-1.html 上篇帖子: 47. Permutations II ? 下篇帖子: spring boot整合RabbitMQ(Topic模式)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表