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

Mar*_*ter 21 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.
Run Code Online (Sandbox Code Playgroud)

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

我不确定到底perf在抱怨什么.我怎样才能解决这个问题?

编辑:

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

$ cat /proc/sys/kernel/kptr_restrict
0
Run Code Online (Sandbox Code Playgroud)

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

osg*_*sgx 26

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

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

ls -l  /proc/kallsyms
cat /proc/kallsyms | head
Run Code Online (Sandbox Code Playgroud)

perf关于kptr_restrict sysctl设置的消息的第二部分说.你可以做

cat /proc/sys/kernel/kptr_restrict
Run Code Online (Sandbox Code Playgroud)

检查设置.基本上,要分析内核符号,您应该通过将其设置为零来禁用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
Run Code Online (Sandbox Code Playgroud)

或(/sf/answers/1427395231/)

sudo sh -c " echo 0 > /proc/sys/kernel/kptr_restrict"
Run Code Online (Sandbox Code Playgroud)

要么

echo 0 | sudo tee /proc/sys/kernel/kptr_restrict
Run Code Online (Sandbox Code Playgroud)

或者您始终可以运行perfroot用户.

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

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


小智 5

本教程非常适合我!

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
Run Code Online (Sandbox Code Playgroud)