GDB常用指令

发布时间 2023-03-27 22:18:40作者: 吃饭端住碗
  • gdb模式
    • set logging on:设置日志开关
    • set logging off
    • show logging
    • set logging file 日志文件:设置日志文件名,默认名称为gdb.txt
  • 启动gdb调试
    • gdb 可执行文件:使用gdb运行并调试程序(程序被暂停,可以设置启动参数、断点等操作)
    • gdb attach pid:使用gdb附件已有进程
  • [r]run:运行程序
    • run 命令行参数
    • run >输出文件:将输出重定向到输出文件
  • 继续执行
    • [c]continue
    • continue 次数:继续执行并跳过当前断点N次
  • 继续执行直到当前函数执行完成
    • finish
  • step:单步执行(会进入函数)
    • s 5
  • next:逐过程执行(不会进入函数)
    • n 5
  • q:退出gdb
  • 断点
    • [b]break 文件名:行号
    • break 函数名(如果多个函数名相同或多个地方都调用了函数,则会为所有的函数都设置断点)
    • break 类名::函数名
    • rbreak(rb) 正则表达式:通过正则表达式设置断点(如fun*)
    • b+5、b-5:通过偏移量设置断点,为当前行的前面某一行或后面某一行设置断点
    • b 断点 条件:设置条件断点,满足条件时暂停(b chaper.cpp:39 if i==90)
    • b *地址:如果调试程序没有符号信息,可以在(函数)地址上设置断点
    • tb 断点:设置临时断点,只命中一次,然后会被自动删除
    • disable/enable 断点编号:禁用/启动断点
      • disable 4-10:禁用一个断点编号范围
    • enable once 断点编号:启用断点一次
    • enable delete 断点编号:启动断点一次并删除
    • enable count 数量 断点编号:启用断点并命中N次
    • ignore 断点编号 次数:忽略断点前N次命中,直到第N+1次命中时运行才暂停
  • 查看断点
    • [i b]info breakpoints [断点编号]
    • info break [断点编号]
    • info b [断点编号]
    • i b [断点编号]
  • 删除断点
    • delete:删除所有断点
    • 删除指定编号断点
      • delete 2
      • delete 2 3
      • delete 2-5
      • delete 2-5 7-10
    • clear 函数名:删除指定函数断点
    • clear 文件名:行号 :删除指定行号断点
  • [i agrs]info agrs:查看当前函数参数
  • [p]print 变量名:命中断点后,查看变量值
  • print 变量名=值:修改查看到的变量值
  • 使用gdb内嵌函数或表达式进行计算或比较操作
    • p sizeof(int)
    • p 12 * 12
    • p 12 > 10
    • p strcmp("123","12")
    • p strlen("test")
  • 查看指针对象
    • p new_node->name:查看指针对象new_node的name属性
    • p *new_node:查看指针对象new_node的所有属性
    • set print pretty:美化显示结构体
  • 查看数组对象
    • set print array on:美化显示数组
    • p strarr:显示数组strarr
  • 自动显示变量的值
    • display 变量名:每次程序暂停自动显示变量名
    • display {var1,var2,var3}:每次程序暂停自动显示多个变量名(这些变量的长度必须相同,比如都是整型变量;如果长度不同,则需要分开使用)
    • info display:查看已经设置的自动显示的变量名
    • 取消变量的自动显示
      • undisplay 变量编号
      • delete display 变量编号
      • undisplay / delete display:取消所有的变量自动显示
    • disable display 变量编号:暂时禁用变量自动显示
    • enable display 变量编号:恢复变量自动显示
  • 查看源代码
    • [l]list:显示当前断点前后各5行的源代码
    • l-:往后显示10行
    • set listsize 20:设置list每次显示的源代码行数
    • show listsize:查看listsize的大小设置
    • list 函数名:查看指定函数的代码
    • list 文件名:行号 :查看指定文件的指定行代码
    • list 100:查看当前文件的指定代码行
  • x /选项 地址:查看内存
    • x str:默认以16进制显示
    • x /s str:指定以字符串形式显示
    • x /d str:指定以10进制显示
    • x /4d str:指定以10进制显示并指定宽度
    • x &number:显示数值的内存信息
    • x命令并不局限于查看变量的内存信息,无论是函数地址、变量地址还是其他合法地址都可以访问
  • 查看栈回溯信息
    • [bt]backtrace
    • bt 栈帧数量:查看指定数量的栈帧(如果后面跟的是一个正数,则从0开始计数;如果是一个负数,则从最大的栈帧编号开始倒序计数)
    • backtrace full:显示所有栈帧的局部变量
  • [f]frame 2:切换栈帧
    • f 帧地址:切换到指定帧地址的帧
    • up 1:切换到上一个帧
    • down 1:切换到下一个帧
    • info args:查看当前帧所有的函数参数
    • i locals:查看当前帧所有局部变量的值
    • [i f 1]info frame 1:不用切换栈帧,查看对应编号帧的详细信息(包括帧地址、rip地址、函数名、函数参数等信息)
  • 线程管理
    • [i]info threads:查看当前进程所有的线程信息(及当前线程)
    • thread 线程ID:切换到指定线程
    • break 断点 thread 线程ID:为特定线程设置断点
    • thread apply 线程号 命令:为线程执行命令
      • thread apply 2 3 p local_data
      • thread apply all bt:查看所有线程回溯信息,在大型程序的调试中很有用,比如死锁的调试
  • 观察点
    • watch 变量或表达式:当为变量或一个表达式设置观察点后,该变量或表达式的值在发生变化时,程序会发生中断,并且在变量或表达式发生改变的地方暂停。
      • watch count==5
    • rwatch 变量或表达式:当该变量或表达式被读取时,程序会发生中断
    • awatch 变量或表达式:无论这个变量是被读取还是被写入,程序都会发生中断,即只要遇到这个变量就会发生中断
    • info watchpoints:查看所有观察点
    • delete/disable/enable 观察点编号: 禁用/启用删除观察点
      • 观察点是一种特殊的断点,可以通过管理断点的方式来管理观察点
  • 捕获点
    • catch 事件:程序在发生某事件时,gdb能够捕获这些事件并使程序停止执行
    • 可以捕获的事件如下所示:
      • throw:在C++代码中执行throw语句时程序会中断
      • catch:当代码中执行到catch语句块时会中断,也就是说代码捕获异常时会中断
      • exec、fork、vfork:调用这些系统函数时会中断
      • load/unload:加载或卸载动态库时
  • 搜索源代码
    • search 正则表达式、forward-search 正则表达式:在当前文件中从前向后搜索满足正则表达式的代码,如果满足则显示行号和对应的代码。如果要继续往后搜索,可以继续输入search命令或按下Enter命令。
    • reverse-search 正则表达式:反向搜索代码
    • dir 目录名:添加目录到源代码搜索路径中
    • dir:清空添加到源代码搜索目录的目录
    • show directories:查看源代码搜索目录
  • 查看变量类型
    • ptyppe 可选参数 变量或类型:查看变量或结构体及类等详细信息。
    • 可选参数用来控制显示信息,如下:
      • /r:表示以原始数据的方式显示,不会代替一些typedef定义。
      • /m:查看类时,不显示类的方法,只显示成员变量
      • /M:与/m相反,显示类的方法(默认选项)
      • /t:不打印类中的typedef数据
      • /o:打印结构体字段的偏移量和大小
  • 跳转执行
    • jump 位置
      • jump 36:跳转到第36行
      • jump 函数名:跳转到指定函数
  • 窗口管理
    • 命令窗口、源代码窗口、汇编窗口、寄存器窗口
    • layout next:显示下一个窗口
    • layout prev:显示前一个窗口
    • layout src:只显示源代码窗口
    • layout asm:只显示汇编窗口
    • layout split:显示源代码和汇编窗口
    • layout regs:显示寄存器窗口,与源代码及汇编窗口一起显示
    • focus next | prev | src | asm | regs | split:设置窗口为活动窗口,以便能够响应上下滚动键
    • refresh:刷新屏幕
    • update:更新源代码窗口
    • tui disable:关闭除命令窗口以外的其他窗口
  • 执行shell命令
    • shell 命令
    • !命令
  • 内存检查
    • 内存泄漏:程序中动态分配的堆内存由于某些原因未被程序释放
    • 内存破坏:对内存执行写操作的时候由于超出了内存本身的大小(堆/栈溢出)而写入到其他地方,导致其他内存块被写入数据,严重情况下会导致程序崩溃。
    • 访问错误内存
  • 远程调试
    • 方式一:
      • 源端:gdbserver x.x.x.x:port 执行程序
      • 远端:
        • gdb
        • target remote x.x.x.x:port
    • 方式二:
      • 源端:gdbserver x.x.x.x:port --attach 83096
      • 远端:
        • gdb
        • target remote x.x.x.x:port