GDB print

1.命令格式:print 变量名 

    简写为: p 变量名

2. print 操作符

    @
    是一个和数组有关的操作符,在后面会有更详细的说明。
    ::
    指定一个在文件或是一个函数中的变量。
    {}
    表示一个指向内存地址的类型为type的一个对象。
 

3. 察看内容

    全局变量(所有文件可见的)
    静态全局变量(当前文件可见的)

    局部变量(当前Scope可见的)

    如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量。如果此时你想查看全局变量的值时,你可以使用“::”操作符:
    file::variable
    function::variable
eg:
    查看文件f2.c中的全局变量x的值:
    gdb) p 'f2.c'::x 
    
    注:如果你的程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。对付这种情况时,需要在编译程序时关闭编译优化。GCC,你可以使用“-gstabs” 选项来解决这个问题。
    

4. 查看数组

    (1)动态数组:

        p *array@len 
        array:数组的首地址,len:数据的长度
        eg:
           (gdb) p *array@len
           $1 = {2, 4, 6, 8, 10}

    (2)静态数组

         可以直接用print数组名,就可以显示数组中所有数据的内容了。
    

5. 输出格式

    x 按十六进制格式显示变量。
    d 按十进制格式显示变量。
    u 按十六进制格式显示无符号整型。
    o 按八进制格式显示变量。
    t 按二进制格式显示变量。
    a 按十六进制格式显示变量。
    c 按字符格式显示变量。
    f 按浮点数格式显示变量。
   eg:
       (gdb) p i
       $21 = 101
       (gdb) p/a i
       $22 = 0x65
      (gdb) p/c i

      $23 = 101 'e'

    

6. 查看内存

    使用examine(简写x)来查看内存地址中的值。语法:
    x/
    n、f、u是可选的参数。
    (1)n 是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。
    (2)f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
    (3)u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示               单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,               读写指定字节,并把其当作一个值取出来。
     eg:

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

7. 查看寄存器

(1)要查看寄存器的值,很简单,可以使用如下命令:
    info registers
(2)查看寄存器的情况。(除了浮点寄存器)
    info all-registers
(3)查看所有寄存器的情况。(包括浮点寄存器)
    info registers
(4)查看所指定的寄存器的情况。
    寄存器中放置了程序运行时的数据,比如程序当前运行的指令地址(ip),程序的当前堆栈地址(sp)等等。你同样可以使用print命令来访问寄存器的情况,只需要在寄存器名字前加一个$符号就可以了。如:p $eip。
    

8. display自动显示的变量

    (1)格式:display[/i|s] [expression | addr]
          eg:
              display/i $pc
              $pc是GDB的环境变量,表示着指令的地址,/i则表示输出格式为机器指令码,也就是汇编。于是当程序停下后,就会                  出现源代码和机器指令码相对应的情形,这是一个很有意思的功能。
    (2)其他
          undisplay
          delete display
          删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个            范围内的编号,可以用减号表示(如:2-5)
    
         disable display
         enable display
         disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。
         info display
         查看display设置的自动显示的信息。GDB会打出一张表格,向你报告当然调试中设置了多少个自动显示设置,其中包括,           设置的编号,表达式,是否enable。
    

9. 设置

    (1)set print address
             set print address on
             打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。
   (2)set print array
            set print array on 
            打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。
  (3)set print elements
           这个选项主要是设置数组的,如果你的数组太大了,那么就可以指定一个来指定数据显示的最大长度,当到达这个长度               时,GDB就不再往下显示了。如果设置为0,则表示不限制。
 (4)set print null-stop
          如果打开了这个选项,那么当显示字符串时,遇到结束符则停止显示。这个选项默认为off。
 (5)set print pretty on
         如果打开printf pretty这个选项,那么当GDB显示结构体时会比较漂亮。如:
         $1 = {
           next = 0x0,
           flags = {
               sweet = 1,
               sour = 1
           },
           meat = 0x54 "Pork"
        }
    
(6)set print union
      设置显示结构体时,是否显式其内的联合体数据。
(7)set print object
      在C++中,如果一个对象指针指向其派生类,如果打开这个选项,GDB会自动按照虚方法调用的规则显示输出,如果关闭这        个选项的话,GDB就不管虚函数表了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值