GDB调试技巧
一、直接调试
1.1 启动与停止
run
/r
启动程序set args <arg1> <arg2>
设置程序运行参数finish
结束当前函数的运行,函数剩余部分会执行完毕return
立即结束当前函数执行并返回,可带参数返回
1.2 调试指令:
step
/next
执行下一行(进入函数)/(不进入函数)disassemble
查看汇编命令stepi
/nexti
执行下一条汇编指令 (进入函数)/(不进入函数)jmp
跳转指令info r
查看寄存器值。info
可以简写为i
bt
查看调用路径
堆栈用途:
- rdi rsi rdx rcx r8 r9 寄存器依次存放函数前6个参数
- 更多的参数放在栈中
- 函数返回值保存在 rax 中
1.3 查看变量内存
p <var>
查看变量值p/x <var>
查看变量二进制值值x/nfu <addr>
查看内存值。x
是examine
的缩写
-
n表示要显示的内存单元的个数
-
f表示显示方式, 可取如下值:
- x 按十六进制格式显示变量。
- d 按十进制格式显示变量。
- u 按十进制格式显示无符号整型。
- o 按八进制格式显示变量。
- t 按二进制格式显示变量。
- a 按十六进制格式显示变量。
- i 指令地址格式
- c 按字符格式显示变量。
- f 按浮点数格式显示变量。
-
u表示一个地址单元的长度
- b表示单字节,
- h表示双字节,
- w表示四字节,
- g表示八字节
二、Attach调试
2.1 本机attach进程
gdb program pid
gdb program 进入gdb后attach pid
如果没有权限
- 如果uid相同,运行程序之后看看有没有改变uid,例如passwd程序
- root权限 echo 0 > /proc/sys/kernel/yama/ptrace_scope
2.2 gdb_server远程调试
- gdb_server运行在target上
- gdb运行在host上
- GDB Remote serial protocol/RSP协议
三、CoreDump调试
3.1 程序异常终止产生了core文件
- 保存路径:保存在程序执行路径,修改 /proc/sys/kernel/core_pattern可以修改
- 文件名: 默认core, root权限修改:
echo 1 > /proc/sys/kernel/core_uses_pid
后变为core.pid - 文件格式:ELF
- 包含信息:内存状态、寄存器状态、堆栈指针、内存管理信息、函数调用堆栈信息
3.2 程序异常终止不产生core文件原因
- 资源限制 ulimit -c unlimited修改
- 权限问题 core文件生成目录没有写权限,要注意程序运行过程中有没有降权或者改变权限
3.3 调试方法
- gdb program <core_file_name>
- bt 查看调用栈
四、辅助脚本:
gdb init + 高级脚本提高调试效率
- peda
- pwndbg
- gef