今日目标是把之前的代码改完,并且至少支持 C/S 类型的程序。

第一步是重新梳理一下,auto 模式和 manual 模式分别到底发生了什么,进而能够在代码中对两种写法进行分开/耦合。

事实上,auto 模式可以视为一种机器提供操作的 manual 模式。因而可以优先分析 Manual。

手动模式下,大致是这样的流程:

  • 启动 tracee,推进到初始状态后停下
  • 等待用户输入,首先是切换“焦点”。进而是“执行一步”。

此时,running 为全局第一个 state。

“执行一步”都做了什么?

  • 首先,作为手动模式,一般来说是顺着往下走,一般来说无须进行自动的状态恢复。
  • 在某一位置触发了 Choose。此种情况并不需要进行 ckpt,因而只需要停下来,并询问 Choose 应当产生的结果。
  • 一步执行结束。需要进行 ckpt。如果用户并未指定切换焦点,则下一步仍然在当前的焦点上进行。
  • 当然,delete last_running; last_running = running;

ckpt 到底做了什么?

  • 将当前的状态放到 running 中。并且序列化然后写盘
  • 也许写盘的操作可以在内存压力不大的情况下省去。用正经一点的话来说,就是“改变存储引擎为磁盘/内存”
    • 但是这个好像并不是瓶颈,不首先考虑。

一个小问题。

1
__attribute__((constructor)) dwarf_init();

中,写 std::unordered_map::operator[] 会产生一个 floating point exception。推测 .init 早于了 STL 的实例化。

一天结束了。记一下我做到哪里了。

首先我在 Monitor 模块。其次我正在写 configure 的读取。接下来我要改写初始化状态的部分。