29

我已经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?如何在我的内核中启用它?

4

2 回答 2

38

你的内核是什么?它是来自您使用的 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/中所述分析):

# 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从 root 用户运行。

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

更新:似乎perf record总是想访问 kallsyms/restricted kptrs,即使是用户空间事件(-e cycles:u

于 2014-02-05T21:14:00.883 回答
6

本教程对我来说非常有用!

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
于 2016-11-16T19:42:31.927 回答