0

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

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

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

有没有人尝试过这样做?

先感谢您!

4

1 回答 1

0

获取 write 和 read 系统调用是很好的第一步!

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调用对于结束关系很重要。

至于“直播”,直播模式可以满足要求。但是,如果您可以拖延一些时间,我会鼓励您研究一下轮换功能

从那里你应该有所有需要的信息。不幸的是,Trace Compass似乎没有为此提供内置分析。如果您能胜任这项任务,那么在Babeltrace2 python 插件中实现或简单地使用 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
于 2020-06-15T15:47:58.277 回答