我正在开发一个内存跟踪库,我们使用该库mprotect
来删除对程序大部分内存的访问,并使用 SIGSEGV 处理程序在程序接触到单个页面时恢复对它们的访问。这在大多数情况下都很有效。
read
我的问题是,当程序使用我的库标记为不可访问的内存调用系统调用(比如)时,系统调用只返回 -1 并设置errno
为EFAULT
. 这会以奇怪的方式改变正在测试的程序的行为。我希望能够在系统调用实际进入内核之前恢复对系统调用的每一页内存的访问。
我目前的方法是为每个涉及内存的系统调用创建一个包装器。在将其交给真正的系统调用之前,每个包装器都会触及给它的所有内存。这似乎适用于直接从程序发出的调用,但不适用于 libc 发出的调用(例如,fread
将read
直接调用而不使用我的包装器)。有没有更好的方法?怎么可能得到这种行为?