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 によって提供される 16 進値は、ダンプ内のいくつかの場所と一致する可能性があります。
$ 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-
何が起こっているのか知っている人はいますか?