尘世间的上帝之国

View Original

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>