我尝试使用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-
有人知道发生了什么吗?
答案 0 :(得分:0)
您是否使用调试选项(-g with gcc)编译了程序?似乎缺少调试信息,如在https://perf.wiki.kernel.org/index.php/Tutorial
的perf教程中所述当符号打印为十六进制地址时,这是因为ELF图像没有符号表。剥离二进制文件时会发生这种情况。
关于您获得的符号值,我不知道它来自哪里以及我们是否可以像您一样解释它。