【问题标题】:LTTNG grab kernel events to monitor processes and process actionsLTTNG 抓取内核事件来监控进程和进程动作
【发布时间】:2020-10-02 02:49:31
【问题描述】:

我正在研究 LTTNG,目的是从其他进程(不是通过特定的 pid,而是通过任何进程)收集内核事件。 我已经设法为读写操作获取内核系统调用,但是,在那里检索到的数据并不完全是我需要的。

我需要能够看到创建进程时的实时提要(我需要 PID、进程路径和父 PID),最重要的是,我需要看到进程何时执行读/写操作关于文件(以及这些文件到底是什么)。

在 Windows 上,我可以使用 ETW 跟踪接收此信息。我在 linux 上也需要同样的东西,而 LTTNG 似乎是我研究过的最接近实现这一目标的东西。

以前有人试过吗?

提前谢谢你!

【问题讨论】:

    标签: linux-kernel trace lttng


    【解决方案1】:

    获取写入和读取系统调用是很好的第一步!

    cloneexecve 系统调用将为您提供有关进程创建的信息。

    ... syscall_entry_clone: { cpu_id = 2 }, { clone_flags = 0x1200011, newsp = 0x0, parent_tid = 0x0, child_tid = 0x7F4440D7EA10 }
    ... syscall_exit_clone: { cpu_id = 2 }, { ret = 1606323 }
    ... syscall_exit_clone: { cpu_id = 1 }, { ret = 0 }  
    ... syscall_entry_execve: { cpu_id = 1 }, { filename = "/bin/bash", argv = 0x55FA993F7EB0, envp = 0x55FA993BAF20 }
    

    execve 系统调用提供进程路径。

    确实,最好为每个事件提供 pid、ppid 以简化分析。这可以使用lttng add-context 命令来完成。对于这种情况:

    lttng add-context -k -t vpid
    lttng add-context -k -t vppid
    

    然后我们得到:

    ... syscall_entry_clone: { cpu_id = 0 }, { vpid = 1602589, vppid = 2996 }, { clone_flags = 0x1200011, newsp = 0x0, parent_tid = 0x0, child_tid = 0x7F4440D7EA10 }
    ... syscall_exit_clone: { cpu_id = 0 }, { vpid = 1602589, vppid = 2996 }, { ret = 1607998 }                                              
    ... syscall_exit_clone: { cpu_id = 1 }, { vpid = 1607998, vppid = 1602589 }, { ret = 0 }
    ... syscall_entry_execve: { cpu_id = 1 }, { vpid = 1607998, vppid = 1602589 }, { filename = "/bin/bash", argv = 0x55FA993B8C00, envp = 0x55FA993BAF20 }
    ... syscall_exit_execve: { cpu_id = 1 }, { vpid = 1607998, vppid = 1602589 }, { ret = 0 }
    

    我鼓励您使用lttng add-context --list 命令查看可用的上下文。

    现在进入文件的读/写/打开/关闭,基本事件设置将是:

     lttng enable-event -k --syscall write,pwrite64,writev,pwritev
     lttng enable-event -k --syscall read,pread64,readv,preadv
     lttng enable-event -k --syscall open,openat,name_to_handle_at,open_by_handle_at
     lttng enable-event -k --syscall close
    

    open 系列很重要,因为它给出了 fd 编号和文件路径之间关系的起点。 close 系统调用对于结束关系很重要。

    至于“实时提要”,live mode 符合要求。但是,如果您可以耽搁一些时间,我建议您查看rotation feature

    从那里您应该拥有所需的所有信息。不幸的是,Trace Compass 似乎没有为此提供全面的分析。如果您能胜任这项任务,那么在 Babeltrace2 python plugin 或简单地使用 python TraceCollection API 中实现应该不会太难。

    回顾一下:

    lttng create my_session
    lttng enable-event -k --syscall clone,exec
    lttng enable-event -k --syscall write,pwrite64,writev,pwritev
    lttng enable-event -k --syscall read,pread64,readv,preadv
    lttng enable-event -k --syscall open,openat,name_to_handle_at,open_by_handle_at
    lttng enable-event -k --syscall close
    lttng add-context -k -t vpid
    lttng add-context -k -t vppid
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多