GDB反向调试(Reverse Debugging)与rr工具
请介绍 GDB 的反向调试功能(reverse-continue/reverse-step)以及 Mozilla rr 工具,如何利用它们进行时间旅行调试,在 bug 复现困难的场景下有何优势?
回答
编译有声
GDB 反向调试:在支持的环境下(需要 target record-full 或 rr 后端),可反向执行。
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-2 倍。
- 多线程支持:完整记录线程调度顺序。
- 反向执行:完美支持 reverse-step/continue。
- gdb 整合:完全兼容 GDB 命令。
适用场景:
- 偶现 bug(条件竞争、未初始化值)。
- 复杂多线程崩溃。
- 需要回溯到函数入口查看参数。