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
只知道 fp
、dwarf
和 lbr
:source。
我想知道 perf 脚本如何能够展开堆栈并生成报告,尽管在启用了 ORC
堆栈展开的内核上使用 fp
调用图选项进行记录?
--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 中,使用主动启用的展开器。
我 运行 在内核 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
只知道 fp
、dwarf
和 lbr
:source。
我想知道 perf 脚本如何能够展开堆栈并生成报告,尽管在启用了 ORC
堆栈展开的内核上使用 fp
调用图选项进行记录?
--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 中,使用主动启用的展开器。