Kprobe:将 return 探测器与入口探测器相关联

Kprobe: associate return probe with entry probe

我想跟踪对特定文件的写入,所以我想到我可以这样做:

我在 do_sys_open 上创建了一个探测器,如果 filename 参数与我正在寻找的模式匹配 我使用触发器来启用 return 探测器以获取 returned 文件描述符 ID(它是 $retval)。这个 return 探测器将在 common_pid 上有一个过滤器,因为我只对 fds return 由 do_sys_open 调用编辑的 do_sys_open 感兴趣,这些调用刚刚打开了 filename 我要监控。 return 探测器获取 fd 并在 sys_write 上启用另一个探测器,并在 common_pidfd 上启用过滤器。 我希望通过这种方式,我将只能跟踪对我正在监视的一个文件的 write 操作。

问题是这不适用于多线程进程。如果一个进程同时调用 open 两次(使用两个线程),上述机制可能会失败。现在我正在尝试找出一种方法来在 do_sys_open 的条目和 do_sys_open 上的 return 探测器之间建立这种关联,我很乐意接受任何建议。

PS: 我不确定这个问题是属于 Whosebug 还是 unix & linux.

你的做法是错误的。

首先,文件描述符编号是每个进程的,因此您会自动捕捉到几乎任何使用此类 fd 编号写入任何内容的人,这可能会或可能不会导致写入您感兴趣的文件。

此外,sys_write 在堆栈中的位置太高,无法捕获所有合法作者。

通常您会查找您感兴趣的文件的索引节点,并根据相应的写入函数对其进行过滤。

但是,"monitoring writes to a file" 仍然有些模棱两可,因为不清楚如果有人要取消链接原始名称并使用该名称创建一个新文件,您希望发生什么。如果你想处理,你确实最好在开放的某个地方捕获线程,查看查找了什么 inode 并将它们添加到你的原语中,以便你知道要监视它。

无论如何,fd-based监控从根本上被打破了。