2013-03-07 16 views
12

ftrace function_graphでカーネルブートプロセス中に関数をトレースして、それが何であるかを理解したいのですが、available_filter_functionsでは利用できません。function_graphトレーサをftraceするためのLinuxカーネル関数の作成方法

EXPORT_SYMBOL()でエクスポートしようとしましたが、これは利用可能になると推測していますが、そうではありません。

解決策はありますか?

Androidカーネル3.4では、トレースしたい機能はpersistent_ram_init_ringbufferpersistent_ram_early_initです。

私はこれらのリンクが役立つかもしれない...

おかげ

+0

Ftraceを理解してから、関数の動的なトレースは、すべてのカーネル関数の開始時にmcount関数呼び出しに依存しています。関心のある機能にその機能がない場合は、使用可能なフィルターが表示されないことがあります。動的トレースを使用しないと考えましたか?より良い結果が得られるかもしれません。 –

+1

EXPORT_SYMBOLは、Ftraceではなく、GPL /非GPLライセンスの問題を解決するカーネルモジュールローダーともっと関係しているようです。 – bazza

+1

available_filter_functionsをリストすると、何も表示されません。 CONFIG_FUNCTION_TRACER(および他のすべてのftrace gubbins)を使ってカーネルをコンパイルするときにわかることから、カーネル関数の入/出力トレースは、gccコマンドラインのオプションを設定することによって実装されます。これらのオプションは、gccがコンパイルするすべての関数に対して特定の関数呼び出しを発行するようにします。私が理解しているのであれば、Linuxカーネルの機能は自動的にftraceでキャプチャされるはずです。これは、あなたのカーネルで何かが現在追跡可能であるかどうか疑問に思う。 – bazza

答えて

8

問題は、これらの関数には__initと__devinitというアノテーションが付けられていますが、これはftrace関数のトレーサによってリストされています。

なぜですか?モジュールのinit関数(またはカーネルのinit関数)は、初期化中にロードされ、初期化が完了すると削除されるためです。 ftraceトレースを行うすべての関数は、特別なコンパクトなテーブルに保持されます。現在、ftraceにそれらの関数が削除(解放)され、ftraceがそれらの関数をテーブルから削除するように指示する方法はありません。関数のトレースを有効にすると、ftraceは存在しなくなった場所を変更しようとし、あらゆる種類の問題を引き起こす可能性があります(e1000eのバグを覚えていますか?)。

実際にトレースしたい場合は、それらの注釈を削除してください。次に、トレースする関数のリストに表示されます。

+0

答えをありがとう。私は 'notrace'を知っていましたが、' __init'と '__devinit'の範囲ではありませんでした。 –

+1

うわー....ここであなたを見てうれしいスティーブンRostedt。あなたは間違いなくLinuxカーネルのftrace APIの元の著者の一人です。 –

+0

明らかに__initまたは__devinitフラグが含まれていない場合でも、* sched_wakeup *をトレースすることはできません。 – Claudio

関連する問題