web-dev-qa-db-ja.com

共有ライブラリを追跡する方法は?

特定のライブラリへの関数呼び出しをトレースしたいので、libfooと呼びます。残念ながら、私が見つけたドキュメントはまばらなので、多くの質問があります。

Libfooのドキュメントでは、foo_a、foo_b、foo_cの呼び出しがapi呼び出しとしてリストされています。 Windows DLLでは、このような呼び出しリストの生成は簡単です。各外部呼び出しを宣言する必要があるため(dllexport(DLL)など)、単純なスクリプトでエクスポートされたすべてのシンボルを抽出します。 Linux共有オブジェクト用にこのようなリストを生成するにはどうすればよいですか。

このようなリストを生成したら、ltraceでそれを使用して、特定のプログラムを使用して呼び出しのトレースを生成するにはどうすればよいですか。また、これらの呼び出しで(C)文字列引数を展開するにはどうすればよいですか?

6

これを行うために使用できるツールがいくつかあります。すぐに利用できるのはperfです。

Firefoxプロセスで何が起こっているのかをリアルタイムで確認したいとしましょう。 perf top -p <pidof firefox>;次のような出力が表示されます。

Samples: 802  of event 'cycles', Event count (approx.): 374901537                                                
Overhead  Shared Object                Symbol                                                                    
   1.29%  libpthread-2.21.so           [.] pthread_mutex_unlock
   1.12%  [kernel]                     [k] ksize
   0.84%  firefox                      [.] 0x0000000000012bcc
   0.71%  libpthread-2.21.so           [.] pthread_mutex_lock
   0.64%  [kernel]                     [k] flat_send_IPI_mask
   0.63%  firefox                      [.] 0x0000000000012bdd
   0.61%  libmozsqlite3.so             [.] 0x000000000000cfd0
   0.60%  [kernel]                     [k] page_fault
   0.60%  libxul.so                    [.] 0x000000000233fa58
   0.56%  [kernel]                     [k] nf_nat_ipv4_local_fn

次に、?を使用して、インターフェイスで何ができるかを確認できます。 dを使用してシンボルにズームインできます。シンボルのマップの詳細を参照して、プロセスの正確な呼び出しを確認できます。

おそらくデータを集約したいと思うでしょう。 perf recordの代わりにperf topを使用してこれを行うことができます。

SystemTapや実際のデバッガーなど、使用できるツールは他にもあります。

1
user26053