工作随记
Comment今日目标是把之前的代码改完,并且至少支持 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 的读取。接下来我要改写初始化状态的部分。