我已经为我的内核(3.11.10)编译了perf
。在编译过程中,一些库丢失了,所以我安装了这些库。
但现在当我运行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
?如何在我的内核中启用它?
发布于 2014-02-06 05:14:01
你的内核是什么?它是来自您使用的linux发行版,还是您自己编译的(您是如何安装的)?
警告的第一部分是关于/proc/kallsyms -您能显示命令的输出(从您用来运行perf的同一用户启动)吗?
ls -l /proc/kallsyms
cat /proc/kallsyms | head
perf
消息的第二部分说明了kptr_restrict sysctl设置。你能做到吗?
cat /proc/sys/kernel/kptr_restrict
检查设置。基本上,要分析内核符号,您应该通过将kptr_restrict设置为0来禁用它(如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
或者,您也可以始终从根用户运行perf
。
在将kptr_restrict设置为零之后,或者在从根目录运行perf时,您应该不会收到关于kallsyms的警告,并且能够分析内核函数。
更新:似乎perf record
总是想要访问kallsyms/受限kptrs,即使是用户空间纯事件(-e cycles:u
)
发布于 2016-11-17 03:42:32
这篇教程对我来说非常有效!
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
https://stackoverflow.com/questions/21284906
复制相似问题