2017-12-16 1 views
0

私はperfのソースコードを読んでいて、どのように意味するかを試してみるperf recordは、 (例えば、call testの仮想アドレス、perf reportの注釈で監視されているアセンブリコード)をトリガーするターゲットプロセスの命令。そして、perf処理を実行してカウンタをトリガする命令の仮想アドレスを格納するためにperfが使用するデータ構造は何ですか?どのようにperfレコードがターゲットプロセスの命令の仮想メモリアドレスを取得し、どのデータ構造体がそれを格納するためにperfを使用するか

+0

どのレベルで答えが欲しいですか? 'perf record'ユーザランドツール、カーネルの' perf_event_open'実装に興味がありますか? – Zulan

+0

ハードウェアカウンタを起動する命令の仮想アドレスを取得して印刷したい。特に、TSXを中止させる命令があり、パワフルな単純イベント「tx-abort」はハードウェアカウンタによってカウントされます。 'perf report'は、' perf annotation'でintructionを見ることができます。だから、 'perfレコード 'を実行するとき、そのデータ構造がその命令の仮想アドレスを記憶することを知りたい。あるいは、perf_event_openがこれをどのように達成できるか知っていますか? – Sam

+0

分析を完了させたいだけですか?次に 'perf record' /' perfスクリプト 'を使い、そのマンページを読むべきです。または、特定のツールを作成したいですか?それでなんで? 'perf_event_open'に基づくこの新しいツールは、' perfレコード 'はできませんか? – Zulan

答えて

1

サンプルの命令ポインタを取得するには、perf_event_openコールでperf_attr.sample_typePERF_SAMPLE_IPを含める必要があります。これにはPERF_RECORD_SAMPLEイベントの構造体にipフィールドが含まれ、mmapリングバッファから読み取ることができます。詳細については、マンページを参照してください。

PERF_RECORD_SAMPLE 
    This record indicates a sample. 

     struct { 
      struct perf_event_header header; 
      u64 sample_id; /* if PERF_SAMPLE_IDENTIFIER */ 
      u64 ip;   /* if PERF_SAMPLE_IP */ 
      u32 pid, tid; /* if PERF_SAMPLE_TID */ 
      u64 time;  /* if PERF_SAMPLE_TIME */ 
      ... 
関連する問題