私はこれをフラストレーションの少ないものとして書いていますが、これにも方法があるかもしれません...
ALSA の関数で何が起こるかを分析したいと思いますsnd_pcm_readi。その目的のために、私がこれを持っている小さな を準備したとしましょうtestprogram.c:
void doCapture() {
ret = snd_pcm_readi(handle, buffer, period_size);
}
この関数の問題は、最終的snd_pcm_readiに共有システム ライブラリにフックする必要があること/usr/lib/libasound.soです。そこから、経由でカーネルモジュールioctlと何らかの形で通信すると思います-そして、最終的には、特定のサウンドカードのドライバーであるカーネルモジュールと通信するはずです。snd_pcm_read/lib/modules/$(uname -r)/kernel/sound/core/snd-pcm.ko.ko
さて、上記のような組織では、次のようなことができます:
valgrind --tool=callgrind --toggle-collect=doCapture ./testprogram
...そして実際にと のkcachegrind callgrind.out.12406間の関係を明らかにします(で表示する同じ情報を取得できません) - これにより、ユーザー空間が多少カバーされます。しかし、それはそれが行く限りです。さらに、呼び出しグラフ、つまり、関数間の一般的な呼び出し元/呼び出し先の関係を生成します (おそらく、各関数がスケジュールどおりに動作するために費やしたサンプル/ティックのカウントによる)。snd_pcm_readilibasound.soioctlcallgrind_annotate
ただし、代わりに取得したいのは、ftraceと呼ばれる Linux トレーサの出力のようなものですfunction_graph。これは、トレースされたカーネル関数のタイムスタンプ付きのエントリと終了を提供します... ftrace の例: 関数グラフ トレーサのドキュメントを追加 [LWN.net] :
$ cat /sys/kernel/debug/tracing/trace
# tracer: function_graph
#
# TIME CPU DURATION FUNCTION CALLS
# | | | | | | | |
2105.963678 | 0) | mutex_unlock() {
2105.963682 | 0) 5.715 us | __mutex_unlock_slowpath();
2105.963693 | 0) + 14.700 us | }
2105.963698 | 0) | dnotify_parent() {
(注:新しいftraceドキュメントでは、最初はタイムスタンプが表示されないfunction\_graphようですが、期間のみですが、それを変更することはまだ可能だと思います)
を使用ftraceすると、特定のカーネル モジュール内の関数のみをトレースできるようにフィルターをかけることができます。つまり、私の場合は、サウンドカード ドライバーであるモジュールの関数を追加して、カーネル空間で興味深いと思われるものをすべてカバーすることができますsnd-pcm.ko。.ko. しかし、その後、ユーザー空間プログラムへのリンクを失います (明示的printfに to/sys/kernel/debug/tracing/trace_markerまたはtrace_printkfrom user-space .cfilesを実行しない限り)
最終的に、私が望むのは、実行可能ファイル、おそらくライブラリファイルとカーネルモジュールを指定し、提供するようなタイムスタンプ付き関数グラフ (関数ごとにインデント/ネストされたエントリと終了を含む) を取得できるようにすることftraceです。このようなものに代わるものはありますか?(関数の終了なしで生活できることに注意してください-しかし、タイムスタンプ付きの関数エントリが本当に欲しいです)
fulltracePSとして:アプリケーション/スクリプトである説明に適合するものを実際に見つけたようです:
fulltrace は、ELF プログラムの実行をトレースし、ユーザー空間、ライブラリ、およびカーネル関数呼び出しの完全なトレースを出力として提供します。...
(前提条件) 次のカーネル構成オプションとその依存関係を有効 (=y) に設定する必要があります: FTRACE、TRACING_SUPPORT、UPROBES、UPROBE_EVENT、FUNCTION_GRAPH_TRACER。
完璧に聞こえます-しかし問題は、私はUbuntu 11.04を使用しており、この2.6.38カーネルは幸運にもCONFIG_FTRACE=y有効になっています/boot/config-`uname -r`
が、言及していませんUPROBES:/そして、カーネルのハッキングを避けたいので、残念ながらこのスクリプトを使用できません...
(ところで、UPROBES が利用可能である場合、(私が理解している限り)シンボル アドレスにトレース プローブを設定し (say から取得objdump -d)、出力は再び/sys/kernel/debug/tracing/trace次の場所に移動します。つまり、UPROBES を使用しなくても、カスタム ソリューションを使用できたはずです)。fulltraceスクリプト) _
それで、私の質問を少し絞り込むために-ユーザー空間(共有ライブラリを含む)とカーネル空間の「関数グラフ」トレースを同時に許可する解決策はありUPROBESますが、カーネルで利用できない場所はありますか?