如何使用 ftrace 无损地捕获所有生成的事件

How to capture all generated events with ftrace without any loss

我目前正在做一些实验,我需要像这样记录在正常的stress-ng执行周期执行过程中产生的所有事件/usr/bin/stress-ng -c 80 -t 30 --times --exec 50 --exec-ops 50,特别是与exec相关的事件(sched:sched_process_execsyscalls:sys_enter_execve).
不幸的是,在分析跟踪文件时,我发现一些进程没有生成任何 sys_execve,但被 sched_process_exec 捕获,这对我来说毫无意义。
即使没有事件丢失,也会发生这种情况(在跟踪文件中,buffer/written 中的条目是相同的,并且 trace-cmd 不会警告事件丢失)。
鉴于这种情况,我不明白为什么会这样,我唯一能给出的解释是这些事件没有被记录下来。任何帮助将不胜感激。
Here's an example for reference of trace file I get

为了清楚我在说什么,这些行应该是常态:

stress-ng-1748  [001] .... 19573.548553: sys_execve(filename: 7ffe7a791720, argv: 7ffe7a791700, envp: 7ffe7a7916f8)
stress-ng-1748  [001] .... 19573.548707: sched_process_exec: filename=/usr/bin/stress-ng pid=1748 old_pid=1748

同时生成 sys_execve 事件和 sched_process_exec 事件的进程。

而这个:

stress-ng-1780  [005] .... 19573.598398: sched_process_exec: filename=/usr/bin/stress-ng pid=1780 old_pid=1780

这是 link 中文件的最后一个,是一个没有关联 sys_execve 事件的过程示例。

红利问题:我还需要记录等效的 fork 事件(即 syscalls:sys_enter_fork),并使用 fork-ops(或类似的东西)进行压力执行,但我无法做到所以,既不是来自 trace-cmd,也不是来自 Ftrace 手动。我在网上读到在处理分叉过程时有一些特殊情况,但无法理解该怎么做才能特别记录这个事件。
对此问题的任何帮助也将不胜感激。

我通过捕获事件 syscalls:sys_enter_execve 解决了这个问题。在他们两个之间,我能够调用每个 exec 实例。