Ubuntu 16.04 LTS - 如何为perf工具启用符号

3
我正在尝试为我的应用程序收集一些分析数据,并运行性能工具和火焰图进行分析。
我参照这份slideshare中提供的指令: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 

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

也许安装一个调试包? - Jakuje
是的,这就是它所说的,我不确定如何正确安装它。 - pree
http://manpages.ubuntu.com/manpages/precise/en/man1/debuginfo-install.1.html - Jakuje
"sudo apt-get update",如果出现“无法获取……”的提示,则说明您的Linux系统可能太旧了(该软件包已移至其他服务器,如old-releases.ubuntu.com或archive.ubuntu.com-请检查您的/etc/apt/sources.list.d)?**failed to open /tmp/perf-9931.map信息不是关于调试信息的 - 它涉及在没有兼容的perf profiling代理运行时分析JITted代码 = http://www.brendangregg.com/perf.html#JIT_Symbols "Java可以使用perf-map-agent" - https ://github.com/jvm-profiling-tools/perf-map-agent - 使用perf-map-agent重新启动应用程序。 - osgx
1个回答

4
< p > 无法打开/tmp/perf-9931.map消息并不是关于错误的调试信息 - 它是关于由JIT生成的分析代码(Java通常从类文件生成机器代码),当没有与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文件:

Fixing Symbols

 • For JIT'd code, Linux perf already looks for an externally provided symbol file: /tmp/perf-PID.map, and warns if it doesn't exist •  This file can be created by a Java agent

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

(也可以参见lkml中关于“perf: add support for profiling jitted code”的相关内容 - https://lwn.net/Articles/633846/以及其他内容)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接