通过 perf in Linux 为未列出的函数添加动态跟踪点

Adding dynamic tracepoint through perf in Linux for function that is not listed

我正在尝试使用 perf 从 mm/memory.c 跟踪函数 zap_pte_range。但是函数没有列在perf probe -F中。那么有没有办法动态跟踪这个函数呢? IE。显式添加跟踪点并重新编译内核?

perf probe -a zap_pte_range

给出:

[kernel.kallsyms] with build id 33b15ec444475ee7806331034772f61666fa6719 not found, continuing without symbols

Failed to find symbol zap_pte_range in kernel

Error: Failed to add events.

没有这样的跟踪点。所以很明显你不能用简单的方法追踪它。似乎这个函数是由编译器内联的(请记住,出于某些优化原因,也可以省略该函数)。这就是为什么/proc/kallsyms.

中没有它的符号

您可以选择最适合您追踪的函数。例如。在我的 Debian 4.9 内核中,我可以跟踪 unmap_page_range(),最终 "calls" 您需要的功能。也许它在逻辑上会满足您的目标。

另一种方法是一点点黑客攻击。你可以做类似 objdump -dS memory.o | vim - 的事情(你应该有二进制文件)并调查你需要的代码在哪里。鉴于链 zap_pud_range()->zap_pmd_range()->zap_pte_range() 可能是内联的,您将不得不调查上述 unmap_page_range()。也许您最终会获得 kprobes.

的一些代码地址

如果您想显式跟踪 zap_pte_range() 例如通过jprobes(关于args)或者kretprobes(关于return值),可以尝试指定noinline-attribute对于需要的功能,重新编译 Linux 内核并根据需要跟踪它。

我想我没有更多有用的方法了。

更多信息: Related post, Jprobes example, Ftrace: trace your kernel functions!, Post about ftrace and systemtap, man nm