特定のライブラリへの関数呼び出しをトレースしたいので、libfooと呼びます。残念ながら、私が見つけたドキュメントはまばらなので、多くの質問があります。
Libfooのドキュメントでは、foo_a、foo_b、foo_cの呼び出しがapi呼び出しとしてリストされています。 Windows DLLでは、このような呼び出しリストの生成は簡単です。各外部呼び出しを宣言する必要があるため(dllexport(DLL)など)、単純なスクリプトでエクスポートされたすべてのシンボルを抽出します。 Linux共有オブジェクト用にこのようなリストを生成するにはどうすればよいですか。
このようなリストを生成したら、ltraceでそれを使用して、特定のプログラムを使用して呼び出しのトレースを生成するにはどうすればよいですか。また、これらの呼び出しで(C)文字列引数を展開するにはどうすればよいですか?
これを行うために使用できるツールがいくつかあります。すぐに利用できるのは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
や実際のデバッガーなど、使用できるツールは他にもあります。