首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >性能:无法记录内核引用重定位符号

性能:无法记录内核引用重定位符号
EN

Stack Overflow用户
提问于 2014-01-22 21:56:26
回答 2查看 19.5K关注 0票数 28

我已经为我的内核(3.11.10)编译了perf。在编译过程中,一些库丢失了,所以我安装了这些库。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
$ cat /proc/sys/kernel/kptr_restrict
0

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-06 05:14:01

你的内核是什么?它是来自您使用的linux发行版,还是您自己编译的(您是如何安装的)?

警告的第一部分是关于/proc/kallsyms -您能显示命令的输出(从您用来运行perf的同一用户启动)吗?

代码语言:javascript
复制
ls -l  /proc/kallsyms
cat /proc/kallsyms | head

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

代码语言:javascript
复制
cat /proc/sys/kernel/kptr_restrict

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

代码语言:javascript
复制
# Run as root user - e.g. after doing "sudo bash"
echo 0 > /proc/sys/kernel/kptr_restrict

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

代码语言:javascript
复制
sudo sh -c " echo 0 > /proc/sys/kernel/kptr_restrict"

代码语言:javascript
复制
echo 0 | sudo tee /proc/sys/kernel/kptr_restrict

或者,您也可以始终从根用户运行perf

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

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

票数 36
EN

Stack Overflow用户

发布于 2016-11-17 03:42:32

这篇教程对我来说非常有效!

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

从教程中复制:

代码语言:javascript
复制
$ cat /proc/sys/kernel/kptr_restrict
1
$ echo 0 > /proc/sys/kernel/kptr_restrict
$ cat /proc/sys/kernel/kptr_restrict
0
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21284906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档