Computer Science Radar

GDB

命令 作用
启动
gdb <program> [core dump] 指定程序启动,可选core文件
gdb <-p|--pid> <pid> 附加到运行中的进程上,可选带参数
gdb --args <program> <args...> 带参数
gdb <program> -ex <'command'> 执行命令
gdb -batch <program> 处理后退出,可结合-ex执行命令,比如 gdb -batch -ex 'run' a.out
运行和停止
q[uit] 退出
r[un] [args...] 运行,可选带参数
k[ill] 停止程序
Ctrl-C 终止当前命令
Ctrl-D 退出
信息
where/b[ack]t[race]/i[nfo] stack 显示当前地址和调用栈
i[nfo] b[reakpoints] 显示所有断点信息
i[nfo] watchpoints 显示所有观察点信息
i[nfo] r[egisters] 显示寄存器内容
i[nfo] args 显示函数参数
i[nfo] proc m[appings] 显示内存映射信息
i[nfo] signals 显示信号量设置
i[nfo] inferiors 显示 gdb 中的所有进程
maint[enance] i[nfo] sections 显示段信息
h[elp] 帮助信息
断点和观察点
b[reak] 在当前代码执行位置设置断点
b[reak] <functionName> 对指定函数入口设置断点
b[reak] <lineNumber> 对指定代码行设置断点
b[reak] *<address> 对指定地址设置断点
rb[reak] <RegEx> 对符合正则表达式的函数名设置断点
tb[reak] 设置临时断点,遇到一次后清除
watch <expression> 对表达式设置观察点,内存内容改变时停止
rwatch <expression> 发生读行为时停止
awatch <expression> 发生访问(读写)时停止
catch syscall [name|number] 遇到指定系统调用时停止
conmm[ands] <i> 每当停在断点 i 时,执行设置的命令
cond[ition] <i> <expression> 满足表达式中的条件时,才会停在断点处
ignore <i> <n> n 次忽略断点 i
d[elete] [i] 删除所有断点,删除编号为 i 的断点
disable [i] 禁用所有断点,禁用编号为 i 的断点
enable [i] 启用所有断点,启用编号为 i 的断点
clear [functionName] 清除所有断点,清除设置在函数名上的断点
调试
s[tep] [n] 执行 1 或 n 次
n[ext] [n] 执行 1 或 n 次,不进入函数调用
s[tep]i [n] 执行 1 或 n 条汇编语句
n[ext]i [n] 执行 1 或 n 条汇编语句,不进入函数调用
c[ontinue] 继续运行直到下一个断点
u[ntil] <i> 继续运行直到遇到编号为 i 的断点
fin[ish] 继续运行直到当前函数返回
reverse-stepi 反向执行指令
打印与内存
p[rint] /f <expression/register> 按格式打印表达式或寄存器内容。
x(16), d(10), u(unsigned), o(8), t(2), a(addr), c(char), f, s(string), z(zero-pad hex)
x /nfu <address> n-数量,f-格式:x, i(instructions), s,u-单位:b(1), h(2), w(4), g(8)
set [var] x = 10 修改变量 x 的值为 10
源代码
l[ist] 显示当前代码行的附近 10 行
l[ist] <line1, line2> 显示代码行范围内的代码
l[ist] <functionName> 显示函数附近的 10 行代码
l[ist] *<address> 显示地址附近的 10 行代码
dir [dirname] 置空源代码路径,添加目录到源路径
show directories 显示源路径
窗口
tui enable/Ctrl-X + a 启用 TUI
tui disable/Ctrl-X + a 禁用 TUI
refresh/Ctrl-L 刷新窗口
Ctrl-X + 1/2 单/双窗口模式
layout src/asm/regs 显示源代码/汇编/寄存器窗口
layout split 同时显示源代码和汇编
layout next/prev 显示下一个/上一个窗口
f[ocu]s src/asm/regs/cmd 聚焦在源代码/汇编/寄存器/指令窗口
反汇编
disas[semble] [functionName] 反汇编当前函数,反汇编指定函数
disas[semble] <address> 反汇编指定地址处的函数
disas[semble] <addr1 addr2> 反汇编地址范围内的代码
其它
show commands 显示历史命令
shell <command> [args...] 执行 shell 中的命令
set logging on 记录所有输出保存在 gdb.txt

GDB dashboard§

Modular visual interface for GDB in Python

curl https://raw.githubusercontent.com/cyrus-and/gdb-dashboard/master/.gdbinit > ~/.gdbinit

GEF§

GDB Enhanced Features - a modern experience for GDB with advanced debugging features for exploit developers & reverse engineers

bash -c "$(curl -fsSL https://gef.blah.cat/sh)"

peda§

Python Exploit Development Assistance for GDB

git clone https://github.com/longld/peda.git ~/peda
echo "source ~/peda/peda.py" >> ~/.gdbinit

Reference§

  1. x86-64 GDB cheat sheet (cmu.edu)
  2. Useful commands in gdb (stanford.edu)
  3. gdb.pdf (brown.edu)