GDB的进程记录是如何工作的?

逆向工程 数据库 调试器
2021-06-27 07:08:45

GDB 的一个奇怪而有用的功能是过程记录,它允许分析人员在执行过程中前进和后退,编写程序状态更改的连续日志,从而可以非常准确地回放程序代码。

尽管我们都可以肯定地说进程记录日志包含可执行文件对各种数据和控制寄存器的更改,但其功能远不止保留当前延续的一些序列化表示。例如,我已经能够具体化使用线程修改共享内存的可执行文件的状态。

当然,我们不能指望时间相关的代码可以工作,但是如果修改共享状态的线程代码通常可以向后步进并仍然可靠地再次工作,那么除了纯粹的架构挑战(即位移步进)之外,进程记录还有什么限制?文档中指定的?

1个回答

该功能在GDB wiki上有更详细的描述

怎么运行的

进程记录和重放的工作原理是记录子进程(被调试的程序)中每条机器指令的执行,以及机器状态(内存和寄存器的值)的每个相应变化。通过以相反的顺序连续“撤消”机器状态中的每个更改,可以将程序的状态恢复到执行中较早的任意点。然后,通过“重做”原始顺序的更改,程序状态可以再次向前移动。

本演示文稿描述了更多内部结构。

除了上述之外,对于某些远程目标,GDB 可以通过发送远程串行协议数据包(向后继续)和(向后步骤)来利用其“本机”反向执行这些目标包括 bcbs

  • 小精灵模拟器
  • 西米斯
  • VMware 工作站 7.0
  • SID 模拟器(xstormy16 架构)
  • 使用 valgrind 的编年史 gdbserver
  • 撤销数据库