如何从源代码跟踪 FreeBSD 中的系统调用?

How to trace system calls in FreeBSD from source code?

如何从源代码在 FreeBSD 10.1 x86_64 上记录系统调用(int 0x80sysenter/syscall 的系统调用编号和 return 值?

我知道 truss 可以完成这项工作,但我需要在每次系统调用期间记录其他信息,例如 copyout 的缓冲区。

我试图找到 truss 的源代码,但失败了。我也尝试在 amd64_syscall() 中追踪它们,但与 truss 的结果相比,结果似乎不完整。知道在实现中我应该关注哪些功能吗?

您没有具体说明为什么需要这些。特别是,如果您出于安全目的需要这样做,那您就做错了。

你失败了是什么意思?来源在这里:http://bxr.su/FreeBSD/usr.bin/truss/

像这样的工具使用的一般机制称为 ptrace (https://www.freebsd.org/cgi/man.cgi?query=ptrace),除其他外,它允许在执行系统调用时停止被跟踪的线程。

但是,必须注意,虽然此类机制允许您复制所有参数,但其他线程可以 更改 复制上述参数后指向的内存,就在系统调用做同样的事情。如果你对此有任何顾虑,你想使用 MAC 钩子。

可能不完全是您要查找的内容,但您可能想了解一下 ktrace(1)/kdump(1) 实用程序的工作原理。