我正在尝试跟踪功能zap_pte_range
来自 mm/memory.c 使用perf
。但功能并未在其中列出perf probe -F
。那么有没有办法动态追踪这个函数呢? IE。显式添加跟踪点并重新编译内核?
perf probe -a zap_pte_range
gives:
[kernel.kallsyms] 构建 id 33b15ec444475ee7806331034772f61666fa6719 未找到,继续不带符号
无法在内核中找到符号 zap_pte_range
错误:添加事件失败。
不存在这样的跟踪点。所以显然你不能用简单的方法追踪它。看来这个函数是由编译器内联的(请记住,由于某些优化原因,该函数也可以被省略)。这就是为什么没有它的符号/proc/kallsyms
.
您可以选择最适合您的追踪功能。例如。在我的 Debian 4.9 内核中我可以追踪unmap_page_range() https://elixir.bootlin.com/linux/v4.9.138/source/mm/memory.c#L1276,它最终“调用”您需要的函数。也许从逻辑上讲它会满足您的目标。
另一种方法是一点点黑客攻击。你可以做类似的事情objdump -dS memory.o | vim -
(你应该有二进制文件)并调查你需要的代码在哪里。鉴于该链zap_pud_range()
->zap_pmd_range()
->zap_pte_range()
可能是内联的,你必须调查上述内容unmap_page_range()
。也许你最终会获得一些代码地址kprobes https://www.kernel.org/doc/Documentation/kprobes.txt.
如果你想明确地追踪zap_pte_range()
例如通过jprobes(关于参数)或克雷特探针(关于返回值),可以尝试指定noinline https://stackoverflow.com/questions/1474030/how-can-i-tell-gcc-not-to-inline-a-function- 所需函数的属性,重新编译 Linux 内核并根据需要进行跟踪。
我想我没有更有用的方法给你了。
更多信息:相关帖子 https://stackoverflow.com/questions/20196636/does-kallsyms-have-all-the-symbol-of-kernel-functions, Jprobes 示例 https://gist.github.com/dzeban/a19c711d6b6b1d72e594, Ftrace:跟踪你的内核函数! https://jvns.ca/blog/2017/03/19/getting-started-with-ftrace/, 关于 ftrace 和 systemtap 的帖子 https://stackoverflow.com/questions/52764544/how-to-trace-just-system-call-events-with-ftrace-without-showing-any-other-funct/52775914#52775914, man nm https://linux.die.net/man/1/nm
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)