avatar

Catalog
GDB Commen Instructions

Commen Instructions

以下指令都在进入GDB终端之后使用~

  • 运行文件

    • 添加参数:

      sh
      1
      2
      3
      4
      5
      set args [arg1] [arg2] ... Or
      r -[arg1] -[arg2] ...

      # check args
      show args
    • 开始运行:

      • run: 默认情况下,run 指令会一直执行程序,直到执行结束。如果程序中手动设置有断点,则 run 指令会执行程序至第一个断点处;
      • start: 指令会执行程序至 main() 主函数的起始位置,即在 main() 函数的第一行语句处停止执行(该行代码尚未执行)。
  • 运行过程中

    • 代码执行命令:

      • next(n):单步执行,如果有函数调用,不会进入该函数
      • step/s:单步执行,如果有函数调用,会进入该函数
      • 🌟si🌟:单步执行(汇编语句)
      • continue(c):继续运行 
      • set step-mode on/off:打开/关闭step-mode模式,该模式使得在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码
      • finish:运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息
      • until(u):当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体
    • 打印某个变量的值print/p val

      Code
      1
      2
      3
      4
      5
      6
      7
      8
      x 按十六进制格式显示变量。
        d 按十进制格式显示变量。
        u 按十六进制格式显示无符号整型。
        o 按八进制格式显示变量。
        t 按二进制格式显示变量。
        a 按十六进制格式显示变量。
        c 按字符格式显示变量。
        f 按浮点数格式显示变量。

      其他详细用法可见GDB print 高级用法

    • 观察点 Watchpoint :观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程 序。我们有下面的几种方法来设置观察点:

      • watch:为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
      • rwatch:当表达式(变量)expr被读时,停住程序。
      • awatch:当表达式(变量)的值被读或被写时,停住程序。
      • info watchpoints:列出当前所设置了的所有观 察点。
    • 断点 Breakpoint

      • 断点添加方式
        如果想在指定的地址设置断点,比如在main函数的地址出设断点。可用info add main 获得main的地址如0x80484624,然后用break *0x80484624。条件断点就是在如上述指定断点的同时指定进入断点的条件。

        sh
        1
        2
        3
        4
        5
        6
        7
        8
        9
        # 普通断点
        break 10
        break test.c:10
        break main
        break test.c:main
        break 10 if index == 3

        tbreak test.c:l0 # 临时断点(只生效一次的断点)
        ignore 1 30 # 跳过多次设置断点,该命令的含义是将断点1跳过30次
      • 查看断点info breakpoints/break

      • 禁用/启动断点

        sh
        1
        2
        3
        4
        5
        disable  				    # 禁用所有断点
        disable bnum # 禁用断点bnum
        enable # 启用所有断点
        enable bnum # 启用断点bnum
        enable delete bnum # 启动断点bnum,并且在此之后删除该断点
      • 删除断点

        sh
        1
        2
        delete  					# 删除所有breakpoints, watchpoints和catchpoints
        delete bnum # 删除断点号为bnum的断点
  • 查看当前状态

    • 打开/关闭源代码展示窗口tui enable/disable (还能显示PC)

    • 🌟反汇编🌟disassemble/disas

    • 当前汇编代码layout asm

    • 当前寄存器信息layout reg

    • 查看堆栈信息

      • backtrace/bt :打印当前的函数调用栈的所有信息

        sh
        1
        2
        3
        4
        5
        # example
        (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/bt <-n> 表示只打印栈底下n层的栈信息。

      • frame/f :会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。

      • info frame/f :这个命令会打印出更为详细的当前栈层的信息(大多数都是运行时地址)。比如:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。

        sh
        1
        2
        3
        4
        5
        6
        7
        8
        9
        (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
      • 其他信息:

        sh
        1
        2
        3
        4
        5
        info args					# 打印出当前函数的参数名及其值。
        info locals # 打印出当前函数中所有局部变量及其值。
        info catch # 打印出当前的函数中的异常处理信息。

        list linenum/funciton/first, last # 显示源代码
  • 其他

    • 定位段错误
      • 简单方法:调用gdb后输入 file a.out,然后再输入run,就能发现段错误所在位置,然后通过p 变量指令,查询所在位置变量的值的情况。
      • 利用core文件定位
Author: Yiwen Zhang
Link: http://bessss-zyw.github.io/2021/04/18/about-gdb/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶