用户和内核数据的 Perf 分支过滤器

Perf branch filter for both user and kernel data

对于以下每个命令

perf record -e cycles -j any -a -o perf.data -p 3696

我想记录用户和内核数据。我知道修饰符 :ukcycles 有效,但我不知道是否必须为 -j 选项应用 ,uk。根据手册

-j, --branch-filter 
    any: any type of branches 
    u: only when the branch target is at the user level 
    k: only when the branch target is in the kernel 
    hv: only when the target is at the hypervisor level 

因此,对于使用数据,我通常 运行 perf record -e cycles:u -j any,u -a -o perf.data -p 3696。不过,这次

perf record -e cycles:uk -j any,uk -a -o perf.data -p 3696

未知分支过滤器失败。

只对用户和内核数据使用 -j any 可以吗?

没有。使用 any 意味着它将对任何 'type' 采取的分支进行采样(例如函数 call/function return/indirect 分支等)。

要同时记录userkernel数据,你应该运行perf record这样-

perf record -e cycles:u -j any,u,k -a -o perf.data -p <PID>

此外,您不需要同时使用 -a-p <PID> 选项,在这种情况下 -p <PID> 开关会覆盖 -a 选项。