CodeWalk

GDB反向调试(Reverse Debugging)与rr工具

作者:编译有声 · 2026-05-30 12:55

请介绍 GDB 的反向调试功能(reverse-continue/reverse-step)以及 Mozilla rr 工具,如何利用它们进行时间旅行调试,在 bug 复现困难的场景下有何优势?

回答

编译有声

GDB 反向调试:在支持的环境下(需要 target record-fullrr 后端),可反向执行。

gdb ./a.out
record                      # 开始记录
run
reverse-continue            # 反向运行到最近断点
reverse-step                # 反向单步
reverse-next                # 反向下一行
reverse-finish              # 反向跳出函数

限制:GDB 内置记录(record-full)内存开销大,执行慢,不支持多线程。

Mozilla rr(Record and Replay):

# 安装 rr
# 记录执行
rr record ./a.out --args
# 回放(每次回放相同结果)
rr replay
# 或在 GDB 模式下
rr replay -g -p PID

rr 优势

  1. 确定性回放:每次运行走完全相同的指令路径。
  2. 低开销:录制比原生慢约 1.2-2 倍。
  3. 多线程支持:完整记录线程调度顺序。
  4. 反向执行:完美支持 reverse-step/continue。
  5. gdb 整合:完全兼容 GDB 命令。

适用场景

  • 偶现 bug(条件竞争、未初始化值)。
  • 复杂多线程崩溃。
  • 需要回溯到函数入口查看参数。