当系统调用返回时,我以%eax的形式获得了系统调用返回值,但是在输入时我得到的是-38,即十六进制的0xFFFFFFDA。这同时用于写/读。这个数字是多少 可以用来安全区分入口和出口吗?
syscall条目上eax中的-38显然是ENOSYS(未实现功能),并由arch / x86 / kernel / entry_32.S中的syscall_trace_entry放置在该位置。我想可以安全地假设它将始终存在于syscall条目中,但是如果syscall返回ENOSYS , 它也可以存在于syscall出口中 。
就个人而言,尽管我也看到一些代码也依赖于ENOSYS,但我始终只跟踪使用ptrace时是进入系统调用还是退出。(我假设您使用的是ptrace)我猜想,如果在将进程附加到syscall时该进程恰好位于syscall中,则它将无法正常工作,但是我很幸运没有遇到这个问题。
我快速浏览了strace源,我猜想它也跟踪状态,因为有一条评论说:“我们将附加到一个已经在运行的进程中。请尝试在syscall中弄清楚该进程的状态以进行处理第一件事很好。” 然后不久,它说:“该进程在syscall中间处于睡眠状态。伪造syscall进入事件。”。
简而言之,该值不能安全地用于区分入口和出口。就是说,我不确定手动跟踪它是最好的方法,因为我真的没有任何可以肯定地告诉您使用该技术的资源。:)