简单命令
gdb test 运行程序target
gdb test --args test 1 2 3运行程序test ,且参数列表(args)为[test,1,2,3]
show args 显示args
set args 修改args
上下键可以查看命令历史(tui中,如果选中的不是cmd窗口,快捷键功能会被替换成别的)
如果忘记了用法,可以help command
,可以看某个command的用法,比如help p
b 断点
info b 查看断点
del或者clear 删除断点
ingore (ignore N COUNT)忽略断点N,次数为COUNT,即前COUNT次断点不触发
start 运行(自动在main函数处停下)
r 运行(如果没断点就不停)
c 继续运行
j(jump) (参考)跳到某个位置(它不是快进到某个位置
,它是直接跳转到那个位置
,它不会运行中间的指令),我不常用,不是特别清楚,需要了解可以参考这个示例(Linux GDB jump 命令介绍)。
n 下一行代码
s 进入函数
ni 下一条指令
si 进入函数(汇编级)
n 10 运行10行代码
ni 10 运行10条指令
until 退出循环
finish 退出函数(相当于是快进)
return 退出函数(它是强制退出,跳过了中间的指令)
call 调用函数
l 显示代码
bt 查看堆栈
p 打印变量
x 参数为内存地址,打印内存(help x
查看用法)
info reg all 打印所有寄存器
info reg rsp 打印rsp寄存器(简写i r rsp
)
p r s p 打 印 r s p 寄 存 器 ( 注 意 , 这 里 需 要 加 ‘ rsp 打印rsp寄存器(注意,这里需要加` rsp打印rsp寄存器(注意,这里需要加‘`符号,而上面命令那个不需要)
p $xmm0.v2_double 打印xmm0寄存器(认为它存的是两个double)
tui相关命令(参考)
layout src 显示源码
layout asm 显示汇编
layout reg 显示寄存器
layout split 显示多个窗口
tui reg general 显示通用寄存器
tui reg all 显示所有寄存器
tui enable 打开tui
tui disable 关闭tui
ctrl+x, a
关闭tui
ctrl+L
刷新窗口
update
更新tui
focus cmd 选中命令窗口
info threads 查看线程信息
info frame 查看帧信息
frame N 切换帧
edit location 修改代码(默认编译器是ex,没用过,不过可以改成vim)
info float 查看浮点器硬件
info vector 查看向量寄存器状态
中级功能
- 条件断点(参考),比如
b foo if a==1
,条件成立是触发断点 - 监控断点(参考),当我们监控的变量/寄存器/内存发生变化时,触发断点。比如
watch var_i
,watch *(int*)0x7fff123456
,watch $rsp
- 临时断点(断点只生效一次),命令为
tbreak
,简写为tb
- 自动打印变量(每次程序暂停,都自动打印,个人感觉打印太多时看着有点闹心)命令为
display
- 临时变量
- 修改变量或者寄存器或者内存的值(参考)
- 执行shell命令(在命令前输入shell即可,比如
shell clear
就相当于是执行了shell中的clear命令,清屏) - 管道命令(在命令前输入pipe即可,比如
pipe disassemble main | tee main.s
就相当于把main函数的汇编代码通过管道重定向到了main.s文件中,在tui中管道命令好像会失效)