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 值不完整的主要内容,如果未能解决你的问题,请参考以下文章

perf 报告函数名称和额外字符

perf 报告单个睡眠的多个 sched:sched_stat_sleep 事件

什么[向量]在perf top报告中的含义?

perf kvm 无法打开 [],继续没有符号

为啥“性能报告”命令啥也没显示?

perf annotate 并不总是给出输出