私はこれをフラストレーションの少ないものとして書いていますが、これにも方法があるかもしれません...
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_readi
libasound.so
ioctl
callgrind_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_printk
from user-space .c
filesを実行しない限り)
最終的に、私が望むのは、実行可能ファイル、おそらくライブラリファイルとカーネルモジュールを指定し、提供するようなタイムスタンプ付き関数グラフ (関数ごとにインデント/ネストされたエントリと終了を含む) を取得できるようにすることftrace
です。このようなものに代わるものはありますか?(関数の終了なしで生活できることに注意してください-しかし、タイムスタンプ付きの関数エントリが本当に欲しいです)
fulltrace
PSとして:アプリケーション/スクリプトである説明に適合するものを実際に見つけたようです:
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
ますが、カーネルで利用できない場所はありますか?