在GNU / Linux上,可以使用ptrace(2)
拦截程序及其子级的所有系统调用。典型的软件将完全依靠系统调用来与其他软件进行交互。
程序可以利用哪些不涉及系统调用的不确定性来源?并且它们是常用的吗?
通常,如果我想开发一个通用缓存机制,该机制可以跟踪程序及其子进程的所有系统调用,而我只是简单地重播它们,检查那些调用是否返回了完全相同的结果(如果没有,我会退回到实际运行该程序),那么它始终会像真正的程序一样完美吗?
实际上,如果我放宽一些调用以允许不同的行为(通常,brk
和mmap
倾向于选择不同的地址,而getpid
返回不同的进程ID,但是它们并不会真正影响程序的行为)是否存在会破坏这些期望的常用程序? (通常,我认为构建工具往往具有确定性)
那里有通用缓存机制的实现吗?