【问题标题】:Ubuntu 16.04 LTS - How to enable symbols for the perf toolUbuntu 16.04 LTS - 如何为 perf 工具启用符号
【发布时间】:2017-08-13 22:00:06
【问题描述】:

我正在尝试为我的应用收集一些分析数据,并为此运行 perf 工具和 Flame Graphs。

我指的是此幻灯片中提供的说明:https://www.slideshare.net/brendangregg/java-performance-analysis-on-linux-with-flame-graphs

以下是我正在运行的命令:

1. sudo perf record -F 997 -a -g
2. sudo perf script > out.stacks01

当我运行第二个命令时,它会显示以下消息:

Failed to open /tmp/perf-9931.map, continuing without symbols.
no symbols found in <some path>, maybe install a debug package?

我做了一些在线浏览并尝试安装调试包,如下所述:https://gist.github.com/NLKNguyen/2fd920e2a50fd4b9701f

但是,当我运行“sudo apt-get update”时,它最终无法显示“无法获取......”

有人能弄清楚这里发生了什么吗?我需要做什么才能正确安装调试符号包?

编辑: 我的关键问题是我生成的火焰图没有 Java 符号,因此我最终专注于上述错误/消息。以下接受的答案为我的原始帖子提供了很好的解释。但是,我能够通过运行 jmaps 来解决我的问题,如下所示:

sudo perf record -F 997 -a -g -- sleep 300; jmaps 

这在上面共享的幻灯片共享链接中的说明中有记录。

【问题讨论】:

  • “可以安装调试包吗?”
  • 是的,就是这么说的,我不确定如何正确安装它。
  • "sudo apt-get update", with "Failed to fetch......" 表示你的 linux 可能太旧了(并且软件包已像旧版本一样移动到其他服务器。 ubuntu.com 或 archive.ubuntu.com - 检查您的 /etc/apt/sources.list.d)?并且 Failed to open /tmp/perf-9931.map 消息与调试信息无关 - 它是关于在与 perf 分析代理运行不兼容时分析 JITted 代码 = brendangregg.com/perf.html#JIT_Symbols "Java 可以使用 perf-map-agent 执行此操作" - github.com/jvm-profiling-tools/perf-map-agent - 使用 perf-map-agent 重新运行您的应用程序

标签: java profiling ubuntu-16.04 perf


【解决方案1】:

Failed to open /tmp/perf-9931.map 消息不是关于错误的调试信息 - 它是关于由 JIT 生成的分析代码(Java 通常使用 JIT 从类文件生成机器代码),当没有与 perf 分析代理运行兼容时。

http://www.brendangregg.com/perf.html#JIT_Symbols 中建议“Java 可以使用 perf-map-agent 执行此操作”以使用 https://github.com/jvm-profiling-tools/perf-map-agent,这将为 perf 生成映射文件:

架构

Linux perf 工具将期待未知代码执行的符号 /tmp/perf-.map 中的内存区域。这允许运行时 动态生成代码以提供要使用的动态符号映射 使用 perf 工具套件。

perf-map-agent 是一个代理,它将为 Java 应用程序。它由一个用 C 编写的 Java 代理和一个小的 Java 引导应用程序,将代理附加到正在运行的 Java 过程。

当附加代理时,它会指示 JVM 报告代码块 JVM 在运行时为各种目的生成。最多 重要的是,这包括 JIT 编译的方法,但也包括各种 动态生成的基础设施部分,如动态 为虚拟调度创建解释器、适配器和跳转表 (参见 vtable 和 itable 条目)。代理创建一个 /tmp/perf-.map 文件,每个代码块填充一行 将内存位置映射到代码块名称。

Java 应用程序将 Java 进程的 PID 作为参数 以及它传递给的任意数量的附加参数 代理人。然后它附加到目标进程并指示它加载 代理库。

https://www.slideshare.net/brendangregg/java-performance-analysis-on-linux-with-flame-graphs 中,Gregg 使用了 OpenJDK 的特殊破解版本 - 幻灯片 36 - “-XX:+PreserveFramePointer • 我破解了 OpenJDK x86_64 以支持帧指针”。

从幻灯片 41 Gregg 谈到 /tmp/perf-*.map 文件:

固定符号

• 对于 JIT 代码,Linux perf 已经查找外部提供的符号文件:/tmp/perf-PID.map,如果不存在则发出警告 • 此文件可由 Java 代理创建

# perf script 
Failed to open /tmp/perf-8131.map, continuing without symbols

(另请参阅 lkml 了解“性能:添加对分析 jitted 代码的支持”-https://lwn.net/Articles/633846/ 和其他)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2018-11-16
    • 1970-01-01
    • 2016-08-29
    相关资源
    最近更新 更多