各位看官们。大家好,上一回中我们说的是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的内容,今天咱们就讲到这里。

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

一起talk GDB吧(第五回:GDB查看信息)的更多相关文章

  1. [转] 用GDB调试程序(五)

    转:http://blog.csdn.net/haoel/article/details/2883 查看运行时数据———————        在你调试程序时,当程序被停住时,你可以使用print命令 ...

  2. 用GDB调试程序(五)

    查看运行时数据———————        在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据.print命令的格式是:    ...

  3. 读书笔记之第五回深入浅出关键字---把new说透

    第五回深入浅出关键字---把new说透  ------你必须知道的.net读书笔记 new一个class时,new完成了以下两个方面的内容:一是调用newobj命令来为实例在托管堆中分配内存:二是调用 ...

  4. [skill][debug][gdb] 使用core dump 进行GDB

    core dump 扫盲:https://wiki.archlinux.org/index.php/Core_dump 1.  人为制作 core dump 1.1  实时在线生成core dump. ...

  5. Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件

    交叉编译gdb和gdbserver 1.下载gdb:下载地址为:http://ftp.gnu.org/gnu/gdb/按照一般的想法,最新版本越好,因此下载7.2这个版本.当然,凡事无绝对.我们以gd ...

  6. GDB调试系列之了解GDB

    想要熟练利用GDB进行程序调试,首先要了解什么是GDB. 1. 什么是GDB GDB (the GNU Project Debugger) 是一个可以运行在大多数常见的UNIX架构.Windows.M ...

  7. GDB学习之道:GDB调试精粹及使用实例

    一:列文件清单  1. List  (gdb) list line1,line2 二:执行程序  要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出 ...

  8. 我心中的核心组件(可插拔的AOP)~第十五回 我的日志组件Logger.Core(策略,模版方法,工厂,单例等模式的使用)

    回到目录 之前的讲过两篇关于日志组件的文章,分别是<第一回  日志记录组件之自主的Vlog>和<第三回  日志记录组件之log4net>,而今天主要说一下我自己开发的另一种日志 ...

  9. gdb常用命令及使用gdb调试多进程多线程程序

    一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...

随机推荐

  1. Largest Number——STL的深层理解

    Given a list of non negative integers, arrange them such that they form the largest number. For exam ...

  2. 魔法上网之Ubuntu部署“酸酸”

    “酸酸”,即s*h*a*d*o*w*s*o*c*k*s,用于魔法上网,用python写成. 在ubuntu环境下,用pip包管理工具可以非常方便地安装“酸酸”服务:ssserver. 先安装pip(假 ...

  3. react native项目增加devtools工具

    第一步:安装react devtools工具 在当前项目中打开命令行,添加react devtools工具,因为运行的工具有九十几M,下载时需要时间,请耐心等待 yarn add react-devt ...

  4. 单断言VS多断言

    STST 想和大家讨论一下,一个测试用例里只做一个断言还是一个用例里做多个相关的断言 比如有一个查询函数Query(id) 返回[姓名,性别,年龄] 那么是在一个测试用例里对这三个属性进行断言好? 还 ...

  5. Python开发基础-Day21多态与多态性、绑定方法和非绑定方法

    多态与多态性 多态 多态并不是一个新的知识 多态是指一类事物有多种形态,在类里就是指一个抽象类有多个子类,因而多态的概念依赖于继承 举个栗子:动物有多种形态,人.狗.猫.猪等,python的序列数据类 ...

  6. Linux基础系列-Day8

    Shell编程基础 Shell介绍 Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器).它类似于windows下的的cmd.exe.它接收用户命令,然后调用相应的应用程序 ...

  7. [BZOJ4859][BJOI2017]机动训练(DP)

    4859: [BeiJing2017]机动训练 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 105  Solved: 63[Submit][Stat ...

  8. 【区间dp】【记忆化搜索】UVALive - 3516 - Exploring Pyramids

    f(i,j)=sum(f(i+1,k-1)*f(k,j) | i+2<=k<=j,Si=Sk=Sj). f(i+1,k-1)是划分出第一颗子树,f(k,j)是划分出剩下的子树. #incl ...

  9. 【数论】【Polya定理】poj1286 Necklace of Beads

    Polya定理:设G={π1,π2,π3........πn}是X={a1,a2,a3.......an}上一个置换群,用m中颜色对X中的元素进行涂色,那么不同的涂色方案数为:1/|G|*(mC(π1 ...

  10. bootstrap学习(全局CSS样式)(二)

    标题类:.h1到.h6 页面主体 bootstrap将全局font-size设置为14px,line-height设置为1.428,这些属性 直接赋予元素和所有段落元素. 文本对齐类 text-lef ...