perf:无法记录内核引用重定位符号

时间:2014-01-22 13:56:26

标签: kernel perf

我为我的内核编译了perf(3.11.10)。在编译期间,一些库丢失了,所以我安装了这些库。

但现在当我运行perf时,我收到以下消息:

Couldn't record kernel reference relocation symbol
Symbol resolution may be skewed if relocation was used (e.g. kexec).
Check /proc/kallsyms permission or run as root.

Kernel address maps (/proc/{kallsyms,modules}) were restricted.
Check /proc/sys/kernel/kptr_restrict before running 'perf record'
If some relocation was applied (e.g. kexec) symbols may be misresolved.
Samples in kernel modules can't be resolved as well.

由于我使用的是自定义构建内核,对我来说最明显的解释是,我的内核缺少某些选项。如果是这样,我怎样才能找出遗漏的内容?

我不确定perf到底在抱怨什么。我该如何解决这个问题?

修改

/proc/kallsyms不存在且/proc/sys/kernel/kptr_restrict包含0

$ cat /proc/sys/kernel/kptr_restrict
0

我自己编译了内核,但有可能缺少某些选项。这是/proc/kallsyms的内容是什么?如何在内核中启用它?

2 个答案:

答案 0 :(得分:24)

你的内核是什么?它是来自您使用的Linux分发版还是由您编译的(您是如何安装它的)?

关于/ proc / kallsyms的警告的第一部分 - 你能显示命令的输出(从你用来运行perf的同一个用户开始)

ls -l  /proc/kallsyms
cat /proc/kallsyms | head

perf消息的第二部分说明了kptr_restrict sysctl设置。你能做到吗

cat /proc/sys/kernel/kptr_restrict

检查设置。基本上,要分析内核符号,您应该通过将其设置为零来禁用kptr_restrict(如https://lwn.net/Articles/420403/https://code.google.com/p/dart/wiki/Profiling中所述):

# Run as root user - e.g. after doing "sudo bash"
echo 0 > /proc/sys/kernel/kptr_restrict

或(https://stackoverflow.com/a/20391360/196561

sudo sh -c " echo 0 > /proc/sys/kernel/kptr_restrict"

echo 0 | sudo tee /proc/sys/kernel/kptr_restrict

或者您始终可以从root用户运行perf

将kptr_restrict设置为零或从root运行perf后,您不应该获得有关kallsyms的警告,并且能够分析内核函数。

更新:似乎perf record总是希望访问kallsyms /受限制的kptrs,即使只有用户空间事件(-e cycles:u

答案 1 :(得分:4)

本教程非常适合我!

http://lost-and-found-narihiro.blogspot.com/2012/06/how-to-install-perf-kernel-performance.html

从教程中复制:

$ cat /proc/sys/kernel/kptr_restrict
1
$ echo 0 > /proc/sys/kernel/kptr_restrict
$ cat /proc/sys/kernel/kptr_restrict
0