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>