0

perf を使用してプログラム myprog のプロファイルを作成しようとすると、次のようになります。

#
# Overhead                                                               Symbol                          Shared Object
# ........  ...................................................................  .....................................
#
     7.71%  0x743a             l [.] list_iter_next                            myprog

objdump -DIPがどの命令を参照しているかを確認するために使用します。問題は、ここに示されている 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-

何が起こっているのか知っている人はいますか?

4

1 に答える 1

0

デバッグ オプション (gcc で -g) を指定してプログラムをコンパイルしましたか? https://perf.wiki.kernel.org/index.php/Tutorialの perf チュートリアルで説明されているように、デバッグ情報が欠落しているようです。

シンボルが 16 進アドレスとして出力されるのは、ELF イメージにシンボル テーブルがないためです。これは、バイナリが削除されたときに発生します。

あなたが得たシンボル値について、それがどこから来たのか、あなたのように解釈できるかどうかはわかりません。

于 2013-09-20T14:43:03.500 に答える