一、什么时候用
你的程序崩溃了,但你想看崩溃前的状态(比如变量是什么时候变成非法值的)。
# 启动调试
(gdb) record # 开始记录执行轨迹
(gdb) run # 运行程序
...
Program received signal SIGSEGV # 崩溃了
# 现在可以反向执行
(gdb) reverse-continue # 往回执行,停在崩溃点的"前一条语句"
(gdb) print ptr # 看到 ptr 是 nullptr 或野指针
(gdb) reverse-step # 一步步往回走
(gdb) watch ptr # 观察 ptr 是什么时候改变的
(gdb) reverse-continue # 继续往回走,停在 ptr 被修改的地方
(gdb) print caller # 终于找到是谁把 ptr 改坏了
二、限制
GDB 的反向执行需要记录每条指令的执行轨迹。
内存占用:每 1 秒的执行记录大约需要 100MB+ 的内存。
所以只适合调试非常短的崩溃场景(从崩溃前 1 秒开始往回查)。