Java Ubuntu 16.04 LTS-如何为perf工具启用符号
我正在尝试为我的应用程序收集一些分析数据,并为此运行perf工具和Flame图 我指的是本幻灯片中提供的说明: 以下是我正在运行的命令:Java Ubuntu 16.04 LTS-如何为perf工具启用符号,java,profiling,ubuntu-16.04,perf,Java,Profiling,Ubuntu 16.04,Perf,我正在尝试为我的应用程序收集一些分析数据,并为此运行perf工具和Flame图 我指的是本幻灯片中提供的说明: 以下是我正在运行的命令: 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 <s
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?
这在上面共享的幻灯片共享链接中的说明中有记录。
未能打开/tmp/perf-9931。map
消息不是关于错误的调试信息-它是关于JIT生成的评测代码(Java通常使用JIT从类文件生成机器代码),当与正在运行的性能分析代理不兼容时
建议使用“Java可以使用perf map agent完成此操作”,它将为perf生成映射文件:
建筑
LinuxPerf工具期望从未知位置执行代码时使用符号
位于/tmp/perf-.map的内存区域。这允许运行时
动态生成代码以提供要使用的动态符号映射
使用perf工具套件
perf map agent是一个代理,它将为生成这样的映射文件
Java应用程序。它由一个用C编写的Java代理和一个小程序组成
Java引导应用程序,将代理附加到正在运行的Java
过程
连接代理时,它指示JVM报告代码blob
由JVM在运行时为各种目的生成。最
重要的是,这包括JIT编译的方法,但也包括各种
动态生成的基础结构部件,如
创建用于虚拟调度的解释器、适配器和跳转表
(请参阅vtable和itable条目)。代理创建一个
/tmp/perf-.map文件,每个代码块填充一行
将内存位置映射到代码blob名称的
Java应用程序将Java进程的PID作为参数
以及它传递给
代理人然后它附加到目标进程并指示其加载
代理库
在Gregg中使用了OpenJDK的特殊黑客构建-幻灯片36-“-XX:+PreserveFramePointer
•” 我黑了OpenJDK x86_64以支持帧指针”
在幻灯片41中,格雷格谈到了/tmp/perf-*.map
文件:
固定符号
• 对于JIT代码,LinuxPerf已经在查找外部提供的符号文件:/tmp/perf-PID.map,并在该文件不存在时发出警告
• 该文件可以由Java代理创建
# perf script
Failed to open /tmp/perf-8131.map, continuing without symbols
(另请参见lkml中的“perf:add support for profiling jitted code”“-和其他”)“可能安装调试包?”是的,它是这么说的,我不确定如何正确安装它。“sudo apt get update”和“Failed to fetch…”表示您的linux可能太旧了(并且包被移动到其他服务器,如old-releases.ubuntu.com或archive.ubuntu.com-检查您的/etc/apt/sources.list.d)?并且
未能打开/tmp/perf-9931。map
消息不是关于debuginfo-它是关于在没有与perf profiling agent运行兼容的情况下分析JITted代码=“Java可以通过perf map agent完成此任务”-使用perf map agent重新运行应用程序
# perf script
Failed to open /tmp/perf-8131.map, continuing without symbols