Perf报告的IP值不完整

时间:2013-09-18 05:54:23

标签: profiling debug-symbols perf

我尝试使用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 个答案:

答案 0 :(得分:0)

您是否使用调试选项(-g with gcc)编译了程序?似乎缺少调试信息,如在https://perf.wiki.kernel.org/index.php/Tutorial

的perf教程中所述
  

当符号打印为十六进制地址时,这是因为ELF图像没有符号表。剥离二进制文件时会发生这种情况。

关于您获得的符号值,我不知道它来自哪里以及我们是否可以像您一样解释它。