0

我尝试使用 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-

有人知道发生了什么吗?

4

1 回答 1

0

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

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

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

于 2013-09-20T14:43:03.500 回答