1

私はこれをフラストレーションの少ないものとして書いていますが、これにも方法があるかもしれません...

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として:アプリケーション/スクリプトである説明に適合するものを実際に見つけたようです:

フルトレース [andreoli@Github]

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ますが、カーネルで利用できない場所はありますか?

4

0 に答える 0