一、直接调试

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 查看变量内存

  1. p <var> 查看变量值
  2. p/x <var> 查看变量二进制值值
  3. x/nfu <addr> 查看内存值。xexamine 的缩写
  • 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

五、参考资料

GDB vs LLDB