澳门威尼斯人网址查看运维时数据

五、查看内部存款和储蓄器

也足以由此info stack命令完成类似的成效(小编更爱好这一个命令):

   
临时候,你必要查阅一段连接的内部存款和储蓄器空间的值。比如数组的一段,或是动态分配的数据的高低。你能够运用GDB的“@”操作符,“@”的右边手是第1个内部存储器的地点的值,“@”的左侧则你你想查看内存的尺寸。举例,你的前后相继中有这么的话语:
     
        int *array = (int *) malloc (len * sizeof (int));
        
   
于是,在GDB调节和测验进度中,你能够以如下命令突显出那个动态数组的取值:

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

       
(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

format的取值范围有如下三种:

   
假设是静态数组的话,能够平昔用print数组名,就能够来得数组中装有数据的剧情了。

  • <linenum>    行号。
  • <+> [offset]    当前行号的正偏移量。
  • <-> [offset]     当前行号的负偏移量。
  • <filename:linenum> 文件的中的行行。
  • <function>             函数的代码
  • <filename:function>     文件中的函数。
  • <*address> 程序运营时的口舌在内部存款和储蓄器中的地点。

   
你能够设置有些机关展现的变量,当程序停住时,或是在您单步追踪时,这几个变量会自行展现。相关的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中,你能够随即查阅以下二种变量的值:
        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会依据变量的类别输出变量的值。但您也得以自定义GDB的输出的格式。举例,你想出口二个平头的十六进制,或是二进制来查看那么些整型变量的中的位的动静。要做到那样,你能够应用GDB的多寡展现格式:
    
    x  按十六进制格式突显变量。
    d  按十进制格式展现变量。
    u  按十六进制格式展现无符号整型。
    o  按八进制格式展现变量。
    t  按二进制格式彰显变量。 
    a  按十六进制格式展现变量。
    c  按字符格式展现变量。
    f  按浮点数格式呈现变量。

    print [</format>] <expr>

    
四、输出格式

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

三、数组

当程序被停住了,首先要承认的正是前后相继是在哪里被断住的。这一个貌似是因而翻看调用栈音信来看的。在gdb中,查看调用栈的下令是backtrace,能够简写为bt。

   
你能够使用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>表示二个内部存款和储蓄器地址。

查阅三回九转内部存款和储蓄器

   
@的左臂是数组的首地址的值,也正是变量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}

  • undisplay <dnums…>        不显示dispaly
  • delete display
    [dnums]    删除自动展现,不带dnums参数则删除全体机动展现,也支撑范围删除,如:
    delete display 1,3-5
  • disable display <dnums…>    使display失效
  • enable display <dnums…>    恢复display
  • info display        查看display信息

翻看运转时数据
———————

    
   
在您调节和测量检验程序时,当程序被停住时,你能够使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运作数据。print命令的格式是:
    
    print <expr>
    print /<f> <expr>
       
<expr>是表达式,是你所调节和测量试验的先后的语言的表达式(GDB能够调整各类编制程序语言),<f>是出口的格式,比方,若是要把表达式按16进制的格式输出,那么正是/x。
        
    
一、表达式

当程序断住是,gdb会展现当前断点的职位:

       
p *array@len

    int foo()
    {
        return 100;
    }

   
n/f/u八个参数能够一并使用。举例:
    
    命令:x/3uh 0x54320
表示,从内部存款和储蓄器地址0x54320读取内容,h表示以双字节为八个单位,3意味多少个单位,u表示按十六进制呈现。
    
    
六、自动呈现

查看函数重回值

   
print和无数GDB的一声令下同样,还可以一个表明式,GDB会根据当前的程序运转的数量来测算这么些表明式,既然是表明式,那么就足以是当前程序运营中的const常量、变量、函数等内容。缺憾的是GDB无法运用你在前后相继中所定义的宏。
    
   
表明式的语法应该是日前所调节和测量检验的言语的语法,由于C/C++是一种大众型的言语,所以,本文中的例子都以关于C/C++的。(而至于用GDB调节和测量检验别的语言的章节,作者将在前边介绍)
    
    在表明式中,有三种GDB所帮衬的操作符,它们得以用在此外一种语言中。
    
    @
        是四个和数组有关的操作符,在后面会有更详实的辨证。
        
    ::
        内定八个在文件只怕二个函数中的变量。
        
    {<type>} <addr>
        表示三个对准内存地址<addr>的花色为type的多少个目的。
        
        
二、程序变量

查阅内部存款和储蓄器

不精晓是或不是出于focus相比较新的因由,貌似网络并从未稍微小说介绍它,就算它相比易于上手,但也可能有那几个能够介绍的地点,限于篇幅作者那边就不做更加多的证实,感兴趣的相恋的人可以看下gdb的gui用法那篇文章。

在VisualStudio中,能够通过监视窗口动态查看变量的值。在gdb中,也提供了相近的一声令下display,它的语法是:

list命令前边还足以更有个别参数,来显示更加的多效益:

查看函数再次回到值是在调解的长河中不常碰到的供给。比方,对于如下函数

举个例子,对于如下代码:int arr[] = {2, 4, 6, 8,
10};,能够经过如下命令查看arr前多个单元的数目。

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

    (gdb) p *arr@3
    $2 = {2, 4, 6}

其一界面比起list来讲方便多了,能高亮当前说话的实行职位,步进时也会随着变动,有一点点使用Turbo
C的感觉。

澳门威尼斯人网址 1

  1. 透过finish命令运转至函数结束,此时会打字与印刷函数重返值。

机动呈现

    (gdb) finish
    Run till exit from #0 foo () at main.c:9
    main () at main.c:15
    15 }
    Value returned is $2 = 100

expr是八个表明式,fmt表示呈现的格式,addr代表内存地址。当你用display设定好了八个或八个表明式后,只要您的次第被停下来(单步追踪时),GDB会自动呈现你所设置的这几个表明式的值。

    (gdb) p $eax
    $3 = 100

多少个相关的命令如下:

然则,即便有那个音讯,查看代码照旧相当的小方便。今后新版的gdb都带贰个tui的功效,能够透过focus命令开启,其重大分界面如下:

    Breakpoint 1, pop () at stack.c:10
    10 return stack[top–];

gdb中查阅变量的授命是print,日常用它的简写方式p。它的语法如下:

    (gdb) info stack
    #0 pop () at stack.c:10
    #1 0x080484a6 in main () at main.c:12

其间参数expr能够是贰个变量,也足以是表明式。format表示输出格式,比方,能够用/x来将结果按16进制输出。如下是几个宗旨的例证:

翻看栈音信

    (gdb) x /16uh arr
    0xbffff4cc: 2 0 4 0 6 0 8 0
    0xbffff4dc: 10 0 34032 2052 0 0 0 0

可以用list命令来查阅当前断点紧邻的主次的源代码:

  • n 表示展现内部存款和储蓄器的长度,也正是说从当下地点向后显得多少个地方的剧情。

  • f 表示突显的格式,若是是字符串,则用s,如若是数字,则足以用i。

  • u
    代表从如今地点以往呼吁的字节数,暗中认可是4个bytes。(b单字节,h双字节,w四字节,g八字节)

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

    (gdb) p top
    $16 = 1
    (gdb) p &top
    $17 = (int *) 0x804a014 <top>
    (gdb) p 3+2*5
    $18 = 13
    (gdb) p /x 3+2*5
    $19 = 0xd

  1. 重返值会积存在eax寄放器中,通过查阅音讯方可获得重临值。

翻开运维时数据

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

能够利用GDB的”@”操作符查看一而再内部存款和储蓄器,”@”的左边手是率先个内存的地址的值,”@”的左手则你你想查看内部存款和储蓄器的长度。

    (gdb) bt
    #0 pop () at stack.c:10
    #1 0x080484a6 in main () at main.c:12

    (gdb) list
    5 int top = -1;
    6
    7
    8 char pop(void)
    9 {
    10 return stack[top–];
    11 }
    12
    13 void push(char c)
    14 {

诸如:以两字节为单位展现后面的老大数组的地址后32字节内部存款和储蓄器消息如下.

    (gdb) info registers 
    eax 0x64 100

相关文章