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