4

ftraceを使用して特定の関数をトレースしたいのですが、その関数からの以降のすべての呼び出しを使用します。

目的の関数でフィルターを使用してftraceを開始することができましたが、現在は、呼び出されたこの1つの特定の関数のみが表示されます。

だから私の質問は:特定の関数から呼び出されたすべての関数、それらの関数によって呼び出された関数などを印刷する方法は?

4

2 に答える 2

6

max_graph_depthを設定して、関数グラフの深さを増やすこともできます。

次の手順は、選択したLinux関数の関数グラフを生成するのに役立ちます。

1. cd /sys/kernel/debug/tracing
2. cat /dev/null >  trace
3. echo generic_make_request > set_graph_function
4. echo 10 > max_graph_depth
5. echo function_graph > current_tracer
6. echo 1 > tracing_on
7. dd if=/dev/sddk of=~/test bs=512 count=5
8. cp trace ~/dd_trace_depth10
9. echo 0 > tracing_on
10. echo > set_graph_function
11. echo 0 > max_graph_depth
12. cat /dev/null >  trace

トレースを有効にする: この例では、フィルター関数を「generic_make_request」として選択しました。そのため、ステップ3では、グラフ関数を「generic_make_request」Linux関数に設定します。次に、手順4でグラフの深さを10に設定しました。手順5では、現在のトレーサーを「function_graph」として設定します。これらすべてを設定したら、トレースを有効にします。

アクション: Linuxトレースが必要なアクションを実行します。この例では、ddコマンドを使用してI/Oを実行します。このコマンドはgeneric_make_request関数にヒットし、ファイル/ sys / kernel / debug / traceing/traceは関数グラフで埋められます。

トレースを無効にする: 手順9、10、11はトレースを無効にします

参照:http ://sklinuxblog.blogspot.com/2014/12/generated-function-graph-in-linux.html

于 2014-12-30T06:22:20.903 に答える
5

私は問題を解決することができました。これが例としてkmallocを使用したソリューションです。

cd /sys/kernel/debug/tracing
echo kmalloc > set_graph_function
echo function_graph > current_tracer
cat trace

function_graphを使用する前に、必ずすべてのフィルター(set_ftrace_filterなど)をリセットしてください。

于 2013-02-19T12:49:45.383 に答える