perf 如何使用 ORC 在较新的内核版本中展开堆栈?

How does perf unwind the stack in newer kernel versions with ORC?

我 运行 在内核 5.4.80 上执行并显式使用 fp 调用图:

perf record -g --call-graph fp ...

当 运行 perf script 时,它可以毫无问题地分析堆栈跟踪。这是在编译内核时未启用帧指针,而是使用 ORC:

CONFIG_UNWINDER_ORC=y
# CONFIG_UNWINDER_FRAME_POINTER is not set

结果是内核符号在/proc/kallsyms中可用。

另一方面,似乎 perf-script 只知道 fpdwarflbrsource

我想知道 perf 脚本如何能够展开堆栈并生成报告,尽管在启用了 ORC 堆栈展开的内核上使用 fp 调用图选项进行记录?

根据perf-record(1)

--call-graph
           Setup and enable call-graph (stack chain/backtrace)
           recording, implies -g. Default is "fp" (for user space).

               The unwinding method used for kernel space is dependent on the
               unwinder used by the active kernel configuration, i.e
               CONFIG_UNWINDER_FRAME_POINTER (fp) or CONFIG_UNWINDER_ORC (orc)

               Any option specified here controls the method used for user space.

因此,--call-graph 仅控制 call-graph 在用户space 中的展开方式。在内核 space 中,使用主动启用的展开器。