gdb 调试命令

转自:http://lubobill1990.blog.163.com/blog/static/369303862010913105122718/

常用查看命令

  • 寄存器(也可以使用print 寄存器名称查看)
    • info registers 查看寄存器情况(浮点寄存器除外)
    • info all-registers 查看所有寄存器情况
    • info registers <regname> 查看指定寄存器情况
  • 栈信息
    • backtrace 打印所有栈
      • backtrace <n> 只打印上n层栈信息
      • backtrace <-n> 只打印下n层栈信息
    • frame 当前栈层简要信息
    • up <n> 查看上一层栈
      • up-silently <n>
    • down <n> 查看下一层栈
      • down-silently <n>
    • info frame 详细的栈层信息
    • info args 函数参数名及其值
    • info locals 当前函数所有局部变量及其值
    • info catch 当前函数异常处理信息
  • 源程序
    • list 当前行后的源代码
      • list <lineNum> 某行的源代码
      • list <fileName:lineNum>
      • list <first>,<last> 行数范围内的源代码
      • list <function> 某函数的源代码
      • list <fileName:function>
      • list – 当前行前的源代码
      • list +往后显示源代码
      • list <+/- offset>
      • set listsize <count> 设置一次显示的行数
      • show listsize 显示设置的参数
  • 源代码内存
    • info line
    • disassemble 查看源程序汇编码
      • disassemble <function>

变量操作命令

  • 查看单个数据
    • print [/<f>] <expr> / <f>输出格式(十六进制/x) <expr>表达式
    • print $编号 每个print都会被编号,使用编号可以查询以前查询过的表达式
  • 输出格式
    • x 十六进制格式显示变量
    • d 十进制格式显示变量
    • u 十六进制格式显示无符号整型
    • o 八进制格式显示变量
    • t 二进制格式显示变量
    • a 十六进制格式显示变量
    • c 字符格式显示变量
    • f 浮点数格式显示变量
  • 查看变量类型
    • whatis <变量>
  • 修改变量的值(修改运行时的变量值)
    • print <变量>=<赋值>
    • set [var] <变量>=<赋值> 加var是为了防止变量名和gdb配置文件中的变量名相同,因为set <变量>=<赋值>同样可以修改gdb配置文件
  • 全局变量和局部变量
    • 如果全局变量和局部变量名称相同,通过名称访问局部变量,通过file::<变量>访问全局变量
  • 表达式
  • 数组
    • print *array@len 查看动态分配内存的数组的值
  • 查看内存
    • x / <n/f/u> <addr>
      • n表示正整数表示显示内存长度
      • f表示显示格式,s地址所指的是字符串,i地址是指令地址,输出指令,u浮点
      • u从当前地址往后请求的字节数,b单字节,h双字节,w四字节,g八字节
  • 变量自动显示
    • display 每当遇到断点,都将自动显示出来
    • undisplay <dnums…> delete display <dnums…>
    • disable display <dnums…>
    • enable display <dnums…>
    • info display 打印自动显示项目的信息

程序断点运行调试命令

  • 断点操作
    • break <function>
    • break <lineNum>
    • break +/- offset
    • break filename:lineNum
    • break filename:function
    • break *address
    • break <arguments> if <condition>
    • info breakpoint
  • 观察点操作
    • watch <expr> 一旦表达式值有变化,停止程序
    • rwatch <expr> 当变量被读,停止程序
    • awatch <expr> 当变量被读写,停止程序
    • info watchpoints 列出所有观察点
  • 捕捉点操作 捕捉程序运行时的事件
    • catch <event> throw catch exec fork vfork load[libname] unload[libname]
    • tcatch <event> 只设置一次捕捉点,当程序停止,自动删除该点
  • 重载函数的断点维护
  • 各种断点的维护
    • clear 清除断点
      • clear <function>
      • clear <fileName:function>
      • clear <lineNum>
      • clear <fileName:lineNum>
    • delete 删除所有断点
      • delete 断点号或者断点范围
    • disable 禁用所有断点
      • disable 断点号或者断点范围
    • enable 开启断点
      • enable [breakpoints] once range… 当程序在该点停止后,马上禁用该断点
      • enable [breakpoints] delete range… 当程序在改点停止后,马上删除该断点
    • 条件断点维护 当条件成立时,停止程序
      • condition <bnum> <expr> 修改断点号为bnum的停止条件是expr
      • condition <bnum> 清除断点号为bnum的停止条件
      • ignore <bnum> <count> 忽略bnum停止条件count次
    • 断点自动化操作 当调试程序停止,自动执行命令
      • commands [bnum]

command-list end break foo if x>0 commands printf “x is %dn”,x end 单步调试

  • step <count> 单步调试,可以进入函数
  • next <count> 单步调试,不进入函数
  • continue/c/fg [ignore-count] 程序继续运行,忽略断点次数 count次
  • finish 运行程序直到当前程序完成返回,并且打印返回时的堆栈地址,返回值和参数值
  • until 运行程序直到推出循环体
  • stepi nexti 单步跟踪一条机器指令,display/i $pc

信号调试

  • handle <signal> <keywords>
    • signal 定义收到什么信号之后产生操作,可以是单个信号,信号范围,all
    • keywords 定义收到信号后执行什么操作
      • nostop 打印信息表示收到信号,但不停止
      • stop 收到信号停止程序
      • print 收到信号显示信息
      • noprint 收到信号不显示信息
      • pass/noignore 收到信号,gdb不处理,把信号交给调试程序处理
      • nopass/ignore 收到信号,gdb不会让被调试程序处理
    • info signals/info handle 哪些信号在被gdb检测
    • signal <signal> 信号量1~15

多线程调试

  • break <linespec> thread <threadno> [if…]
    • linespec 断点行号
    • threadno 指定线程id,id由gdb分配,通过info threads来查看,如果不设置,表示对所有线程
    • if 用来指定条件

程序控制命令

  • 跳转控制命令
    • jump <linespec> 跳转行
    • jump <address>/set $pc=<address> 跳转地址
  • 函数控制命令
    • return [expr] 强制函数返回
    • call <expr>/print <expr> 强制函数调用

gdb环境设置命令

  • 运行环境设置
    • set args
    • show args
    • path <dir>
    • show paths
    • set environment varname [=value]
    • show environment [varname]
    • cd <dir>
    • pwd
  • 显示设置 每个设置都可以通过show print xxoo来查看,每个set都是on/off
    • set print address 显示函数时是否显示地址信息
    • set print array 不打开,元素以逗号分隔,打开,每个元素占一行
    • set print elements
    • set print pretty
    • set print seven-bit-strings
    • set print union
    • set print object
    • set print static-members
    • set print vtbl
  • 环境变量
    • set $abc=*object_ptr;
  • 搜索源代码
    • [forward-]search <regexp>
    • reverse-search <regexp>
  • 指定源文件路径
    • directory <dirname>