经文的GDB调试命令

⑥ 、自动彰显
您可以设置有个别活动突显的变量,当程序停住时,或是在您单步跟踪时,那几个变量会自动突显。相关的GDB命令是display。
display
display/
display/
expr是贰个表明式,fmt表示呈现的格式,addr代表内存地址,当您用display设定好了二个或八个表明式后,只要您的次第被停下来,GDB会自动呈现你所设置的这几个表明式的值。
格式i和s同样被display帮助,三个丰裕管用的通令是:
display/i $pc
$pc是GDB的环境变量,表示着命令的地点,/i则意味着输出格式为机械指令码,约等于汇编。于是当程序停下后,就会并发源代码和机械指令码相对应的事态,这是贰个很有意思的职能。
下面是一些和display相关的GDB命令:
undisplay
delete display
删去自动突显,dnums意为所设置好了的活动显式的号码。假使要同时删除多少个,编号可以用空格分隔,倘若要去除四个限制内的编号,能够用减号表示(如:2-5)
disable display
enable display
disable和enalbe不删除自动显示的设置,而只是让其失效和复苏。
info display
翻看display设置的自发性呈现的音讯。GDB会打出一张表格,向您告知当然调试中设置了不怎么个机关突显设置,其中囊括,设置的编号,表明式,是或不是enable。
7、设置展现选项
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 on

查看display设置的电动呈现的音讯。GDB会打出一张表格,向您告知当然调试中安装了稍稍个自动显示设置,其中囊括,设置的号子,表明式,是还是不是enable。

在您调试程序时,当程序被停住时,你可以利用print命令(简写命令为p),或是同义命令inspect来查阅当前程序的运营数据。print命令的格式是:

show print union

    p
*[email protected] 

set print sevenbit-strings
设置字符显示,是还是不是按“\nnn”的格式展现,如若打开,则字符串或字符数据按\nnn显示,如“65”。
show print sevenbit-strings
查阅字符显示开关是不是打开。
set print union
设置呈现结构体时,是还是不是显式其内的联合体数据。例如有以下数据结构:
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
在C++中,尽管1个对象指针指向其派生类,假诺打开那个选项,GDB会自动依照虚方法调用的平整显示输出,倘诺关闭那一个选项的话,GDB就不管虚函数表了。那一个选项暗中同意是off。
show print object
翻看对象采用的装置。
set print static-members
以此选项表示,当突显二个C++对象中的内容是,是不是出示中间的静态数据成员。默许是on。
show print static-members
查看静态数据成员选项设置。
set print vtbl
当此选项打开时,GDB将用比较规整的格式来显示虚函数表时。其暗许是关门的。
show print vtbl
查阅虚函数突显格式的选项。

typedef enum {Tree, Bug} Species;

    可以一贯用print数组名,就足以展现数组中全部数据的始最后。

一、表达式
print和广大GDB的下令一样,尚可一个表明式,GDB会依照方今的程序运转的数码来统计那几个表明式,既然是表明式,那么就足以是当下程序运维中的const常量、变量、函数等内容。可惜的是GDB不只怕采用你在先后中所定义的宏。
表明式的语法应该是当下所调试的言语的语法,由于C/C++是一种Chevrolet型的语言,所以,本文中的例子都以有关C/C++的。(而有关用GDB调试其它语言的章节,笔者将在末端介绍)
在表达式中,有三种GDB所支撑的操作符,它们可以用在任何一种语言中。
@
是三个和数组有关的操作符,在背后会有更详实的验证。
::
点名三个在文件可能3个函数中的变量。
{}
代表1个对准内存地址的连串为type的叁个对象。

disable和enalbe不删除自动展现的设置,而只是让其失效和苏醒。

    (4)set print null-stop

⑤ 、查看内存
你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:
x/
n、f、u是可选的参数。
n
是3个正整数,表示显示内存的长短,也等于说从如今地方向后展现多少个地方的故事情节。
f
表示展现的格式,参见下边。就算地点所指的是字符串,那么格式可以是s,假如地十是命令地址,那么格式能够是i。
u
表示从近年来地点今后呼吁的字节数,尽管不钦定的话,GDB默许是六个bytes。u参数可以用下边的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当大家钦点了字节长度后,GDB会从指内存定的内存地址开端,读写指定字节,并把其看成三个值取出来。
代表四个内存地址。
n/f/u多少个参数可以共同使用。例如:
指令:x/3uh 0x54320
表示,从内存地址0x54320读取内容,h表示以双字节为二个单位,3意味多个单位,u表示按十六进制突显。

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

设置展现结构体时,是或不是显式其内的联合体数据。

⑨ 、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地输入指令了。输入那样的下令后,只用敲回车,重复执行上一条语句,环境变量会活动抬高,从而形成每个出口的作用。

查阅静态数据成员选项设置。

    set print array on 

二 、程序变量
在GDB中,你可以每天查看以下二种变量的值:
一 、全局变量(全数文件可知的)
贰 、静态全局变量(当前文件可知的)
三 、局地变量(当前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”选项来消除那个标题。关于编译器的参数,还请查看编译器的接纳说明文档。

查阅所内定的寄存器的状态。

    delete display

捌 、历史记录
当您用GDB的print查看程序运转时的数量时,你每一个print都会被GDB记录下来。GDB会以$1,
$2, $3
…..这么的艺术为你每贰个print命令编上号。于是,你可以接纳那一个编号访问以前的表明式,如$1。那个效果所带来的便宜是,如若您从前输入了二个比较长的表明式,要是您还想查看这几个表明式的值,你可以运用历史记录来访问,省去了重复输入。

print bar[$i++]->contents

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

肆 、输出格式
一般的话,GDB会依照变量的门类输出变量的值。但你也足以自定义GDB的出口的格式。例如,你想出口1个平头的十六进制,或是二进制来查阅那个整型变量的中的位的气象。要马到成功这样,你可以接纳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

该命令查看当前所设置的拥有的环境变量。

    

print
print /
是表明式,是你所调试的先后的语言的表明式(GDB可以调节两种编程语言),是出口的格式,比如,倘若要把表达式按16进制的格式输出,那么就是/x。

 

        sweet = 1,

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
以此选项重假使安装数组的,假若您的数组太大了,那么就足以内定几个来钦定数量显示的最大尺寸,当到达那些尺寸时,GDB就不再往下显得了。借使设置为0,则意味不限量。
show print elements
翻开print elements的选项消息。
set print null-stop
一经打开了那几个选项,那么当突显字符串时,蒙受甘休符则截至呈现。这么些选项暗中认可为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是怎么样显示结构体的。

#0 set_quotes (lq=0x34c78″<<“, rq=0x34c88 “>>”)

eg:

三、数组
突发性,你要求查阅一段连接的内存空间的值。比如数组的一段,或是动态分配的数据的高低。你可以行使GDB的“@”操作符,“@”的左手是率先个内存的地点的值,“@”的左侧则你你想查看内存的长度。例如,你的次第中有那样的话语:
int *array = (int *) malloc (len * sizeof (int));
于是,在GDB调试进度中,你可以以如下命令突显出那个动态数组的取值:
*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数组名,就足以来得数组中拥有数据的内容了。

其一选项表示,当突显八个C++对象中的内容是,是还是不是出示中间的静态数据成员。默许是on。

    (1)n
是3个正整数,表示显示内存的长度,相当于说从脚下地方向后显得多少个地方的始末。

十 、查看寄存器
要查阅寄存器的值,很简单,可以应用如下命令:
info registers
查阅寄存器的事态。(除了浮点寄存器)
info all-registers
翻开全体寄存器的意况。(包蕴浮点寄存器)
info registers
查看所钦点的寄存器的动静。
寄存器中放置了程序运营时的数量,比如程序当前运营的命令地址(ip),程序的此时此刻堆栈地址(sp)等等。你同一可以应用print命令来访问寄存器的情事,只要求在寄存器名字前加三个$符号就足以了。如:p
$eip。

 

    

 

    (3)set print elements

相似的话,GDB会按照变量的项目输出变量的值。但您也可以自定义GDB的输出的格式。例如,你想出口四个平头的十六进制,或是二进制来查阅那么些整型变量的中的位的情况。要成功那样,你可以动用GDB的数码展现格式:

    info registers

set print object

    (2)set print array

p *array@len

如果打开了这一个选项,那么当突显字符串时,遇到甘休符则截至显示。那么些选项暗中认同为off。

info registers

  1. 出口格式

print /

倘若打开printf pretty那么些选项,那么当GDB彰显结构体时会相比较美丽。如:

$pc是GDB的环境变量,表示着命令的地方,/i则代表输出格式为机械指令码,约等于汇编。于是当程序停下后,就会油然则生源代码和机器指令码相对应的情形,那是三个很风趣的效率。

    d 按十进制格式突显变量。

$1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20,22, 24, 26, 28, 30, 32, 34, 36,
38, 40}

   
假设您的有个别变量和全局变量暴发争持(相当于重名),一般意况下是部分变量会暗藏全局变量。借使此刻您想查看全局变量的值时,你可以运用“::”操作符:

set print null-stop

    display/i $pc

(gdb) p/x i

  1. display自动突显的变量

于是乎,当您就不必,print bar[0]->contents, print
bar[1]->contents地输入指令了。输入那样的一声令下后,只用敲回车,重复执行上一条语句,环境变量会活动抬高,从而做到每一种出口的听从。

    x/3uh 0x54320
:从内存地址0x54320读取内容,h表示以双字节为贰个单位,3代表多个单位,u表示按十六进制展现。

u 代表从眼下地点未来呼吁的字节数,若是不点名的话,GDB暗中同意是陆个bytes。u参数能够用上边的字符来替代,b表示单字节,h表示双字节,w表示四字节,g表示八字节。当大家内定了字节长度后,GDB会从指内存定的内存地址先导,读写内定字节,并把其作为3个值取出来。

 

当此选项打开时,GDB将用相比较规整的格式来浮现虚函数表时。其暗许是关闭的。

    

伍 、查看内存

    使用examine(简写x)来查阅内存地址中的值。语法:

set print pretty on

  1. print 操作符 @ 是三个和数组有关的操作符,在前边会有更详尽的讲明。 ::
    内定三个在文书或…

show convenience

    {}

at input.c:530

    file::variable

打开地址输出,当程序突显函数新闻时,GDB会显出函数的参数地址。系统暗中同意为打开的,如:

    f 按浮点数格式显示变量。

(gdb) p/t i

    }

f 按浮点数格式突显变量。

    (gdb) p/c i

set print vtbl

    t 按二进制格式呈现变量。

expr是3个说明式,fmt表示显示的格式,addr表示内存地址,当你用display设定好了1个或七个表明式后,只要您的次序被停下来,GDB会自动彰显你所设置的这几个表明式的值。

    disable和enalbe不删除自动显示的设置,而只是让其失效和回复。

当打开那一个开关时,执行 p foo 命令后,会如下突显:

    表示八个针对内存地址的种类为type的二个目的。

$24 = 1.41531145e-43

    print xxx

display/i $pc

    info registers

530 if (lquote != def_lquote)

  1. 考察内容

GDB中有关突显的选项相比多,那里小编只例举大部分常用的选项。

   
寄存器中放置了程序运营时的数目,比如程序当前运行的命令地址(ip),程序的日前堆栈地址(sp)等等。你一样可以采纳print命令来访问寄存器的气象,只需求在寄存器名字前加1个$符号就可以了。如:p
$eip。

print和诸多GDB的授命一样,能够承受一个表达式,GDB会依照当下的程序运维的数据来统计这么些表达式,既然是表明式,那么就足以是如今程序运转中的const常量、变量、函数等内容。可惜的是GDB不恐怕利用你在先后中所定义的宏。

这几个选项重假使设置数组的,如果你的数组太大了,那么就可以钦定一个来钦点数量显示的最大尺寸,当到达那么些长度时,GDB就不再往下显得了。如若设置为0,则意味不限定。

意味着3个内存地址。

        },

是表达式,是您所调试的顺序的言语的表达式(GDB可以调剂三种编程语言),是出口的格式,比如,如若要把表达式按16进制的格式输出,那么就是/x。

开拓数组显示,打开后当数组显示时,各种成分占一行,假诺不打开的话,各种成分则以逗号分隔。

剔除自动突显,dnums意为所设置好了的活动显式的号码。如若要同时删除多少个,编号可以用空格分隔,假如要删减二个范围内的编号,可以用减号表示(如:2-5)

    (3)u
表示从脚下地方将来呼吁的字节数,假如不钦命的话,GDB暗中同意是肆个bytes。u参数可以用下边的字符来取代,b表示单字节,h表示双字节,w表示四字
节,g表示八字节。当大家指定了字节长度后,GDB会从指内存定的内存地址先导,读写内定字节,并把其看作1个值取出来。

 

GDB print详解

翻看当前地点突显选项是还是不是打开。

    $23 = 101 ‘e’

::

    (5)set print pretty on

$1 = {it = Tree, form = {tree = Acorn, bug= Cocoon}}

    

set print union

 

您可以安装有个别自动突显的变量,当程序停住时,或是在您单步跟踪时,这一个变量会自行突显。相关的GDB命令是display。

    u 按十六进制格式彰显无符号整型。

四 、输出格式

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

typedef enum {Big_tree, Acorn, Seedling}Tree_forms;

    (6)set print union

show print static-members

    a 按十六进制格式突显变量。

print

  1. 观测寄存器

set print address off

    查看文件f2.c中的全局变量x的值:

借使打开了这些选项,那么当呈现字符串时,碰着截止符则为止彰显。那几个选项暗中同意为off。

    enable display

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

    (2)其他

 

    x/

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

    是三个和数组有关的操作符,在后边会有更详尽的认证。

display/

    

set print array on

    

查阅字符突显开关是不是打开。

  1. print 操作符

在C++中,即使二个目的指针指向其派生类,倘使打开这么些选项,GDB会自动依照虚方法调用的平整显示输出,若是关闭这几个选项的话,GDB就随便虚函数表了。那些选项暗中同意是off。

    $1 = {

一 、全局变量(全体文件可见的)

    next = 0x0,

闭馆printf pretty这一个选项,GDB展现结构体时会如下突显:

    info display

格式i和s同样被display协助,3个万分实惠的命令是:

    $22 = 0x65

(gdb) p/a i

    $1 = {2, 4, 6, 8, 10}

delete display

eg:

导语

    钦命1个在文书可能一个函数中的变量。

set $foo = *object_ptr

eg:

$21 = 101

  1. 着眼数组

n/f/u三个参数可以协同利用。例如:

(4)查看所内定的寄存器的事态。

file::variable

    p xxx

表达式的语法应该是近期所调试的语言的语法,由于C/C++是一种Volkswagen型的言语,所以,本文中的例子都以关于C/C++的。

eg:

x 按十六进制格式呈现变量。

    (1)set print address

表示三个针对内存地址的品种为type的2个对象。

    (1)格式:display[/i|s] [expression | addr]

(gdb) f

    (gdb) p/a i

show print sevenbit-strings

    $21 = 101

⑨ 、GDB环境变量

http://www.bkjia.com/Linuxjc/558545.htmlwww.bkjia.comtruehttp://www.bkjia.com/Linuxjc/558545.htmlTechArticleGDB print详解 print命令的格式是: print xxx p xxx

};

    info all-registers

八 、历史记录

    (gdb) p
*[email protected]

翻开对象拔取的设置。

    ::

} form;

        sour = 1

$22 = 0x65

(3)查看全部寄存器的气象。(包含浮点寄存器)

(gdb) p *array@len

eg:

{}

  1. 着眼内存

@

    

在GDB中,你可以天天查看以下三种变量的值:

    @

贰 、程序变量

    flags = {

$1 = {

   
注:借使你的次序编译时打开了优化增选,那么在用GDB调试被优化过的程序时,只怕会时有发生一些变量不可以访问,或是取值错误码的景色。对付这种情状时,须要在编译程序时关闭编译优化。GCC,你能够利用“-gstabs”
选项来消除那些标题。

本来,“::”操作符会和C++中的爆发争持,GDB能自动识别“::”是不是C++的操作符,所以你不要顾虑在调试C++程序时会出现十分。

    gdb) p ‘f2.c’::x 

set print address

删去自动显示,dnums意为所设置好了的自发性显式的编号。借使要同时删除多少个,编号可以用空格分隔,假使要去除五个限制内的数码,可以用减号表示(如:2-5)

info registers

    disable display

}

在C++中,即便贰个目的指针指向其派生类,假诺打开那些选项,GDB会自动按照虚方法调用的条条框框显示输出,若是关闭这一个选项的话,GDB就随便虚函数表了。

#0 set_quotes (lq=”<<“,rq=”>>”) at input.c:530

    (gdb) p i

meat = 0x54 “Pork”

    

本条选项重假诺安装数组的,即使你的数组太大了,那么就足以钦赐多个来内定数量显示的最大尺寸,当到达那几个尺寸时,GDB就不再往下显得了。固然设置为0,则象征不限量。

print命令的格式是:

当你用GDB的print查看程序运营时的数目时,你每三个print都会被GDB记录下来。GDB会以$1,
$2, $3
…..那样的措施为您每三个print命令编上号。于是,你可以使用这么些编号访问以前的表明式,如$1。那么些意义所推动的功利是,如若您从前输入了一个相比较长的表达式,若是你还想查看那个表达式的值,你可以行使历史记录来访问,省去了双重输入。

    (7)set print object

info all-registers

$pc是GDB的环境变量,表示着命令的地址,/i则象征输出格式为机械指令码,约等于汇编。于是当程序停下后,就会产出源代码和机械指令码相对应的处境,那是1个很有意思的作用。

Tree_forms tree;

    c 按字符格式展现变量。

function::variable

(2)查看寄存器的气象。(除了浮点寄存器)

show print array

    全局变量(全部文件可见的)

Bug_forms bug;

 

有时,你需求查阅一段连接的内存空间的值。比如数组的一段,或是动态分配的数据的轻重缓急。你可以采取GDB的“@”操作符,“@”的右边是首先个内存的地址的值,“@”的右手则你你想查看内存的长短。例如,你的顺序中有那般的话语:

    set print address on

翻开print elements的选项信息。

    o 按八进制格式彰显变量。

(gdb) f

    静态全局变量(当前文件可知的)

当关闭这些开关时,执行 p foo 命令后,会如下呈现:

    

set print array off

开拓地址输出,当程序呈现函数音讯时,GDB会显出函数的参数地址。

翻看寄存器的情况。(除了浮点寄存器)

    meat = 0x54 “Pork”

翻开虚函数突显格式的选项。

    (1)动态数组:

除此以外,须要注意的是,假使您的顺序编译时打开了优化增选,那么在用GDB调试被优化过的先后时,大概会暴发一些变量不大概访问,或是取值错误码的情形。这么些是很健康的,因为优化程序会删改你的程序,整理你程序的话语顺序,剔除一些抽象的变量等,所以在GDB调试那种程序时,运转时的一声令下和您所编写指令就有不雷同,也就会现出你所想象不到的结果。对付那种状态时,必要在编译程序时关闭编译优化。一般的话,大约全数的编译器都协理编译优化的开关,例如,GNU 的C/C++编译器GCC,你可以采取“-gstabs”选项来缓解这几个题材。关于编译器的参数,还请查看编译器的应用表达文档。

 

 

    array:数组的首地址,len:数据的长度

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

 

⑦ 、设置显示选项

  1. 设置

set print elements

(1)要翻开寄存器的值,很简短,可以采纳如下命令:

要是打开printf pretty这些选项,那么当GDB突显结构体时会相比出色。如:

    function::variable

set $i = 0

    

设置字符突显,是还是不是按“\nnn”的格式展现,假若打开,则字符串或字符数据按\nnn显示,如“65”。

    (2)静态数组

六 、自动突显

    x 按十六进制格式展现变量。

翻看联合体数据的显示形式

    (2)f
表示突显的格式,参见上面。借使地点所指的是字符串,那么格式可以是s,如果地十是命令地址,那么格式能够是i。

t 按二进制格式显示变量。

    undisplay

查看GDB是哪些体现结构体的。

a 按十六进制格式彰显变量。

show print object

翻开display设置的机关突显的音信。GDB会打出一张表格,向你告诉当然调试中安装了某些个电动突显设置,其中包罗,设置的编号,表明式,是还是不是enable。

三、数组

c 按字符格式显示变量。

 

Bug_forms;

show print address

sweet = 1,

(gdb) p/c i

set print sevenbit-strings

关闭函数的参数地址突显,如:

},

$23 = 101 ‘e’

set print static-members

show print elements

比方是静态数组的话,可以一贯用print数组名,就足以体现数组中拥有数据的始最后。

530 if (lquote != def_lquote)

show print vtbl

(gdb) p/f i

即使你的一对变量和全局变量暴发争执(即重名),一般情状下是局部变量会隐藏全局变量,相当于说,假设一个全局变量和2个函数中的局地变量同名时,若是当前甘休点在函数中,用print呈现出的变量的值会是函数中的局地变量的值。如若那时你想查看全局变量的值时,你能够行使“::”操作符:

f 表示显示的格式,参见上面。假诺地点所指的是字符串,那么格式可以是s,假设地十是命令地址,那么格式可以是i。

你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:

struct thing {

(gdb) p i

flags = {

undisplay

行使环境变量时,GDB会在你首先次拔取时创制那个变量,而在此后的采用中,则间接对其赋值。环境变量没有项目,你可以给环境变量定义任一的项目。包含结构体和数组。

sour = 1

Species it;

是八个和数组有关的操作符。

在表明式中,有两种GDB所协助的操作符,它们可以用在其它一种语言中。

gdb) p ‘f2.c’::x

下边是局地和display相关的GDB命令:

typedef enum {Caterpillar, Cocoon,Butterfly}

enable display

那是2个比较强硬的听从,环境变量和顺序变量的彼此使用,将使得程序调试更为灵活便捷。例如:

 

命令:x/3uh
0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为三个单位,3象征多个单位,u表示按十六进制突显。

$1 = {it = Tree, form = {…}}

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

于是乎,在GDB调试进程中,你可以以如下命令突显出这一个动态数组的取值:

设置呈现结构体时,是还是不是显式其内的联合体数据。例如有以下数据结构:

 

点名1个在文书或者一个函数中的变量。

(gdb) set print addr off

要查看寄存器的值,很简短,可以利用如下命令:

$25 = 0x65

 

@的右边是数组的首地址的值,也等于变量array所指向的内容,左侧则是数据的尺寸,其保存在变量len中,其出口结果,大致是底下这些样子的:

info display

n 是五个正整数,表示突显内存的长度,相当于说从当下地方向后显得几个地方的情节。

union {

u 按十六进制格式突显无符号整型。

show print pretty

开拓数组突显,打开后当数组彰显时,逐个成分占一行,假使不打开的话,每一种成分则以逗号分隔。这一个选项暗许是关闭的。与之唇揭齿寒的四个指令如下,小编就不再多说了。

x/

d 按十进制格式突显变量。

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

set print pretty off

$26 = 1100101

寄存器中放置了程序运行时的数据,比如程序当前运营的一声令下地址(ip),程序的此时此刻堆栈地址(sp)等等。你同样能够利用print命令来访问寄存器的场馆,只需求在寄存器名字前加一个$符号就可以了。如:p
$eip。 

disable display

set print array

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

十 、查看寄存器

next = 0x0,

 

o 按八进制格式显示变量。

一、表达式

二 、静态全局变量(当前文件可知的)

你可以在GDB的调节环境中定义自身的变量,用来保存一些调试程序中的运行数据。要定义三个GDB的变量很不难只需。使用GDB的set命令。GDB的环境变量和UNIX一样,也是以$起初。如:

查看全部寄存器的意况。(包涵浮点寄存器)