简图记录-GDB调试基础
简图记录学习~
一、概念
GDB: GNU开源组织发布的类unix环境上 ,针对待调试信息的可执行文件(编译带-g参数)调试工具。
功能:主要提供了各类运行指令和停止点进行程序执行控制,提供程序状态(变量/表达式)、栈信息、寄存器、内存的内容查看
启动方式:1、直接启动 gdb test 2、带core文件启动 gdb test core.txt 3、通过绑定进程号调试 gdb test 5
日志管理(默认关闭、不覆盖):
1、开关日志 set logging on/off 2、修改日志名 set logging file wuya.txt
3、查看日志状态show logging 4、设置日志覆盖 set logging overwrite on/off
二、基本运行控制指令
三、停止点指令启动程序运行: run [启动参数]
继续执行:(到下一个停止点)continue [忽略停止点数]; (到函数尾)finsh
单步执行:(单步)step [步数] ;(单步且不进入调用函数)next [步数] ;(不进入函数且不在循环停止)until [步数]
中断当前函数立即返回执行:return [返回参数]
设置运行参数:set args XXXX
概念:停止点用于方便执行暂停
分类:断点(主动设置在某行、某函数、某地址处)、观察点(当某个表达式被读写时) 、捕获点(事件发生)
删除方法:停止点删除方式一样,通过clear 函数名/行号 清除指定处停止点、delete 停止点号 删除对应编号停止点、enable/disable 停止点号 进行使能去使能
1、断点:
2、观察点:查看断点:info breakpoints
添加断点:break 位置信息(可为:[文件名;]行号; [文件名;]函数名 ;+位置偏移;-位置偏移;*地址)
添加条件断点:break 位置信息 if 条件
查看观察点:info watchpoints
添加观察点:(表达式值变化)watch 表达式;(表达式被读)rwatch 表达式;(表达式被读写)awatch 表达式
3、捕获点:
查看捕获点:info catchpoints
添加捕获点:catch 事件(可为:throw异常抛出 catch异常捕获 excec/fork/vfork对应函数调用 load/unload [库名]库加载卸载)
添加一次捕获后自动消除捕获点:tcatch 事件
四、查看指令
1、查看源码
显示源码:list [显示位置] (缺省表示继续显示当前位置)
位置可为:[文件名:]行号 指定文件指定行号位置;[文件名;]函数名 指定文件指定函数位置;+[偏移量] 往下偏移处继续显示;-[偏移量] 往前继续显示;
设置显示行数:set listsize 行数
搜索源码:1、全部搜索 search 表达式 2、正向搜索 forword-search 表达式 3、反向搜索 reverse-search 表达式
2、查看运行数据(修改变量 set 变量名=值)
打印表达式:print [/指定打印格式] 表达式
表达式可为:变量名(防止重名覆盖 文件名::变量名 函数名::变量名);算术表达式;预处理宏名;数组(a[0]@10表示打印a[0]开始10个元素)
打印格式可为:x十六进制 o八进制 t二进制 d十进制 u无符号十进制 a地址形式 c字符 f浮点
自动打印(设置后可以在可见时自动打印):display 变量名 (查看 info display ;删除 undisplay 变量名)
3、栈内容
概念:gdb把每次函数调用产生的栈内容为1帧frame,从栈顶开始按0给帧编号
打印栈调用信息:backtrace [缺省:所有调用信息/数目:从栈顶打印指定数目调用(-n表示从栈底)/full:打印调用和变量]
打印帧信息:(默认为栈顶序号0帧,可用frame 帧编号 指定帧,或者up 上移动编号 down 下移动编号 进行帧编号调整)
打印当前帧信息(包括帧地址、调用地址、函数入参地址和值):info frame
打印当前帧 函数参数:info args
打印当前帧 局部参数:info locals
4、寄存器
打印非浮点非向量寄存器: info register
打印所有寄存器: info all-register
打印指定寄存器: info register 寄存器名
5、打印内存
x/[内存长度n 显示格式f 多少字节作为值显示u ] 地址
显示格式 和 print格式一致;
多少字节作为值显示:w 4字节(默认)、b 1字节、h 2字节、g 8字节
如 x/4uw 0x123456 (从0x123456地址开始打印4个地址,每个地址按4字节打印内容,打印格式按无符号十进制)