gdb 常用命令

2022-03-27

PS: 更新于2024-05-09

这篇博客的主要目的是记录一下gdb调试的常用命令

gdb的可用命令实在是太多了,有很多重要的command,但是你不用就会忘记

所以需要记录一下(之后我好翻哈哈哈)

1. gdb调试程序命令

命令 作用
gdb program 调试程序

2. gdb常见命令

命令 作用
run arg 不设置断点,直接运行程序
start arg 设置断点在main,并运行至main函数
starti arg 设置断点在_start,并运行至_start函数
attach pid 附加一个正在运行的程序
core PATH 调试程序的dump文件
continue (c) 继续执行程序直到断点
info registers 输出所有寄存器的值
print (p) $rdi 输出rdi寄存器的值,也可以通过p/x $rdi打印十六进制
x/nuf address 查看内存的值,n是数量,u是类型,即b(1 byte)/h(2 bytes)/w(4 bytes)/g(8 bytes), f是格式,即x(十六进制),d(十进制),s(string),i(instruction),address可以是绝对地址,寄存器值,或计算表达式
disassemble(disas) main 反汇编main函数的值
set disassembly-flavor intel 设置反汇编的形式为intel
stepi(si) num 步进,会进入函数调用,num表示步数
nexti(ni) num 步过,不会进入函数调用,num表示步数
finish 完成当前函数运行
break(b) *address 在地址下断点
display/nuf 每执行完一次指令后显示的内容,nuf参数与x命令相同
layout regs 进入TUI(文本用户界面)模式,按ctrl+x+a返回普通模式
set expr 设置某个值,比如 set $rdi=0, set *((uint64_t *) $rsp) = 0x1234, set *((uint16_t *) 0x31337000) = 0x1337
call (ret type)func(arg) 直接调用函数
set unwindonsignal on 该选项开启时,gdb在收到信号时,会尝试还原到调用信号前的状态
set unwindonsignal off 该选项关闭时,gdb在收到信号时,会停在收到信号的指令的位置,该指令已经被执行
delete(d) num 删除断点
info breakpoints 查看断点信息
backtrace bt 查看函数调用栈
frame f 查看当前栈帧
print p 打印变量
info locals 查看局部变量
thread num 切换线程
until 执行到指定行
info signals 查看信号
handle signal keyword(stop/nostop print/noprint/ pass/nopass) 处理信号
watch expr 设置写观察点
rwatch expr 设置读观察点
awatch expr 设置读写观察点

3. gdb script用法

gdb script文件的语法就是通常的gdb命令,可以使用:

gdb program  -x <PATH_TO_SCRIPT>

或者:

gdb program -ex <COMMAND>

来运行命令,一个gdb script的文件可以是如下的形式:

set disassembly-flavor intel
start
break *main+709
commands
  silent
  set $local_variable = *(unsigned long long*)($rsi)
  printf "Current value: %llx\n", $local_variable
  continue
end
continuenue

另一个形式:

start
catch syscall read
commands
  silent
  if ($rdi == 42)
    set $rdi = 0
  end
  continue
end
continue

4. gdb多线程调试命令

命令 作用
info threads 查看线程ID
thread ID(1,2…) 根据info threads提供的ID号来切换线程
thread apply ID1 ID2 command 可以让相应线程执行相同的命令
thread apply command 让所以线程执行相同命令
set scheduler-locking off/on/step 设置调试线程时其他线程的状态(on是只有被调试线程会运行,off是所有线程都执行
b xxxx thread thread-num 设置线程断点

5. gdb命令参考文档

100个gdb小技巧
上述文档是10年前出的,已经比较老旧了,新的gdb功能就没有记录其中,有一个比较重要的更新:
non-stop的用法

set non-stop on
set pagination off
set target-async on

https://www.cnblogs.com/WindSun/p/12785322.html

6. pwndbg rebase功能

具体用法如下:

b *$rebase(offset)

非常方便!!在你运行开启了pie和aslr的程序时,不需要你自己计算偏移下断点。

在pwntools下可以这么用

gdb.attach(io,"b *$rebase(0x27C3)")