我正在开发一个记忆跟踪库,我们在那里使用 mprotect 删除对程序大部分内存的访问,并使用SIGSEGV处理程序在程序接触到单个页面时恢复对它们的访问。这在大多数时候都很有效。
mprotect
我的问题是,当程序调用系统调用(比如 read )对于我的库标记为无法访问的内存,系统调用只返回-1并设置 errno 到 EFAULT 这以奇怪的方式改变了被测试程序的行为。我希望能够在系统调用实际进入内核之前恢复对系统调用的每一页内存的访问。
read
errno
EFAULT
fread 将呼叫
fread
ptrace(2) PTRACE_SYSCALL 它允许您在系统调用进入和退出时停止进程。
ptrace(2)
PTRACE_SYSCALL
ptrace
PTRACE_GETREGS
PTRACE_SETREGS
SIGUSR1
SIGUSR