【问题标题】:Kprobe: associate return probe with entry probeKprobe:将返回探针与入口探针关联
【发布时间】:2016-01-27 06:45:59
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: linux linux-kernel ftrace kprobe


    【解决方案1】:

    你的方法是错误的。

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

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

    通常您会查找您感兴趣的文件的 inode 并根据相应的写入函数进行过滤。

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

    无论如何,基于 fd 的监控从根本上被打破了。

    【讨论】:

    • 非常感谢。事实上,今天我得出了相同的结论,即在vfs_write 函数的探测中按inode 编号进行过滤,这似乎有效。正如您已经提到的,它不包括该文件被删除并重新创建的情况,但这很好,我不需要。
    • 你不应该按 inode 编号过滤,而是一个指向 inode 的指针。否则,您可能会与在单独的文件系统上编写内容的线程混淆。
    • 好的,有道理。但在那种情况下,我怎么知道我需要过滤的这个struct inode 的内存地址?我是否首先需要设置另一个 kprobe 来输出该结构的地址,然后我可以过滤它? struct inode的内存地址永远不会变吗?
    • 好吧,您必须在设置探针之前查看它并停止监视它作为对 inode 删除的引用,然后它会被释放,忘记明确说明这一点。无论如何,所有这些都可以通过 systemtap 相当容易地完成。此外,您还缺少通过 mmapped 区域进行写入,这可能是可以接受的。
    猜你喜欢
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 2017-09-12
    • 2019-07-22
    • 2016-01-16
    相关资源
    最近更新 更多