Ftrace is a Kernel function tracer. It uses the file system debugfs.
To use Ftrace, these options needs to be enabled if it's not.
CONFIG_FTRACE,
CONFIG_HAVE_DYNAMIC_FTRACE,
CONFIG_HAVE_FUNCTION_TRACER,
CONFIG_HAVE_FUNCTION_GRAPH_TRACER,
CONFIG_STACKTRACE
To mount debugfs
mount -t debugfs nodev /sys/kernel/debug
If /sys/kernel/debug is present re-run the above command again.
ftrace directory will be created under /sys/kernel/debug/tracing
The directory contains all the control knobs in regard to kernel tracing.
Some of the important files can be referred when using ftrace
1) available_filter_funtions: All the functions ftrace is able to trace.
2) available_tracer: List all the tracer compiled into the kernel.
3) current_tracer: shows the currently selected tracer.
4) trace : It holds the output of what being traced in readable format.
5) trace_options: To control the level of output in trace output
To enable block tracing echo block > trace_options
To disable block tracing echo noblock > trace_options
6) tracing_enabled : To start or stop tracing activity
To enable ftrace
echo function > /sys/kernel/debug/tracing/current_tracer
To enable/disable tracing
echo 1 > tracing_on : To enable tracing
echo 0 > tracing_on : To disable tracing
echo > trace : To clear trace log file
echo nop > current_tracer
To Trace or Monitor Block IO
echo 1 > events/block/enable (enable block I/O subsystem)
cat set_event (To display all the subsystem event enabled)
echo 1 > tracing_on
run your program
echo 0 > tracing_on
cat trace to output the ftrace output.
Example of tracing a specific process
traceme.sh
#!/bin/sh
DEBUGFS=`grep debugfs /proc/mounts | awk '{ print $2; }'`
echo nop > $DEBUGFS/tracing/current_tracer
echo > $DEBUGFS/tracing/trace
echo $1
echo $$ > $DEBUGFS/tracing/set_ftrace_pid
echo function > $DEBUGFS/tracing/current_tracer
#echo function_graph > $DEBUGFS/tracing/current_tracer
echo 1 > $DEBUGFS/tracing/tracing_on
exec $*
#echo nop > $DEBUGFS/tracing/current_tracer
echo 0 > $DEBUGFS/tracing/tracing_on
echo sys_* > set_ftrace_filter
echo vfs_* >> set_ftrace_filter
traceme.sh ls -al
To use Ftrace, these options needs to be enabled if it's not.
CONFIG_FTRACE,
CONFIG_HAVE_DYNAMIC_FTRACE,
CONFIG_HAVE_FUNCTION_TRACER,
CONFIG_HAVE_FUNCTION_GRAPH_TRACER,
CONFIG_STACKTRACE
To mount debugfs
mount -t debugfs nodev /sys/kernel/debug
If /sys/kernel/debug is present re-run the above command again.
ftrace directory will be created under /sys/kernel/debug/tracing
The directory contains all the control knobs in regard to kernel tracing.
Some of the important files can be referred when using ftrace
1) available_filter_funtions: All the functions ftrace is able to trace.
2) available_tracer: List all the tracer compiled into the kernel.
3) current_tracer: shows the currently selected tracer.
4) trace : It holds the output of what being traced in readable format.
5) trace_options: To control the level of output in trace output
To enable block tracing echo block > trace_options
To disable block tracing echo noblock > trace_options
6) tracing_enabled : To start or stop tracing activity
To enable ftrace
echo function > /sys/kernel/debug/tracing/current_tracer
To enable/disable tracing
echo 1 > tracing_on : To enable tracing
echo 0 > tracing_on : To disable tracing
echo > trace : To clear trace log file
echo nop > current_tracer
To Trace or Monitor Block IO
echo 1 > events/block/enable (enable block I/O subsystem)
cat set_event (To display all the subsystem event enabled)
echo 1 > tracing_on
run your program
echo 0 > tracing_on
cat trace to output the ftrace output.
Example of tracing a specific process
traceme.sh
#!/bin/sh
DEBUGFS=`grep debugfs /proc/mounts | awk '{ print $2; }'`
echo nop > $DEBUGFS/tracing/current_tracer
echo > $DEBUGFS/tracing/trace
echo $1
echo $$ > $DEBUGFS/tracing/set_ftrace_pid
echo function > $DEBUGFS/tracing/current_tracer
#echo function_graph > $DEBUGFS/tracing/current_tracer
echo 1 > $DEBUGFS/tracing/tracing_on
exec $*
#echo nop > $DEBUGFS/tracing/current_tracer
echo 0 > $DEBUGFS/tracing/tracing_on
echo sys_* > set_ftrace_filter
echo vfs_* >> set_ftrace_filter
traceme.sh ls -al
No comments:
Post a Comment