【问题标题】:perf: Couldn't record kernel reference relocation symbolperf:无法记录内核引用重定位符号
【发布时间】:2014-02-12 15:03:48
【问题描述】:

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

【问题讨论】:

    标签: kernel perf


    【解决方案1】:

    你的内核是什么?它是来自您使用的 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/restricted kptrs,即使是用户空间事件 (-e cycles:u)

    【讨论】:

      【解决方案2】:

      本教程非常适合我!

      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
      

      【讨论】:

        猜你喜欢
        • 2022-11-11
        • 1970-01-01
        • 2022-08-18
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-28
        相关资源
        最近更新 更多