Perf 报告的 IP 值不完整
Posted
技术标签:
【中文标题】Perf 报告的 IP 值不完整【英文标题】:Perf reported IP value incomplete 【发布时间】:2013-09-18 05:54:22 【问题描述】:我尝试使用 perf 来分析我的程序 myprog,这就是我得到的结果:
#
# Overhead Symbol Shared Object
# ........ ................................................................... .....................................
#
7.71% 0x743a l [.] list_iter_next myprog
我使用objdump -D
来查看IP 指的是哪条指令。
问题是,这里显示的 0x743a IP 在 myprog 的 .debug 部分中。
$ grep -ne ' 743a' dump
418233: 743a: 65 gs
429445: 743a: 40 00 00 add %al,(%rax)
perf 提供的十六进制值可以匹配转储中的多个位置,如下所示:
$ grep -ne 743a dump
7973: 40743a: 48 8b 00 mov (%rax),%rax
72861: 44743a: 66 0f f8 c8 psubb %xmm0,%xmm1
87650: 45743a: 41 d3 e9 shr %cl,%r9d
正确的IP是0x40743a,如下图:
$ grep -n4 40743a dump
7969-0000000000407430 <list_iter_next>:
7970- 407430: 48 8b 07 mov (%rdi),%rax
7971- 407433: 48 8b 40 08 mov 0x8(%rax),%rax
7972- 407437: 48 89 07 mov %rax,(%rdi)
7973: 40743a: 48 8b 00 mov (%rax),%rax
7974- 40743d: c3 retq
7975- 40743e: 66 90 xchg %ax,%ax
7976-
有人知道发生了什么吗?
【问题讨论】:
【参考方案1】:您是否使用调试选项(-g 和 gcc)编译了您的程序?似乎缺少调试信息,如性能教程中所述:https://perf.wiki.kernel.org/index.php/Tutorial
当符号打印为十六进制地址时,这是因为 ELF 映像没有符号表。剥离二进制文件时会发生这种情况。
关于你得到的符号值,我不知道它来自哪里,我们是否可以像你一样解释它。
【讨论】:
谢谢,是的,我使用 -g 编译调试符号 我更新了我的问题,因为它不仅仅与符号的名称有关 既然你有一个有效的符号,那么运行:perf annotate list_iter_next 确实比手动操作要好,谢谢!但我仍然想知道为什么 perf 没有在报告中提供完整的 IP以上是关于Perf 报告的 IP 值不完整的主要内容,如果未能解决你的问题,请参考以下文章