用GDB调试程序

概述:

GDB概述
————

1
简介

  GDB是UNIX下庞大的调治将养工具,假若在UNIX下调试C/C++程序,GDB会比IDE的调整工具更加好使。

GDB是GNU开源公司发布的三个精锐的UNIX下的程序调节和测量检验工具。只怕,各位比较欣赏这种图形分界面方式的,像VC、BCB等IDE的调治,但一旦你是在UNIX平台下做软件,你会意识GDB这一个调试工具备比VC、BCB的图形化调节和测量试验器更加强硬的意义。所谓“寸有所长,尺有所短”就是其一道理。

2
生成调试消息

  要调解C/C++的顺序,首先在编写翻译时,我们无法不要把调节和测验信息加到可实施文件中。使用编写翻译器(cc/gcc/g++)的
-g 参数能够做到这点。如:

诚如的话,GDB主要扶助你实现下边八个方面包车型客车效果与利益:

3 启动GDB
的方法

  若无-g,你将看不见程序的函数名、变量名,所代替的全部都是运维时的内部存款和储蓄器地址。当您用-g把调节和测量检验消息参与之后,并打响编写翻译指标代码未来,让大家来探问如何用gdb来调整他。

1、运转你的主次,能够服从你的自定义的须求自由的运作程序。
2、可让被调和的前后相继在你所钦赐的调置的断点处停住。(断点能够是基准表明式)
3、当程序被停住时,可以检查此时你的先后中所发生的事。
4、动态的改动您程序的实践情况。

4
程序运维上下文

 

从上面看来,GDB和一般的调和工具未有怎么两样,基本上也是产生这个效应,不过在细节上,你会意识GDB这一个调节和测量试验工具的强大,大家大概比较习贯了图形化的调解工具,但一时候,命令行的调解工具却持有图形化工具所不可能成就的效率。让我们各类看来。

    4.1
程序运维参数

启动gdb

三个调理示例
——————

    4.2
专门的学业目录

  运营GDB的法子有以下三种:

源程序:tst.c

    4.3
程序的输入输出

    1、gdb
<program> 
       program也正是你的实施文书,一般在自然目录下。如若您须求带
argv[] ,则需求选用 -args

1 #include <stdio.h>
2
3 int func(int n)
4 {
5 int sum=0,i;
6 for(i=0; i<n; i++)
7 {
8 sum+=i;
9 }
10 return sum;
11 }
12
13
14 main()
15 {
16 int i;
17 long result = 0;
18 for(i=1; i<=100; i++)
19 {
20 result += i;
21 }
22
23 printf(“result[1-100] = %d \n”, result );
24 printf(“result[1-250] = %d \n”, func(250) );
25 }

5
设置断点

    2、gdb
<program> core
       用gdb同不经常间调节和测量试验四个运维程序和core文件,core是前后相继不合规试行后core
dump后发生的文本。

编写翻译生成施行文书:(Linux下)
hchen/test> cc -g tst.c -o tst

    5.1
轻松断点

    3、gdb
<program> <PID>
      
如果你的次序是贰个服务程序,那么您能够钦点这一个服务程序运维时的经过ID。gdb会自动attach上去,并调整他。program应该在PATH遭受变量中检索得到。

使用GDB调试:

    5.2
多文件设置断点

  

hchen/test> gdb tst <———- 启动GDB
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are
welcome to change it and/or distribute copies of it under certain
conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for
details.
This GDB was configured as “i386-suse-linux”…
(gdb) l <——————–
l命令相当于list,从第一行起首例出原码。
1 #include <stdio.h>
2
3 int func(int n)
4 {
5 int sum=0,i;
6 for(i=0; i<n; i++)
7 {
8 sum+=i;
9 }
10 return sum;
(gdb) <——————– 直接回车表示,重复上一遍命令
11 }
12
13
14 main()
15 {
16 int i;
17 long result = 0;
18 for(i=1; i<=100; i++)
19 {
20 result += i;
(gdb) break 16 <——————– 设置断点,在源程序第16行处。
Breakpoint 1 at 0x8048496: file tst.c, line 16.
(gdb) break func <——————–
设置断点,在函数func()入口处。
Breakpoint 2 at 0x8048456: file tst.c, line 5.
(gdb) info break <——————– 查看断点音讯。
Num Type Disp Enb Address What
1 breakpoint keep y 0x08048496 in main at tst.c:16
2 breakpoint keep y 0x08048456 in func at tst.c:5
(gdb) r <——————— 运营程序,run命令简写
Starting program: /home/hchen/test/tst

    5.3
查询全数断点

GDB达成的功效:

Breakpoint 1, main () at tst.c:17 <———- 在断点处停住。
17 long result = 0;
(gdb) n <——————— 单条语句试行,next命令简写。
18 for(i=1; i<=100; i++)
(gdb) n
20 result += i;
(gdb) n
18 for(i=1; i<=100; i++)
(gdb) n
20 result += i;
(gdb) c <——————— 继续运维程序,continue命令简写。
Continuing.
result[1-100] = 5050 <———-程序输出。

6
观察点

  1. 按自定义的渴求来运营程序。
  2. 可让被钦定的前后相继在你所设置的断点处停住
  3. 当程序被停住时,检查你的次第中所产生的有所事。
  4. 动态低改换运转意况

Breakpoint 2, func (n=250) at tst.c:5
5 int sum=0,i;
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p i <——————— 打印变量i的值,print命令简写。
$1 = 134513808
(gdb) n
8 sum+=i;
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8 sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6 for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt <——————— 查看函数货仓。
#0 func (n=250) at tst.c:5
#1 0x080484e4 in main () at tst.c:24
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish <——————— 退出函数。
Run till exit from #0 func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24 printf(“result[1-250] = %d \n”, func(250) );
Value returned is $6 = 31375
(gdb) c <——————— 继续运维。
Continuing.
result[1-250] = 31375 <———-程序输出。

7
标准断点

  恐怕从这几点你会认为和IDE的调治没什么两样,可是命令行的调节和测量试验工具备其独立的特征。让我们看例子:

Program exited with code 027. <——–程序退出,调节和测量试验实现。
(gdb) q <——————— 退出gdb。
hchen/test>

8
维护截止点

实例

好了,有了上述的感性认识,还是让大家来系统地认知一下gdb吧。

9
为苏息点设定运维命令

  图片 1

使用GDB
————

10
调节和测量试验代码

  大家写了三个名称为tst.c的c源文件

貌似的话GDB重要调节和测验的是C/C++的程序。要调解C/C++的程序,首先在编写翻译时,大家亟供给把调节和测验音信加到可施行文件中。使用编写翻译器(cc/gcc/g++)的
-g 参数能够完毕这或多或少。如:

11
查看运维时数据

  图片 2

> cc -g hello.c -o hello
> g++ -g hello.cpp -o hello

12
程序变量

  加入了选取-g(产生debug新闻) ,编写翻译可实行文件

倘诺未有-g,你将看不见程序的函数名、变量名,所替代的全都以运转时的内部存款和储蓄器地址。当你用-g把调节和测量检验消息参预之后,并打响编写翻译指标代码现在,让大家来探问怎么着用gdb来调整他。

13
自动显示

  其在gdb中的调节和测验境况如下:

启航GDB的方法有以下三种:

14
历史记录

图片 3图片 4

1、gdb <program>
program约等于您的施行文书,一般在自然目录下。

15
改动程序的推行

使用GDB调试:

hchen/test> gdb tst  <---------- 启动GDB
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-suse-linux"...
(gdb) l     <-------------------- l命令相当于list,从第一行开始例出原码。
1        #include <stdio.h>
2
3        int func(int n)
4        {
5                int sum=0,i;
6                for(i=0; i<n; i++)
7                {
8                        sum+=i;
9                }
10               return sum;
(gdb)       <-------------------- 直接回车表示,重复上一次命令
11       }
12
13
14       main()
15       {
16               int i;
17               long result = 0;
18               for(i=1; i<=100; i++)
19               {
20                       result += i;    
(gdb) break 16    <-------------------- 设置断点,在源程序第16行处。
Breakpoint 1 at 0x8048496: file tst.c, line 16.
(gdb) break func  <-------------------- 设置断点,在函数func()入口处。
Breakpoint 2 at 0x8048456: file tst.c, line 5.
(gdb) info break  <-------------------- 查看断点信息。
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x08048496 in main at tst.c:16
2   breakpoint     keep y   0x08048456 in func at tst.c:5
(gdb) r           <--------------------- 运行程序,run命令简写
Starting program: /home/hchen/test/tst

Breakpoint 1, main () at tst.c:17    <---------- 在断点处停住。
17               long result = 0;
(gdb) n          <--------------------- 单条语句执行,next命令简写。
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) n
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) c          <--------------------- 继续运行程序,continue命令简写。
Continuing.
result[1-100] = 5050       <----------程序输出。

Breakpoint 2, func (n=250) at tst.c:5
5                int sum=0,i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p i        <--------------------- 打印变量i的值,print命令简写。
$1 = 134513808
(gdb) n
8                        sum+=i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8                        sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt        <--------------------- 查看函数堆栈。
#0  func (n=250) at tst.c:5
#1  0x080484e4 in main () at tst.c:24
#2  0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish    <--------------------- 退出函数。
Run till exit from #0  func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24              printf("result[1-250] = %d /n", func(250) );
Value returned is $6 = 31375
(gdb) c     <--------------------- 继续运行。
Continuing.
result[1-250] = 31375    <----------程序输出。

Program exited with code 027. <--------程序退出,调试结束。
(gdb) q     <--------------------- 退出gdb。
hchen/test>

2、gdb <program> core
用gdb同时调节和测验二个周转程序和core文件,core是程序非法实施后core
dump后发生的文件。

    15.1
修退换量值

View Code

3、gdb <program> <PID>
若是你的前后相继是贰个服务程序,那么您能够钦赐这么些服务程序运转时的历程ID。gdb会自动attach上去,并调治他。program应该在PATH情形变量中搜寻获得。

    15.2
跳转实践

 

GDB运维时,能够加上一些GDB的启航开关,详细的开关能够用gdb
-help查看。笔者在下边只例举一些相比常用的参数:

    15.3
发生非确定性信号量

补充:选项-O 、-g

-symbols <file>
-s <file>
从钦点文件中读取符号表。

    15.4
强制函数再次回到

  -O 选项告诉 GCC 对源代码实行着力优化进而使得程序实施地更加快;而-O2
选项报告 GCC 发生尽可
能小和不择手腕快的代码。使用-O2 选项编写翻译的快慢比选用-O
时慢,但产生的代码试行速度会越来越快。

-se file
从钦定文件中读取符号表消息,并把他用在可施行文件中。

    15.5
强制调用函数

  -g 选项报告 GCC 发生能被 GNU
调节和测验器使用的调节和测验音讯以便调节和测验你的次序,可喜的是,在 GCC 里,
作者们能联用-g 和-O (发生优化代码)

-core <file>
-c <file>
调试时core dump的core文件。

16
呈现源代码

 

-directory <directory>
-d <directory>
步向多少个源文件的找出路线。私下认可寻觅路线是意况变量中PATH所定义的路径。

17
调节和测验已运营的经过

  输入gdb tst,进入gdb调试

GDB的授命概貌
———————

18
线程

  图片 5

起步gdb后,就您被带入gdb的调节和测验情况中,就能够动用gdb的指令最初调节和测验程序了,gdb的通令能够采纳help命令来查看,如下所示:

19
查看栈音信

  然后早先输入gdb的指令,常用命令如下:

/home/hchen> gdb
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are
welcome to change it and/or distribute copies of it under certain
conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for
details.
This GDB was configured as “i386-suse-linux”.
(gdb) help
List of classes of commands:

20
信号

  图片 6

aliases — Aliases of other commands
breakpoints — Making program stop at certain points
data — Examining data
files — Specifying and examining files
internals — Maintenance commands
obscure — Obscure features
running — Running the program
stack — Examining the stack
status — Status inquiries
support — Support facilities
tracepoints — Tracing of program execution without stopping the
program
user-defined — User-defined commands

21
catch

展现源码

Type “help” followed by a class name for a list of commands in that
class.
Type “help” followed by command name for full documentation.
Command name abbreviations are allowed if unambiguous.
(gdb)

22
钦定源文件的路线

  第一种方式,用三个list命令(也许是八个l,list的简写)去显得源码

gdb的下令非常多,gdb把之分成很四个品类。help命令只是例出gdb的命令种类,假诺要看等级次序中的命令,能够采纳help
<class> 命令,如:help
breakpoints,查看设置断点的富有命令。也足以一向help
<command>来查阅命令的扶持。

1 简介

GDB(GNU Debugger)是GCC的调解工具。其作用强大,现描述如下: 
GDB首要帮衬你完了上面七个方面包车型地铁作用: 
1.起动你的主次,能够服从你的自定义的供给自由的运作程序。 
2.可让被调养的顺序在您所钦定的调置的断点处停住。(断点能够是基准表明式) 
3.当顺序被停住时,能够检查此时你的程序中所产生的事。 
4.动态的转移您程序的实施情况。

  嫌麻烦的话,直接二个l,然后三个回车(直接回车表示,重复上二次命令),也能达到规定的规范彰显任何源码的一声令下

gdb中,输入指令时,能够毫无打全命令,只用打命令的前多少个字符就可以了,当然,命令的前多少个字符应该要表明着一个独一的下令,在Linux下,你能够打击五次TAB键来补齐命令的齐全,假使有再次的,那么gdb会把其例出来。

2 生成调节和测验音信

貌似的话GDB主要调节和测量试验的是C/C++的主次。要调整C/C++的次序,首先在编写翻译时,大家亟须求把调节和测量检验新闻加到可实行文件中。使用编写翻译器(cc/gcc/g++)的
-g 参数能够完结那点。如:

gcc -g hello.c -o hello

g++ -g hello.cpp -o hello

只要未有-g,你将看不见程序的函数名、变量名,所取代的全部是运作时的内部存储器地址。当您用-g把调节和测验消息出席之后,并成功编写翻译目的代码以往,让我们来拜望哪些用gdb来调治他。

  图片 7图片 8

示范一:在走入函数func时,设置几个断点。能够敲入break
func,或是直接便是b func
(gdb) b func
Breakpoint 1 at 0x8048458: file hello.c, line 10.

3 启动GDB 的方法

1、gdb program

program 也正是您的实施文书,一般在当前目录下。

2、gdb program core

用gdb同期调节和测验四个运行程序和core文件,core是程序违规试行后core
dump后发生的公文。

3、gdb program 1234

设若您的主次是贰个服务程序,那么您能够钦定这么些服务程序运维时的进度ID。gdb会自动attach上去,并调节和测量试验他。program应该在PATH遭逢变量中寻找获得。

  不过list命令并不方便人民群众查看,所以还足以用第三种形式:gdbtui,利用tui
enable呼出tui分界面,也许是ctrl+x+a赶快键呼出。  

演示二:敲入b按两遍TAB键,你拜见到全部b打头的吩咐:
(gdb) b
backtrace break bt
(gdb)

4 程序运转上下文

 

演示三:只记得函数的前缀,能够那样:
(gdb) b make_ <按TAB键>
(再按下三遍TAB键,你探访到:)
make_a_section_from_file make_environ
make_abs_section make_function_type
make_blockvector make_pointer_type
make_cleanup make_reference_type
make_command make_symbol_completion_list
(gdb) b make_
GDB把全部make开首的函数全体例出来给你查看。

4.1 程序运维参数

set args 可钦定运维时参数。(如:set args 10 20 30 40 50 )

show args 命令能够查阅设置好的运行参数。

run (r) 运行程序

不点名运营参数 r

点名运维参数r 10 20 30 40 50

 

演示四:调节和测试C++的主次时,有能够函数名一样。如:
(gdb) b ‘bubble( M-?
bubble(double,double) bubble(int,int)
(gdb) b ‘bubble(
您能够查看到C++中的全部的重载函数及参数。(注:M-?和“按三回TAB键”是八个意思)

4.2 专门的学业目录

cd 相当于shell的cd命令。

pwd 呈现当前的所在目录。

在GDB中运维程序

要退出gdb时,只用发quit或指令简称q就行了。

4.3 程序的输入输出

info terminal 展现你程序用到的顶峰的情势。

运用重定向调控造进度序输出。如:run > outfile

tty命令能够设置输入输出使用的顶点设备。如:tty /dev/tty1

 

GDB中运行UNIX的shell程序
————————————

5 设置断点

  当以gdb
<program>情势运维gdb后,gdb会在PATH路线和当前目录中找出<program>的源文件。如要确认gdb是还是不是读到源文件,可使用l或list命令,看看gdb是不是能列出源代码。

在gdb景况中,你能够进行UNIX的shell的通令,使用gdb的shell命令来完结:

5.1 轻易断点

break 设置断点,能够简写为b

b 10 设置断点,在源程序第10行

b func 设置断点,在func函数入口处

 

shell <command string>
调用UNIX的shell来实施<command
string>,遭受变量SHELL中定义的UNIX的shell将会被用来进行<command
string>,若是SHELL没有定义,那就使用UNIX的正儿八经shell:/bin/sh。(在Windows中央银行使Command.com或cmd.exe)

5.2 多文件设置断点

在步向钦定函数时停住:

C++中能够动用class::function或function(type,type)格式来内定函数名。假设著名称空间,能够使用namespace::class::function只怕function(type,type)格式来内定函数名。

break filename:linenum 
在源文件filename的linenum行处停住 
break filename:function 
在源文件filename的function函数的入口处停住

break class::function或function(type,type)

在类class的function函数的入口处停住

break namespace::class::function

在称呼空间为namespace的类class的function函数的入口处停住

  在gdb中,运营程序使用r或是run命令。程序的周转,你有相当大只怕须要安装上面四下面的事。

再有二个gdb命令是make:
make <make-args>
能够在gdb中实施make命令来再一次build本身的主次。这些命令等价于“shell make
<make-args>”。

5.3 查询全数断点

info b

 

在GDB中运维程序
————————

6 观察点

watch
为表达式(变量)expr设置一个观察点。当表明式值有转换时,马上停住程序。

rwatch 表明式(变量)expr被读时,停住程序。

awatch 表明式(变量)的值被读或被写时,停住程序。

info watchpoints 列出当下所设置了的富有观察点。

  1、程序运转参数。
    set args 可钦定运转时参数。(如:set args 10 20 30 40 50)
    show args 命令能够查看设置好的运维参数。

当以gdb
<program>格局运行gdb后,gdb会在PATH路线和当前目录中寻找<program>的源文件。如要确认gdb是不是读到源文件,可使用l或list命令,看看gdb是不是能列出源代码。

7 口径断点

诚如的话,为断点设置一个条件,我们运用if关键词,前边跟其断点条件。何况,条件设置好后,大家能够用condition命令来修改断点的尺度。而且,条件设置好后,大家能够用condition命令来修改断点的尺码。(独有break
和 watch命令扶助if,catch方今暂不协理if)。

设置二个法规断点

b test.c:8 if intValue == 5

condition 与break if类似,只是condition只好用在已存在的断点上

修改断点号为bnum的安息条件为expression

condition bnum expression

接头断点号为bnum的告一段落条件

condition bnum

ignore 忽略停止条件三遍

代表忽略断点号为bnum的停下条件count次

Ignore bnum count

 

在gdb中,运转程序使用r或是run命令。程序的运转,你有不小可能率供给安装下边四方面包车型客车事。

8 维护甘休点

clear 清除全部的已定义的停下点。

clear function 清除全体安装在函数上的告一段落点。

clear linenum 清除全数安装在钦赐行上的休息点。

clear filename:linenum 清除全体安装在钦赐文件:内定行上的终止点。

delete [breakpoints] [range…]
删除钦定的断点,breakpoints为断点号。假若不点名断点号,则表示删除全数的断点。range
代表断点号的限定(如:3-7)。其简写命令为d。

比删除更加好的一种艺术是disable停止点,disable了的安息点,GDB不会删除,当你还须要时,enable就可以,就就如回收站一样。

disable [breakpoints] [range…]

disable所钦点的休息点,breakpoints为苏息点号。假如什么都不点名,表示disable全数的告一段落点。简写命令是dis.

enable [breakpoints] [range…]

enable所钦点的安歇点,breakpoints为结束点号。

enable [breakpoints] once range…

enable所钦赐的截止点一次,当程序甘休后,该打住点及时被GDB自动disable。

enable [breakpoints] delete range…

enable所钦点的停止点一遍,当程序结束后,该打住点及时被GDB自动删除。

  2、运维遭逢。
    path <dir> 可设定程序的周转路径。
    show paths 查看程序的运营路径。
    set environment varname [=value] 设置情形变量。如:set env
USE昂Cora=hchen
    show environment [varname] 查看情状变量。

1、程序运营参数。
set args 可钦点运维时参数。(如:set args 10 20 30 40 50)
show args 命令能够查看设置好的运转参数。

9 为停止点设定运营命令

大家能够运用GDB提供的command命令来设置甘休点的运维命令。也正是说,当运营的先后在被甘休住时,大家得以让其自行运营一些其余命令,那很有利行自动化调节和测量检验。对依赖GDB的自动化调节和测量试验是二个精锐的支撑。

commands [bnum]

… command-list …

end

为断点号bnum指写二个命令列表。当程序被该断点停住时,gdb会依次运转命令列表中的命令。

例如:

break foo if x>0

commands

printf “x is %d “,x

continue

end

断点设置在函数foo中,断点条件是x>0,如若程序被断住后,也等于,一旦x的值在foo函数中山大学于0,GDB会自动打字与印刷出x的值,并再而三运维程序。

如若您要免除断点上的一声令下类别,那么一旦简单的实行一下commands命令,并一向在打个end就行了。

 

2、运行景况。
path <dir> 可设定程序的运维路径。
show paths 查看程序的周转路径。
set environment varname [=value] 设置蒙受变量。如:set env
USEEscort=hchen
show environment [varname] 查看处境变量。

10 调节和测量试验代码

run 运营程序,可简写为r

next 单步追踪,函数调用当作一条简单语句试行,可简写为n

step 单步追踪,函数调进来被调用函数体内,可简写为s

finish 退出函数

until
在一个循环体内单步追踪时,那几个命令能够运作程序直到退出循环体,可简写为u。

continue 继续运维程序,可简写为c

stepi或si, nexti或ni
单步追踪一条机器指令,一条程序代码有相当的大大概由数条机器指令实现,stepi和nexti能够单步施行机器指令。

info program 来查看程序的是或不是在运作,进度号,被中断的缘由。

  3、职业目录。
    cd <dir> 相当于shell的cd命令。
    pwd 展现当前的四方目录。

3、职业目录。
cd <dir> 相当于shell的cd命令。
pwd 突显当前的三街六巷目录。

11 查看运维时数据

print 打印变量、字符串、表达式等的值,可简写为p 
p count 打印count的值 
p cou1+cou2+cou3 打字与印刷表明式值

print接受一个表明式,GDB会依据近年来的程序运转的数据来总计这几个表明式,表明式能够是近来程序运营中的const常量、变量、函数等剧情。可是GDB不可能应用程序中定义的宏。

 

4、程序的输入输出。
info terminal 呈现你程序用到的顶峰的格局。
选取重定向调节造进度序输出。如:run > outfile
tty命令能够指写输入输出的巅峰设备。如:tty /dev/ttyb

12 程序变量

在GDB中,你能够随时查阅以下二种变量的值:

1、全局变量(全部文件可知的)

2、静态全局变量(当前文件可见的)

3、局地变量(当前Scope可知的)

设若您的有的变量和全局变量爆发争辩(也便是重名),一般情状下是有个别变量会暗藏全局变量,也正是说,假如二个全局变量和八个函数中的局部变量同名时,假若当前终止点在函数中,用print展现出的变量的值会是函数中的局部变量的值。如若此刻您想查看全局变量的值时,你能够使用“::”操作符:

file::variable

function::variable

能够经过这种形式内定你所想查看的变量,是哪个文件中的或是哪个函数中的。比如,查看文件f2.c中的全局变量x的值:

p ‘f2.c’::x

理当如此,“::”操作符会和C++中的发生抵触,GDB能自动识别“::”是或不是C++的操作符,所以您不要忧郁在调解C++程序时会现身至极。

4数组变量

神蹟,你必要查阅一段连接的内部存款和储蓄器空间的值。举例数组的一段,或是动态分配的多寡的分寸。你能够使用GDB的“@”操作符,“@”的右边手是率先个内部存储器的地方的值,“@”的入手则你你想查看内部存款和储蓄器的长度。比方,你的前后相继中有那般的讲话:

int *array = (int *) malloc (len * sizeof (int));

于是,在GDB调节和测验进程中,你能够以如下命令展现出这么些动态数组的取值:

p *array@len

@的左臂是数组的首地址的值,相当于变量array所指向的源委,左边则是数量的长度,其保存在变量len中。

  4、程序的输入输出。
    info terminal 展现你程序用到的终点的情势。
    使用重定向调控程序输出。如:run > outfile
    tty命令可以指写输入输出的极端设备。如:tty /dev/ttyb

调解已运维的主次
————————

13 自动展现

你能够安装有些自行彰显的变量,当程序停住时,或是在你单步追踪时,这个变量会活动展现。相关的GDB命令是display。

display expr

display/fmt expr

display/fmt addr

expr是一个表明式,fmt表示呈现的格式,addr表示内部存款和储蓄器地址,当您用display设定好了多个或三个表达式后,只要你的程序被停下来,GDB会自动呈现你所设置的这一个表明式的值。

info display

查阅display设置的机动突显的音信。

undisplay dnums…

delete display dnums…

去除自动展现,dnums意为所设置好了的自行显式的数码。假如要同不经常候删除多少个,编号能够用空格分隔,假诺要刨除多个范围内的号码,能够用减号表示(如:2-5)

disable display dnums…

enable display dnums…

disable和enalbe不删除自动彰显的安装,而只是让其失效和还原。

 

二种格局:
1、在UNIX下用ps查看正在周转的次第的PID(进程ID),然后用gdb
<program> PID格式挂接正在运行的程序。
2、先用gdb
<program>关联上源代码,并开展gdb,在gdb中用attach命令来挂接进度的PID。并用detach来撤废挂接的长河。

14 历史记录

当你用GDB的print查看程序运维时的多少时,你每一个print都会被GDB记录下来。GDB会以$1,
$2, $3
…..那样的艺术为你每三个print命令编上号。于是,你能够行使这么些号码访问从前的表明式,如$1。那一个职能所带来的利润是,要是您从前输入了多个相比长的表明式,借使您还想查看那些表达式的值,你能够利用历史记录来访谈,省去了再次输入。

show values

Print the last ten values in the value history, with their item numbers.
This is

like ‘p $$9’ repeated ten times, except that show values does not change
the

history.

show values n

Print ten history values centered on history item number n.

show values +

Print ten history values just after the values last printed. If no more
values are

available, show values + produces no display.

 

停顿 / 苏醒程序运营
—————————

15 更换程序的推行

若果选拔GDB挂上被调节和测量试验程序,当程序运营起来后,你能够依赖本身的调理思路来动态地在GDB中改换当前被调节和测量试验程序的周转线路或是其变量的值,这几个壮大的效劳可以让你越来越好的调护医疗你的顺序,比如,你能够在程序的三遍运营中走遍程序的兼具支行。

 

调节和测验程序中,暂停程序运转是必需的,GDB能够一本万利地暂停程序的运作。你能够安装程序的在哪行停住,在怎样条件下停住,在接受什么能量信号时停往等等。以便于你查看运营时的变量,以及运营时的流程。

15.1 修改动量值

修改被调节和测量检验程序运营时的变量值,在GDB中很轻松实现,使用GDB的print命令就能够完结。如:

(gdb) print x=4

x=4那些表明式是C/C++的语法,意为把变量x的值修改为4,假诺您日前调节和测量检验的言语是帕斯Carl,那么你能够利用帕斯Carl的语法:x:=4。

在一些时候,很有希望你的变量和GDB中的参数顶牛,如:

(gdb) whatis width

type = double

(gdb) p width

$4 = 13

(gdb) set width=47

Invalid syntax in expression.

因为,set width是GDB的吩咐,所以,出现了“Invalid syntax in
expression”的设置错误,此时,你能够运用set
var命令来报告GDB,width不是你GDB的参数,而是程序的变量名,如:

(gdb) set var width=47

其它,还会有一些境况,GDB并不报告这种错误,所以确定保障起见,在您改换程序变量取值时,最佳都施用set
var格式的GDB命令。

调整已运营的次第

当进度被gdb停住时,你能够利用info program
来查看程序的是或不是在运作,进度号,被中断的源委。

15.2 跳转实践

一般的话,被调治将养程序会依据程序代码的周转顺序依次实践。GDB提供了乱序推行的职能,也便是说,GDB能够修改程序的实行各样,能够让程序施行随便跳跃。这么些功用能够由GDB的jump命令来完:

jump linespec

点名下一条语句的运维点。能够是文本的行号,能够是file:line格式,能够是+num这种偏移量格式。表示下一条运行语句从哪里开首。

jump *address

这里的是代码行的内部存款和储蓄器地址。

留意,jump命令不会改动这几天的次第栈中的内容,所以,当您从一个函数跳到另二个函数时,当函数运营完重临时实行弹栈操作时一定会生出错误,恐怕结果依旧要命离奇的,以至于发生程序Core
Dump。所以最棒是同三个函数中实行跳转。

深谙汇编的人都驾驭,程序运转时,eip寄放器用于保存当前代码所在的内部存款和储蓄器地址。所以,jump命令也正是改换了这些存放器中的值。于是,你能够利用“set
$pc”来改变跳转施行的地方。如:

set $pc = 0×485

 

在gdb中,大家能够有以下二种暂停方式:断点(BreakPoint)、观望点(WatchPoint)、捕捉点(CatchPoint)、时限信号(Signals)、线程截至(Thread
Stops)。假如要恢复生机程序运营,可以使用c或是continue命令。

15.3 爆发非时域信号量

利用singal命令,能够爆发三个复信号量给被调理的次第。如:中断时限信号Ctrl+C。这非常方便于程序的调节和测验,能够在程序运转的自由地点设置断点,并在该断点用GDB发生一个时域信号量,这种正确地在某处发生随机信号特别方便程序的调节和测量检验。

语法是:

signal signal

UNIX的系统随机信号量经常从1到15。所以取值也在那一个范围。

single命令和shell的kill命令不一样,系统的kill命令发复信号给被调节和测量检验程序时,是由GDB截获的,而single命令所发生一时限信号则是一向发给被调节和测验程序的。

 

一、设置断点(BreakPoint)

15.4 强制函数再次回到

假令你的调治断点在某些函数中,并还会有语句未有施行完。你可以选取return命令强制函数忽略还尚未实践的口舌并回到。

return

return expression

利用return命令撤除当前函数的实施,并及时再次回到,固然钦赐了,那么该表达式的值会被认作函数的重临值。

 

咱俩用break命令来设置断点。正面有几点设置断点的不二秘技:

15.5 **强制调用函数**

call expr

表明式中能够一是函数,以此达到强制调用函数的目标。并体现函数的再次回到值,即便函数重返值是void,那么就不出示。

print expr

另三个相似的一声令下也足以成功那百分之十效——print,print后边能够跟表明式,所以也得以用他来调用函数,print和call的例外是,借使函数再次来到void,call则不展现,print则显得函数重返值,并把该值存入历史数据中。

  二种方法:
  1、在UNIX下用ps查看正在运作的前后相继的PID(进度ID),然后用gdb
<program> PID格式挂接正在运营的次序。
  2、先用gdb
<program>关联上源代码,并开展gdb,在gdb中用attach命令来挂接进度的PID。并用detach来撤消挂接的进程。

break <function>
在步向钦命函数时停住。C++中能够动用class::function或function(type,type)格式来钦赐函数名。

16 展现源代码

GDB 能够打字与印刷出所调节和测验程序的源代码,当然,在前后相继编写翻译时一定要增加 –g
的参数,把源程序消息编写翻译到实施文书中。不然就看不到源程序了。当程序停下来之后,
GDB会报告前后相继停在了极其文件的第几行上。你能够用list命令来打字与印刷程序的源代码。暗中同意打印10行,依然来看一看查看源代码的GDB命令吧。

list linenum

Print lines centered around line number linenum in the current source
file.

list function

来得函数名字为function的函数的源程序。

list

来安妥前行前面包车型地铁源程序。

list –

突显当前行后面包车型客车源程序。

貌似是打字与印刷当前行的上5行和下5行,若是展现函数是是上2行下8行,暗中认可是10行,当然,你也得以定制展现的限制,使用上面发号施令能够设置壹遍展现源程序的行数。

set listsize count

安装一遍展现源代码的行数。(unless the list argument explicitly specifies
some other number)

show listsize

翻看当前listsize的安装。

 

break <linenum>
在内定行号停住。

17 调节和测试已运营的经过

三种艺术:

1、在UNIX下用ps查看正在运转的顺序的PID(进度ID),然后用gdb PID
process-id 格式挂接正在运作的前后相继。

2、先用gdb 关联上源代码,并展开gdb,在gdb中用attach process-id
命令来挂接进度的PID。并用detach来撤除挂接的长河。

 

break +offset
break -offset
在此时此刻行号的前头或前边的offset行停住。offiset为自然数。

18 线程

一经您程序是四线程的话,你能够定义你的断点是还是不是在有着的线程上,或是在有些特定的线程。GDB很轻易帮你成功这一干活。

break linespec thread threadno

break linespec thread threadno if …

linespec钦定了断点设置在的源程序的行号。threadno钦赐了线程的ID,注意,那一个ID是GDB分配的,你能够透过“info
threads”命令来查阅正在运作程序中的线程音信。若是您不钦赐‘thread threadno
’则意味着你的断点设在拥有线程上面。你还足以为某线程钦命断点条件。如:

(gdb) break frik.c:13 thread 28 if bartab > lim

当你的次第被GDB停住时,全部的周转线程都会被停住。那便于你你查看运营程序的完整境况。而在你复苏程序运维时,全部的线程也会被苏醒运转。那怕是主进度在被单步调节和测量检验时。

 

break filename:linenum
在源文件filename的linenum行处停住。

19 查看栈音讯

当程序被停住了,你要求做的首先件事正是查看程序是在何地停住的。当您的主次调用了三个函数,函数的地方,函数参数,函数内的部分变量都会被压入“栈”(Stack)中。你能够用GDB命令来查阅当前的栈中的音信。

上面是一些查看函数调用栈消息的GDB命令:

breacktrace,简称bt

打字与印刷当前的函数调用栈的有着新闻。如:

(gdb) bt

#0 func (n=250) at tst.c:6

#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30

#2 0x400409ed in __libc_start_main () from /lib/libc.so.6

从上得以看看函数的调用栈消息:__libc_start_main –> main() –>
func()

backtrace n

bt n

n是一个正整数,表示只打字与印刷栈顶上n层的栈音讯。

backtrace -n

bt -n

-n表二个负整数,表示只打字与印刷栈底下n层的栈音信。

假若你要翻开某一层的新闻,你需求在切换当前的栈,一般的话,程序截至时,最顶层的栈就是当下栈,若是您要查看栈上边层的详细音信,首先要做的是切换当前栈。

frame n

n是三个从0起初的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame
1,表示栈的第二层。

frame addr

f addr Select the frame at address addr. This is useful mainly if the
chaining of stack frames has been damaged by a bug, making it impossible
for gdb to assign

numbers properly to all frames. In addition, this can be useful when
your program has multiple stacks and switches between them.

up n

代表向栈的地点移动n层,可以不打n,表示发展移动一层。

down n

意味着向栈的下边移动n层,能够不打n,表示向下移动一层。

地点的指令,都会打印出活动到的栈层的信息。要是您不想让其打出音讯。你能够动用那八个指令:

select-frame 对应于 frame 命令。

up-silently n 对应于 up 命令。

down-silently n 对应于 down 命令。

查看当前栈层的消息,你能够用以下GDB命令:

frame 或 f

会打字与印刷出那么些消息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的言语。

info frame

info f

暂停 / 复苏程序运营

break filename:function
在源文件filename的function函数的入口处停住。

20 信号

确定性信号是一种软中断,是一种管理异步事件的法子。一般的话,操作系统都援救广大实信号。特别是UNIX,十二分主要应用程序一般都会管理连续信号。UNIX定义了比非常多功率信号,比方SIGINT表示暂停字符时域信号,也等于Ctrl+C的随机信号,SIGBUS表示硬件故障的时域信号;SIGCHLD表示子进程情状退换时域信号;
SIGKILL代表终止程序运转的时限信号,等等。

调节和测量检验程序的时候管理连续信号:

handle signal [keywords…]

signal能够以SIG伊始或不以SIG早先,能够用定义一个要管理功率信号的界定(如:SIGIO-SIGKILL,表示管理从
SIGIO时域信号到SIGKILL的数字信号,个中包罗SIGIO,SIGIOT,SIGKILL四个实信号),也足以采纳首要字all来注脚要拍卖全体的复信号。一旦被调治将养的次第接收到复信号,运转程序及时会被GDB停住,以供调节和测验。

keywords列表如下:

nostop

当被调养的顺序收到信号时,GDB不会停住程序的运作,但会打出新闻告诉您接到这种能量信号。

stop

当被调理的程序收到复信号时,GDB会停住你的顺序。This implies the print
keyword as well.

print

当被调理的次序收到非非确定性信号时,GDB会展现出一条新闻。

noprint

当被调弄整理的前后相继收到时域信号时,GDB不会告知您接到模拟信号的新闻。This implies the
nostop keyword as well.

pass

noignore

当被调养的顺序收到确定性信号时,GDB不管理非时限信号。那意味,GDB会把那几个数字信号交给被调节和测量检验程序管理or else it may terminate if the signal is fatal and not handled.

nopass

ignore

当被调和的程序收到非能量信号时,GDB不会让被调节和测量检验程序来处理那几个时域信号。

info signals

info handle

翻看有何非确定性信号在被GDB检验中。

 

break *address
在程序运营的内部存款和储蓄器地址处停住。

21catch

当event爆发时,停住程序。event能够是底下的从头到尾的经过: 
1、throw 三个C++抛出的要命。(throw为根本字) 
2、catch 二个C++捕捉到的特别。(catch为主要字)

 

break
break命令未有参数时,表示在下一条指令处停住。

22 钦赐源文件的门径

好何时候,用-g编写翻译过后的试行顺序中只是包蕴了源文件的名字,未有路线名。GDB提供了能够令你钦点源文件的门路的吩咐,以便GDB进行搜寻。

Directory dirname …

dir dirname …

加一个源文件路线到当前路径的前边。假使你要钦命多个渠道,UNIX下您能够使用“:”,Windows下你能够使用“;”。

directory

扫除全数的自定义的源文件找出路线音信。

show directories

体现定义了的源文件寻觅路线。

 

break … if <condition>
…能够是上述的参数,condition表示原则,在基准创建即停住。譬如在循意况体中,能够安装break
if i=100,表示当i为100时停住程序。

  调节和测量试验程序中,暂停程序运维是必需的,GDB能够一本万利地暂停程序的周转。你可以设置程序的在哪行停住,在哪些标准下停住,在摄取什么数字信号时停往等等。以便于您查看运营时的变量,以及运营时的流程。

翻开断点时,可利用info命令,如下所示:(注:n表示断点号)
info breakpoints [n]
info break [n]

 

二、设置观看点(WatchPoint)

 

阅览点一般来考查有个别表明式(变量也是一种表达式)的值是不是有调换了,假设有转换,立时停住程序。大家有上面的两种方法来安装观看点:

 

watch <expr>
为表明式(变量)expr设置三个观看点。一量抒发式值有调换时,登时停住程序。

  当进度被gdb停住时,你能够动用info program
来查阅程序的是还是不是在运行,进度号,被暂停的原委。

rwatch <expr>
当表明式(变量)expr被读时,停住程序。

 

awatch <expr>
当表明式(变量)的值被读或被写时,停住程序。

 

info watchpoints
列出当下所设置了的富有观看点。

 

三、设置捕捉点(CatchPoint)

  在gdb中,大家得以有以下二种暂停形式:断点(BreakPoint)、阅览点(WatchPoint)、捕捉点(CatchPoint)、时域信号(Signals)、线程甘休(Thread
Stops)。假若要苏醒程序运转,能够使用c或是continue命令。

你可设置捕捉点来补捉程序运行时的一些平地风波。如:载入共享库(动态链接库)或是C++的老大。设置捕捉点的格式为:

 

catch <event>
当event发生时,停住程序。event能够是上边的剧情:
1、throw 二个C++抛出的极度。(throw为首要字)
2、catch 一个C++捕捉到的不胜。(catch为第一字)
3、exec
调用系统调用exec时。(exec为根本字,近日此意义只在HP-UX下有用)
4、fork
调用系统调用fork时。(fork为首要字,前段时间此成效只在HP-UX下有用)
5、vfork
调用系统调用vfork时。(vfork为入眼字,最近此功效只在HP-UX下有用)
6、load 或 load <libname>
载入分享库(动态链接库)时。(load为重要字,如今此功用只在HP-UX下有用)
7、unload 或 unload <libname>
卸载分享库(动态链接库)时。(unload为入眼字,近日此意义只在HP-UX下有用)

 

tcatch <event>
只设置一遍捕捉点,当程序停住未来,应点被活动删除。

设置断点(BreakPoint)
    
    大家用break命令来安装断点。正面有几点设置断点的措施:
    
    break <function> 
       
在步入钦命函数时停住。C++中得以应用class::function或function(type,type)格式来钦命函数名。

四、维护结束点

    break
<linenum>
        在钦点行号停住。

上边说了怎么着设置程序的终止点,GDB中的停止点也正是上述的三类。在GDB中,借使您认为已定义好的停下点未有用了,你能够动用delete、clear、disable、enable那多少个指令来进行维护。

    break +offset 
    break -offset 
        在当下行号的先头或前边的offset行停住。offiset为自然数。

clear
破除全部的已定义的停下点。

    break
filename:linenum 
        在源文件filename的linenum行处停住。

clear <function>
clear <filename:function>
解除全体安装在函数上的停下点。

    break
filename:function 
        在源文件filename的function函数的入口处停住。

clear <linenum>
clear <filename:linenum>
扫除全部安装在钦点行上的告一段落点。

    break *address
        在程序运维的内部存款和储蓄器地址处停住。

delete [breakpoints] [range…]
删去钦命的断点,breakpoints为断点号。假使不点名断点号,则表示删除全部的断点。range
代表断点号的限定(如:3-7)。其简写命令为d。

    break 
        break命令未有参数时,表示在下一条指令处停住。

比删除更加好的一种艺术是disable截至点,disable了的终止点,GDB不会去除,当你还供给时,enable就可以,就临近回收站同样。

    break … if
<condition>
       
…能够是上述的参数,condition表示原则,在基准建马上停住。举个例子在循情状体中,能够安装break
if
i=100(这里不知出了什么样来头,不能够写标准表明式i==100),表示当i为100时停住程序。不过最棒在“…”处给定八个您想要中断暂停的地点,比方break
5 if i=100(表示若i为100,则中断暂停在line 5)或然break function if
i=100(表示若i为100,则中断暂停在名称叫function的函数的入口处)

disable [breakpoints] [range…]
disable所钦赐的告一段落点,breakpoints为截止点号。假使什么都不钦定,表示disable全体的终止点。简写命令是dis.

   
查看断点时,可使用info命令,如下所示:(注:n表示断点号)
    info breakpoints [n] 
    info break [n] 
   

enable [breakpoints] [range…]
enable所钦赐的停下点,breakpoints为甘休点号。

安装观望点(WatchPoint)
    
   
观看点一般来察看某些表达式(变量也是一种表明式)的值是或不是有浮动了,假诺有浮动,登时停住程序。我们有上面包车型地铁二种方法来安装观察点:
    
    watch <expr>
       
为表达式(变量)expr设置多个观望点。一量揭橥式值有浮动时,立时停住程序。
        
    rwatch <expr>
        当表达式(变量)expr被读时,停住程序。
        
    awatch <expr>
        当表明式(变量)的值被读或被写时,停住程序。
    
    info watchpoints
        列出当前所设置了的持有观望点。

enable [breakpoints] once range…
enable所钦赐的结束点叁次,当程序结束后,该打住点立马被GDB自动disable。

设置捕捉点(CatchPoint)

enable [breakpoints] delete range…
enable所钦点的终止点一遍,当程序停止后,该打住点立马被GDB自动删除。

   
你可设置捕捉点来补捉程序运维时的有的风云。如:载入分享库(动态链接库)或是C++的不行。设置捕捉点的格式为:
    
    catch <event>
        当event发生时,停住程序。event能够是上边包车型地铁内容:
        1、throw 一个C++抛出的不胜。(throw为主要字)
        2、catch 一个C++捕捉到的老大。(catch为机要字)
        3、exec
调用系统调用exec时。(exec为关键字,近日此意义只在HP-UX下有用)
        4、fork
调用系统调用fork时。(fork为第一字,近年来此意义只在HP-UX下有用)
        5、vfork
调用系统调用vfork时。(vfork为关键字,这段日子此功效只在HP-UX下有用)
        6、load 或 load <libname>
载入分享库(动态链接库)时。(load为第一字,前段时间此成效只在HP-UX下有用)
        7、unload 或 unload <libname>
卸载分享库(动态链接库)时。(unload为关键字,最近此成效只在HP-UX下有用)

五、甘休条件保证

    tcatch
<event> 
        只设置一遍捕捉点,当程序停住未来,应点被电动删除。

前面在提及安装断点时,我们关系过能够安装贰个规范,当条件构建即,程序自动终止,那是一个可怜有力的成效,这里,笔者想极其说说这一个标准的相关保险命令。一般的话,为断点设置一个原则,大家选取if关键词,前边跟其断点条件。而且,条件设置好后,大家得以用condition命令来修改断点的原则。(独有break和watch命令帮助if,catch方今暂不帮衬if)

 

condition <bnum> <expression>
修改断点号为bnum的甘休条件为expression。

保卫安全结束点

condition <bnum>
免去断点号为bnum的停止条件。

下面说了哪些设置程序的截至点,GDB中的甘休点也正是上述的三类。在GDB中,就算你以为已定义好的小憩点并未有用了,你能够行使delete、clear、disable、enable那多少个指令来张开保养。

还应该有三个比较新鲜的掩护命令ignore,你能够钦点程序运转时,忽略结束条件五回。

    clear
        清除全数的已定义的小憩点。

ignore <bnum> <count>
代表忽略断点号为bnum的告一段落条件count次。

    clear
<function>
    clear <filename:function>
        清除全体安装在函数上的停下点。

六、为小憩点设定运转命令

    clear
<linenum>
    clear <filename:linenum>
        清除全部安装在钦赐行上的停下点。

我们得以接纳GDB提供的command命令来设置结束点的运营命令。也便是说,当运转的前后相继在被终止住时,大家得以让其自行运转一些其余命令,那很有利行自动化调节和测量检验。对基于GDB的自动化调节和测量检验是三个精锐的援助。

    delete
[breakpoints] [range…]
       
删除钦点的断点,breakpoints为断点号。假设不钦点断点号,则代表删除全数的断点。range
表示断点号的界定(如:3-7)。其简写命令为d。

commands [bnum]
… command-list …
end

比删除更加好的一种格局是disable停止点,disable了的结束点,GDB不会去除,当您还必要时,enable就能够,就恍如回收站同样。

为断点号bnum指写二个下令列表。当程序被该断点停住时,gdb会依次运营命令列表中的命令。

    disable
[breakpoints] [range…]
       
disable所钦赐的终止点,breakpoints为小憩点号。假若什么都不点名,表示disable全体的安歇点。简写命令是dis.

例如:

    enable
[breakpoints] [range…]
        enable所钦点的终止点,breakpoints为结束点号。

break foo if x>0
commands
printf “x is %d\n”,x
continue
end
断点设置在函数foo中,断点条件是x>0,假若程序被断住后,也便是,一旦x的值在foo函数中山高校于0,GDB会自动打字与印刷出x的值,并继续运转程序。

    enable
[breakpoints] once range…
       
enable所钦定的终止点贰次,当程序甘休后,该打住点及时被GDB自动disable。

只要您要破除断点上的一声令下体系,那么一旦简单的实行一下commands命令,并一向在打个end就行了。

    enable
[breakpoints] delete range…
       
enable所钦赐的安歇点叁回,当程序甘休后,该甘休点立马被GDB自动删除。

七、断点菜单

 

在C++中,恐怕会重新出现同八个名字的函数若干次(函数重载),在这种情况下,break
<function>无法告诉GDB要停在哪些函数的入口。当然,你能够运用break
<function(type)>也正是把函数的参数类型告诉GDB,以钦点二个函数。否则的话,GDB会给你列出一个断点菜单供您选取你所急需的断点。你要是输入你菜单列表中的编号就足以了。如:

断点的终止条件保障

(gdb) b String::after
[0] cancel
[1] all
[2] file:String.cc; line number:867
[3] file:String.cc; line number:860
[4] file:String.cc; line number:875
[5] file:String.cc; line number:853
[6] file:String.cc; line number:846
[7] file:String.cc; line number:735
> 2 4 6
Breakpoint 1 at 0xb26c: file String.cc, line 867.
Breakpoint 2 at 0xb344: file String.cc, line 875.
Breakpoint 3 at 0xafcc: file String.cc, line 846.
Multiple breakpoints were set.
Use the “delete” command to delete unwanted
breakpoints.
(gdb)

前面在提及安装断点时,大家关系过能够安装叁个原则,当条件创立即,程序自动截至,那是贰个极其庞大的机能,这里,小编想非常说说那么些条件的有关保障命令。一般的话,为断点设置贰个规格,大家选用if关键词,前面跟其断点条件。并且,条件设置好后,大家得以用condition命令来修改断点的规范。(独有break和watch命令协理if,catch方今暂不援救if)

足见,GDB列出了装有after的重载函数,你能够选一下列表编号就行了。0意味着甩掉设置断点,1意味全数函数都设置断点。

    condition
<bnum> <expression>
        修改断点号为bnum的告一段落条件为expression。

八、恢复生机程序启动和单步调节和测试

    condition
<bnum>
        清除断点号为bnum的告一段落条件。

当程序被停住了,你能够用continue命令苏醒程序的运作直到程序甘休,或下二个断点到来。也足以运用step或next命令单步追踪程序。

 

continue [ignore-count]
c [ignore-count]
fg [ignore-count]
恢复程序运维,直到程序结束,或是下三个断点到来。ignore-count表示忽略其后的断点次数。continue,c,fg五个指令都以同等的情致。

为休息点设定运营命令

step <count>
单步跟踪,倘诺有函数调用,他会进去该函数。进入函数的前提是,此函数被编写翻译有debug新闻。很像VC等工具中的step
in。前面能够加count也得以不加,不加表示一条条地实行,加表示实行前边的count条指令,然后再停住。

咱俩得以采取GDB提供的command命令来安装甘休点的运营命令。也正是说,当运营的次第在被终止住时,大家得以让其自行运营一些其余命令,那很有利行自动化调节和测量试验。对基于GDB的自动化调节和测量检验是一个无敌的支持。

next <count>
一模二样单步追踪,借使有函数调用,他不会进去该函数。很像VC等工具中的step
over。前边能够加count也足以不加,不加表示一条条地进行,加表示施行前边的count条指令,然后再停住。

    commands
[bnum]
    … command-list …
    end

set step-mode
set step-mode on
展开step-mode方式,于是,在开展单步追踪时,程序不会因为尚未debug新闻而不停住。那几个参数有很便利查看机器码。

   
为断点号bnum指写三个发令列表。当程序被该断点停住时,gdb会依次启动命令列表中的命令。

set step-mod off
关闭step-mode模式。

    例如:

finish
运转程序,直到当前函数完毕重返。并打字与印刷函数再次来到时的仓库地址和重回值及参数值等音讯。

        break foo if
x>0
        commands
        printf “x is %d/n”,x
        continue
        end
       
断点设置在函数foo中,断点条件是x>0,假设程序被断住后,约等于,一旦x的值在foo函数中山高校于0,GDB会自动打字与印刷出x的值,并一而再运维程序。

until 或 u
当您厌恶了在三个循环体内单步追踪时,这一个命令可以运行程序直到退出循环体。

即使您要消除断点上的授命体系,那么一旦轻易的实践一下commands命令,并平素在打个end就行了。

stepi 或 si
nexti 或 ni
单步跟踪一条机器指令!一条程序代码有十分大希望由数条机器指令实现,stepi和nexti可以单步实行机器指令。与之一样有同一效果的一声令下是“display/i
$pc”
,当运维完那一个命令后,单步追踪会在打出程序代码的还要打出机器指令(约等于汇编代码)

 

九、信号(Signals)

恢复生机程序运营和单步调节和测量检验

信号是一种软中断,是一种管理异步事件的法子。一般的话,操作系统都扶助广大实信号。越发是UNIX,比较重大应用程序一般都会管理信号。UNIX定义了比很多实信号,譬如SIGINT表示暂停字符随机信号,也正是Ctrl+C的实信号,SIGBUS表示硬件故障的实信号;SIGCHLD表示子进度情形改换功率信号;SIGKILL表示终止程序运转的确定性信号,等等。时域信号量编制程序是UNIX下特别首要的一种才干。

当程序被停住了,你可以用continue命令苏醒程序的运行直到程序停止,或下贰个断点到来。也能够行使step或next命令单步追踪程序。

GDB有力量在您调节和测量检验程序的时候管理任何一种频域信号,你能够告诉GDB必要管理哪类时限信号。你能够需求GDB收到你所钦点的功率信号时,立即停住正在周转的次第,以供您进行调度。你可以用GDB的handle命令来形成这一功力。

    continue
[ignore-count]
    c [ignore-count]
    fg [ignore-count]
       
恢复生机程序运转,直到程序截止,或是下一个断点到来。ignore-count表示忽略其后的断点次数。continue,c,fg四个指令都是一律的意味。

handle <signal> <keywords…>
在GDB中定义三个能量信号管理。时限信号<signal>能够以SIG初叶或不以SIG开首,能够用定义八个要管理时限信号的范围(如:SIGIO-SIGKILL,表示管理从SIGIO时域信号到SIGKILL的时限信号,在那之中包蕴SIGIO,SIGIOT,SIGKILL三个非数字信号),也能够选取首要字all来表明要拍卖全部的频限信号。一旦被调和的主次接收到信号,运行程序及时会被GDB停住,以供调节和测量检验。其<keywords>能够是以下几种关键字的叁个或七个。

    step
<count>
       
单步追踪,假诺有函数调用,他会跻身该函数。步向函数的前提是,此函数被编译有debug音信。很像VC等工具中的step
in。前边可以加count也能够不加,不加表示一条条地举办,加表示试行前面包车型地铁count条指令,然后再停住。

nostop
当被调护医治的次序收到连续信号时,GDB不会停住程序的运营,但会打出音信告知您收到这种非时域信号。
stop
当被调弄整理的主次收到功率信号时,GDB会停住你的次序。
print
当被调弄整理的程序收到复信号时,GDB会突显出一条音信。
noprint
当被调治将养的次序收到非随机信号时,GDB不会告知您接到时限信号的新闻。
pass
noignore
当被调和的前后相继收到功率信号时,GDB不管理非信号。那代表,GDB会把那些时域信号交给被调节和测量检验程序会管理。
nopass
ignore
当被调理的顺序收到实信号时,GDB不会让被调节和测验程序来拍卖这一个时限信号。

    next
<count>
       
同样单步追踪,如果有函数调用,他不会跻身该函数。很像VC等工具中的step
over。后边能够加count也足以不加,不加表示一条条地实践,加表示实践前边的count条指令,然后再停住。

info signals
info handle
查看有啥样功率信号在被GDB检查评定中。

    set step-mode
    set step-mode on
       
展开step-mode方式,于是,在拓宽单步追踪时,程序不会因为未有debug音信而不停住。这些参数有相当的低价查看机器码。

十、线程(Thread Stops)

    set step-mod
off
        关闭step-mode模式。

万一您程序是多线程的话,你能够定义你的断点是还是不是在具备的线程上,或是在有些特定的线程。GDB很轻易帮你成功这一办事。

    finish
       
运转程序,直到当前函数完毕重返。并打字与印刷函数重临时的库房地址和重回值及参数值等音讯。

break <linespec> thread <threadno>
break <linespec> thread <threadno> if …
linespec钦命了断点设置在的源程序的行号。threadno钦点了线程的ID,注意,那个ID是GDB分配的,你能够因而“info
threads”命令来查阅正在运行程序中的线程音讯。若是您不钦点thread
<threadno>则代表你的断点设在颇具线程上边。你还足认为某线程钦定断点条件。如:

    until 或 u
       
当你厌烦了在三个循环体内单步追踪时,那一个命令能够运作程序直到退出循环体。

(gdb) break frik.c:13 thread 28 if bartab > lim

    stepi 或 si
    nexti 或 ni
       
单步追踪一条机器指令!一条程序代码有希望由数条机器指令完结,stepi和nexti能够单步奉行机器指令。与之一样有同样效果的一声令下是“display/i
$pc”
,当运行完那些命令后,单步追踪会在打出程序代码的还要打出机器指令(相当于汇编代码)

当您的次第被GDB停住时,全体的运作线程都会被停住。那便于你你查看运转程序的完好情状。而在你复苏程序运营时,全数的线程也会被还原运转。那怕是主进度在被单步调节和测验时。

 

查阅栈音讯
—————

动用help查看命令   

当程序被停住了,你必要做的首先件事正是查看程序是在何地停住的。当您的主次调用了贰个函数,函数的地方,函数参数,函数内的一对变量都会被压入“栈”(Stack)中。你可以用GDB命令来查阅当前的栈中的音讯。

  gdb的通令非常多,gdb把之分成很四个品种。help命令只是例出gdb的吩咐连串,假诺要看档案的次序中的命令,能够使用help
<class> 命令,如:help
breakpoints,查看设置断点的富有命令。也能够间接help
<command>来查阅命令的帮带。

上面是一对查看函数调用栈音信的GDB命令:

 

backtrace
bt
打字与印刷当前的函数调用栈的保有音信。如:

未完待续

(gdb) bt
#0 func (n=250) at tst.c:6
#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6

 参报考博士大学生客:CSDN陈浩

从上得以观望函数的调用栈新闻:__libc_start_main –> main() –>
func()

backtrace <n>
bt <n>
n是一个正整数,表示只打字与印刷栈顶上n层的栈新闻。

backtrace <-n>
bt <-n>
-n表二个负整数,表示只打字与印刷栈底下n层的栈消息。

倘使您要查看某一层的音信,你供给在切换当前的栈,一般的话,程序结束时,最顶层的栈正是现阶段栈,固然你要查阅栈上边层的详细音信,首先要做的是切换当前栈。

frame <n>
f <n>
n是一个从0起始的卡尺头,是栈中的层编号。举个例子:frame 0,表示栈顶,frame
1,表示栈的第二层。

up <n>
意味着向栈的方面移动n层,能够不打n,表示发展移动一层。

down <n>
表示向栈的上边移动n层,能够不打n,表示向下活动一层。

上边包车型客车通令,都会打印出活动到的栈层的信息。假诺您不想让其打出信息。你能够应用那五个指令:

select-frame <n> 对应于 frame 命令。
up-silently <n> 对应于 up 命令。
down-silently <n> 对应于 down 命令。

查阅当前栈层的音讯,你能够用以下GDB命令:

frame 或 f
会打印出这几个消息:栈的层编号,当前的函数名,函数参数值,函数所在文书及行号,函数实施到的言辞。

info frame
info f
以此命令会打印出尤其详细的近年来栈层的音讯,只可是,大许多都以运营时的Nene地址。比如:函数地址,调用函数的地方,被调用函数的地方,近些日子的函数是由什么的程序语言写成的、函数参数地址及值、局地变量的地点等等。如:
(gdb) info f
Stack level 0, frame at 0xbffff5d4:
eip = 0x804845d in func (tst.c:6); saved eip 0x8048524
called by frame at 0xbffff60c
source language c.
Arglist at 0xbffff5d4, args: n=250
Locals at 0xbffff5d4, Previous frame’s sp is 0x0
Saved registers:
ebp at 0xbffff5d4, eip at 0xbffff5d8

info args
打印出脚下函数的参数名及其值。

info locals
打字与印刷出脚下函数中有着片段变量及其值。

info catch
打字与印刷出脚下的函数中的极度管理消息。

查看源程序
—————

一、显示源代码

GDB
能够打字与印刷出所调节和测量试验程序的源代码,当然,在程序编写翻译时绝对要加多-g的参数,把源程序音讯编写翻译到奉行文书中。不然就看不到源程序了。当程序停下来以后,GDB会报告前后相继停在了至极文件的第几行上。你能够用list命令来打字与印刷程序的源代码。依旧来看一看查看源代码的GDB命令吧。

list <linenum>
呈现程序第linenum行的左近的源程序。

list <function>
展示函数名叫function的函数的源程序。

list
来稳当前行后边的源程序。

list –
来妥帖前行前边的源程序。

一般是打字与印刷当前行的上5行和下5行,若是展现函数是是上2行下8行,默许是10行,当然,你也得以定制展现的限量,使用下边发号施令能够设置二回显示源程序的行数。

set listsize <count>
安装一回显示源代码的行数。

show listsize
翻看当前listsize的设置。

list命令还或者有上边包车型客车用法:

list <first>, <last>
突显从first行到last行之间的源代码。

list , <last>
显示从近些日子行到last行之间的源代码。

list +
现在展现源代码。

诚如的话在list前边能够跟以下那们的参数:

<linenum> 行号。
<+offset> 当前行号的正偏移量。
<-offset> 当前行号的负偏移量。
<filename:linenum> 哪个文件的哪一行。
<function> 函数名。
<filename:function> 哪个文件中的哪个函数。
<*address> 程序运转时的言语在内部存款和储蓄器中的地方。

二、找出源代码

不唯有如此,GDB还提供了源代码寻觅的吩咐:

forward-search <regexp>
search <regexp>
向后面寻找。

reverse-search <regexp>
整个查找。

内部,<regexp>正是正则表明式,也主三个字符串的非凡情势,关张永琛则表明式,小编就不在这里讲了,还请各位查占卜关资料。

三、钦命源文件的不二法门

或多或少时候,用-g编写翻译过后的举办顺序中只是回顾了源文件的名字,未有路径名。GDB提供了能够令你钦点源文件的路径的通令,以便GDB实行搜寻。

directory <dirname … >
dir <dirname … >
加贰个源文件路线到当前路径的前边。假使您要钦点多少个渠道,UNIX下您能够运用“:”,Windows下你能够运用“;”。
directory
扫除全体的自定义的源文件寻找路径音信。

show directories
突显定义了的源文件寻觅路线。

四、源代码的内部存款和储蓄器

你能够使用info line命令来查看源代码在内部存款和储蓄器中的地址。info
line前面能够跟“行号”,“函数名”,“文件名:行号”,“文件名:函数名”,那几个命令会打印出所内定的源码在运营时的内部存款和储蓄器地址,如:

(gdb) info line tst.c:func
Line 5 of “tst.c” starts at address 0x8048456 <func+6> and ends at
0x804845d <func+13>.

还应该有贰个命令(disassemble)你能够查看源程序的近日推行时的机器码,那个命令会把当前内部存款和储蓄器中的指令dump出来。如下边包车型客车演示表示查看函数func的汇编代码。

(gdb) disassemble func
Dump of assembler code for function func:
0x8048450 <func>: push %ebp
0x8048451 <func+1>: mov %esp,%ebp
0x8048453 <func+3>: sub $0x18,%esp
0x8048456 <func+6>: movl $0x0,0xfffffffc(%ebp)
0x804845d <func+13>: movl $0x1,0xfffffff8(%ebp)
0x8048464 <func+20>: mov 0xfffffff8(%ebp),%eax
0x8048467 <func+23>: cmp 0x8(%ebp),%eax
0x804846a <func+26>: jle 0x8048470 <func+32>
0x804846c <func+28>: jmp 0x8048480 <func+48>
0x804846e <func+30>: mov %esi,%esi
0x8048470 <func+32>: mov 0xfffffff8(%ebp),%eax
0x8048473 <func+35>: add %eax,0xfffffffc(%ebp)
0x8048476 <func+38>: incl 0xfffffff8(%ebp)
0x8048479 <func+41>: jmp 0x8048464 <func+20>
0x804847b <func+43>: nop
0x804847c <func+44>: lea 0x0(%esi,1),%esi
0x8048480 <func+48>: mov 0xfffffffc(%ebp),%edx
0x8048483 <func+51>: mov %edx,%eax
0x8048485 <func+53>: jmp 0x8048487 <func+55>
0x8048487 <func+55>: mov %ebp,%esp
0x8048489 <func+57>: pop %ebp
0x804848a <func+58>: ret
End of assembler dump.

翻看运维时数据
———————

在你调节和测验程序时,当程序被停住时,你可以采纳print命令(简写命令为p),或是同义命令inspect来查看当前前后相继的运营数据。print命令的格式是:

print <expr>
print /<f> <expr>
<expr>是表明式,是您所调节和测验的主次的言语的表明式(GDB能够调养各类编制程序语言),<f>是出口的格式,比方,假如要把表达式按16进制的格式输出,那么正是/x。

一、表达式

print和众多GDB的指令一样,还不错贰个表明式,GDB会依照近年来的程序运营的数额来总结这些表明式,既然是表达式,那么就能够是时下程序运维中的const常量、变量、函数等剧情。缺憾的是GDB不可能选择你在程序中所定义的宏。

表明式的语法应该是时下所调节和测量检验的言语的语法,由于C/C++是一种大众型的语言,所以,本文中的例子都以关于C/C++的。(而关于用GDB调节和测量试验另外语言的章节,小编将要后头介绍)

在表明式中,有两种GDB所支撑的操作符,它们得以用在别的一种语言中。

@
是多少个和数组有关的操作符,在前面会有更详实的表达。

::
点名四个在文书或然多个函数中的变量。

{<type>} <addr>
意味着叁个针对性内部存款和储蓄器地址<addr>的类型为type的几个指标。

二、程序变量

在GDB中,你能够随时查阅以下二种变量的值:
1、全局变量(全体文件可知的)
2、静态全局变量(当前文件可知的)
3、局地变量(当前Scope可知的)

假使你的一对变量和全局变量发生争执(约等于重名),一般景色下是一些变量会暗藏全局变量,相当于说,若是二个全局变量和二个函数中的局地变量同名时,假诺当前终止点在函数中,用print突显出的变量的值会是函数中的局地变量的值。假使此刻您想查看全局变量的值时,你能够运用“::”操作符:

file::variable
function::variable
可以经过这种样式钦命你所想查看的变量,是哪些文件中的或是哪个函数中的。比如,查看文件f2.c中的全局变量x的值:

gdb) p ‘f2.c’::x

当然,“::”操作符会和C++中的产生抵触,GDB能自动识别“::”
是不是C++的操作符,所以你不用思念在调治C++程序时会出现格外。

别的,须要注意的是,若是您的主次编译时打开了优化增选,那么在用GDB调节和测量试验被优化过的次序时,只怕会爆发一些变量不可能访谈,或是取值错误码的意况。这么些是很正规的,因为优化程序会删改你的顺序,整理你程序的话语顺序,剔除一些抽象的变量等,所以在GDB调节和测量试验这种程序时,运转时的一声令下和你所编纂指令就有差异等,也就能出现你所想象不到的结果。对付这种气象时,需求在编写翻译程序时关闭编译优化。一般的话,大约具有的编写翻译器都援助理编辑译优化的按钮,比如,GNU的C/C++编译器GCC,你能够利用“-gstabs”选项来解决那些题目。关于编译器的参数,还请查看编写翻译器的施用验证文书档案。

三、数组

不常候,你要求查阅一段连接的内部存款和储蓄器空间的值。例如数组的一段,或是动态分配的数额的大大小小。你能够选拔GDB的“@”操作符,“@”的右边是第叁个内部存款和储蓄器的位置的值,“@”的右边手则你你想查看内部存储器的尺寸。比如,你的主次中有那般的言辞:

int *array = (int *) malloc (len * sizeof (int));

于是,在GDB调节和测验进程中,你能够以如下命令显示出这么些动态数组的取值:

p *array@len

@的左手是数组的首地址的值,也正是变量array所指向的源委,侧面则是数额的长度,其保存在变量len中,其出口结果,大概是下面那一个样子的:

(gdb) p *array@len
$1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34,
36, 38, 40}

尽管是静态数组的话,能够直接用print数组名,就能够来得数组中持有数据的剧情了。

四、输出格式

貌似的话,GDB会依照变量的品类输出变量的值。但您也能够自定义GDB的出口的格式。比如,你想出口一个整数的十六进制,或是二进制来查看这么些整型变量的中的位的事态。要完结那样,你能够采取GDB的多寡展示格式:

x 按十六进制格式彰显变量。
d 按十进制格式突显变量。
u 按十六进制格式呈现无符号整型。
o 按八进制格式突显变量。
t 按二进制格式显示变量。
a 按十六进制格式展现变量。
c 按字符格式显示变量。
f 按浮点数格式彰显变量。

(gdb) p i
$21 = 101

(gdb) p/a i
$22 = 0x65

(gdb) p/c i
$23 = 101 ‘e’

(gdb) p/f i
$24 = 1.41531145e-43

(gdb) p/x i
$25 = 0x65

(gdb) p/t i
$26 = 1100101

五、查看内存

您能够使用examine命令(简写是x)来查阅内部存款和储蓄器地址中的值。x命令的语法如下所示:

x/<n/f/u> <addr>

n、f、u是可选的参数。

n
是贰个正整数,表示展现内部存款和储蓄器的长度,也正是说从当下地点向后展现几个地方的剧情。
f
表示突显的格式,参见下边。假设地点所指的是字符串,那么格式能够是s,要是地十是命令地址,那么格式可以是i。
u
代表从当下地点以往呼吁的字节数,假若不点名的话,GDB默许是4个bytes。u参数能够用上面包车型客车字符来替代,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当大家钦赐了字节长度后,GDB会从指内部存储器定的内部存款和储蓄器地址起初,读写钦定字节,并把其看做三个值抽取来。

<addr>表示叁个内部存款和储蓄器地址。

n/f/u八个参数可以一并利用。举例:

指令:x/3uh 0x54320
表示,从内部存款和储蓄器地址0x54320读取内容,h表示以双字节为贰个单位,3代表三个单位,u表示按十六进制展现。

六、自动呈现

您能够安装有个别活动彰显的变量,当程序停住时,或是在您单步追踪时,这一个变量会自动展现。相关的GDB命令是display。

display <expr>
display/<fmt> <expr>
display/<fmt> <addr>

expr是二个表明式,fmt表示呈现的格式,addr表示内存地址,当你用display设定好了七个或多少个表达式后,只要您的次第被停下来,GDB会自动展现你所设置的这个表达式的值。

格式i和s一样被display帮助,三个老大有效的吩咐是:

display/i $pc

$pc是GDB的蒙受变量,表示着命令的地方,/i则意味输出格式为机械指令码,也正是汇编。于是当程序停下后,就能合世源代码和机械和工具指令码相对应的景观,那是三个很有意思的机能。

下边是部分和display相关的GDB命令:

undisplay <dnums…>
delete display <dnums…>
删除自动展现,dnums意为所设置好了的自发性显式的号码。若是要同期删除多少个,编号能够用空格分隔,如若要刨除多个限量内的数码,能够用减号表示(如:2-5)

disable display <dnums…>
enable display <dnums…>
disable和enalbe不删除自动展现的安装,而只是让其失效和卷土而来。

info display
翻看display设置的机关显示的消息。GDB会打出一张表格,向你告诉当然调节和测验中装置了略微个电动展现设置,当中包蕴,设置的数码,表明式,是还是不是enable。

七、设置显示选项

GDB中关于显示的选项很多,这里笔者只例举大多数常用的选项。

set print address
set print address on
开发地址输出,当程序展现函数新闻时,GDB会显出函数的参数地址。系统默感到张开的,如:

(gdb) f
#0 set_quotes (lq=0x34c78 “<<“, rq=0x34c88 “>>”)
at input.c:530
530 if (lquote != def_lquote)

set print address off
关门函数的参数地址呈现,如:

(gdb) set print addr off
(gdb) f
#0 set_quotes (lq=”<<“, rq=”>>”) at input.c:530
530 if (lquote != def_lquote)

show print address
翻看当前地方彰显选项是还是不是展开。

set print array
set print array on
开荒数组展现,展开后当数组展现时,每一种成分占一行,假如不打开的话,每种成分则以逗号分隔。那个选项暗许是关门的。与之相关的多少个指令如下,小编就不再多说了。

set print array off
show print array

set print elements <number-of-elements>
其一选项首即便安装数组的,假诺你的数组太大了,那么就足以钦点二个<number-of-elements>来钦点数量展现的最大尺寸,当达到这些尺寸时,GDB就不再往下显得了。倘诺设置为0,则象征不限定。

show print elements
翻开print elements的选项消息。

set print null-stop <on/off>
假定张开了这几个选项,那么当展现字符串时,际遇截止符则结束突显。这么些选项默以为off。

set print pretty on
万一张开printf pretty那么些选项,那么当GDB显示结构体时会比较突出。如:

$1 = {
next = 0x0,
flags = {
sweet = 1,
sour = 1
},
meat = 0x54 “Pork”
}

set print pretty off
关闭printf pretty那么些选项,GDB呈现结构体时会如下展现:

$1 = {next = 0x0, flags = {sweet = 1, sour = 1}, meat = 0x54 “Pork”}

show print pretty
查看GDB是哪些呈现结构体的。

set print sevenbit-strings <on/off>
安装字符展现,是不是按“\nnn”的格式彰显,假诺张开,则字符串或字符数据按\nnn显示,如“\065”。

show print sevenbit-strings
查看字符呈现开关是还是不是张开。

set print union <on/off>
安装突显结构体时,是或不是显式其内的联合体数据。举个例子有以下数据结构:

typedef enum {Tree, Bug} Species;
typedef enum {Big_tree, Acorn, Seedling} Tree_forms;
typedef enum {Caterpillar, Cocoon, Butterfly}
Bug_forms;

struct thing {
Species it;
union {
Tree_forms tree;
Bug_forms bug;
} form;
};

struct thing foo = {Tree, {Acorn}};

当展开那些按键时,实施 p foo 命令后,会如下展现:
$1 = {it = Tree, form = {tree = Acorn, bug = Cocoon}}

当关闭这一个开关时,试行 p foo 命令后,会如下展现:
$1 = {it = Tree, form = {…}}

show print union
翻开联合体数据的呈现格局

set print object <on/off>
在C++中,借使三个目标指针指向其派生类,若是展开那么些选项,GDB会自动遵照虚方法调用的规则展现输出,假使关闭那么些选项的话,GDB就不管虚函数表了。那几个选项暗中认可是off。

show print object
查看对象采用的安装。

set print static-members <on/off>
其一选项表示,当显示贰个C++对象中的内容是,是或不是出示在那之中的静态数据成员。暗许是on。

show print static-members
查看静态数据成员选项设置。

set print vtbl <on/off>
当此选项张开时,GDB将用比较规整的格式来展现虚函数表时。其暗中同意是停业的。

show print vtbl
查阅虚函数字展现示格式的选项。


八、历史记录

当您用GDB的print查看程序运转时的数据时,你每贰个print都会被GDB记录下来。GDB会以$1,
$2, $3
…..那样的不二秘技为你每一个print命令编上号。于是,你可以选拔那么些号码访谈在此以前的表明式,如$1。那几个成效所带来的补益是,假若您以前输入了四个相比较长的表达式,假如你还想查看那些表达式的值,你可以运用历史记录来访谈,省去了再次输入。

九、GDB情状变量

你能够在GDB的调和情状中定义自个儿的变量,用来保存一些调节和测量试验程序中的运维数据。要定义一个GDB的变量相当粗略只需。使用GDB的set命令。GDB的情况变量和UNIX同样,也是以$开端。如:

set $foo = *object_ptr

行使情状变量时,GDB会在你首先次采取时创制这一个变量,而在事后的采纳中,则直接对其賦值。境遇变量未有项目,你可以给情形变量定义任一的系列。包涵结构体和数组。

show convenience
该命令查看当前所设置的全部的景况变量。

那是一个相比强硬的效果,意况变量和次序变量的交互使用,将使得程序调节和测量检验更为灵活轻巧。举例:

set $i = 0
print bar[$i++]->contents

于是,当你就不要,print bar[0]->contents, print
bar[1]->contents地输入指令了。输入那样的授命后,只用敲回车,重复实行上一条语句,情况变量会活动抬高,进而成就各个出口的成效。

十、查看存放器

要翻开贮存器的值,很简短,能够利用如下命令:

info registers
查看存放器的情形。(除了浮点寄放器)

info all-registers
查阅全部存放器的动静。(包涵浮点贮存器)

info registers <regname …>
翻看所内定的寄放器的图景。

寄存器中放置了程序运转时的多少,比方程序当前运营的吩咐地址(ip),程序的日前酒店地址(sp)等等。你同样能够选取print命令来访问贮存器的情形,只要求在存放器名字前加一个$符号就能够了。如:p
$eip。

更换程序的实践
———————

假设采纳GDB挂上被调节和测验程序,当程序运营起来后,你可以依据本人的调节和测验思路来动态地在GDB中更动当前被调试程序的周转线路或是其变量的值,这些庞大的效劳能够令你越来越好的调节和测量检验你的主次,比方,你能够在程序的三次