6

我知道拦截系统调用的方法如下。

  1. 使用ptrace,但这似乎有很高的开销。据我所知,像 strace 这样的工具也在内部使用 ptrace。
  2. 使用内核模块更改系统调用表,但据我所知,这种方法在以后的linux内核中已经不可能了。
  3. 使用 LD_PRELOAD。但是,如果您直接进行系统调用而不使用该系统调用的一些包装库函数,这将不起作用。

所以你看到上面提到的所有方法都有缺陷。所以我的问题是在不修改内核且开销最小的情况下拦截系统调用的方法是什么。

4

3 回答 3

4

如果无法修改内核,则必须修改应用程序。您需要以某种方式拦截int//指令syscallsysenter方法是在此处设置一个断点(如果您可以在 Linux 中的应用程序中处理它们;您可以在 Windows 中使用 SEH/VEH)或以更具侵入性的方式挂钩指令(将其更改为将保存系统调用号jmp和参数的代码,执行原始int//并返回)。syscallsysenterjmp

编辑:哦,我忘了补充一点,找到这些说明可能是一个挑战。您可能无法在编译的二进制文件中正确识别它们。您可能会错过一些(尤其是在运行时创建的那些),并且您可以为int/ syscall/采取一些其他指令sysenter(如果您的代码分析不完美)。OTOH,在运行时找到它们(通过在执行/模拟它们之前分析单个指令(或它们的块))将导致性能下降。

无论如何,性能问题很可能与进行的系统调用的数量以及记录/跟踪的信息量直接相关。如果你减少它(即只选择有趣的系统调用和参数)和/或只收集关于最后 10000 个系统调用的信息并将数据保存在内存中并将其保存到文件中一次(最后应用程序),您将获得更好的性能。

于 2012-07-02T10:22:55.083 回答
1

Pintool might also help; it's available for Linux too.

于 2012-07-02T10:36:21.910 回答
1

看看使用动态检测框架,例如DTraceSystemTap。一个或两个都应该适用于您的平台。

于 2012-07-02T10:16:36.613 回答