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)")