function tracer 云々
手元の linux-next なナニで make menuconfig 確認してみたんですが
Kernel hacking -> Tracers
がソレにあたる模様。CONFIG_FTRACE とのこと。チェック入ってるのが以下。
- CONFIG_FUNCTION_TRACER
- CONFIG_FUNCTION_GRAPH_TRACER
- CONFIG_SCHED_TRACER
- CONFIG_FTRACE_SYSCALLS
他にも沢山チェック入ってましたが略。ちなみに端末で動いてるカーネルはというと
$ uname -r 3.2.0-27-generic $ ls /boot/config* /boot/config-3.2.0-23-generic /boot/config-3.2.0-27-generic $
TRACE で grep してみます。
$ grep TRACE /boot/config-3.2.0-27-generic CONFIG_STACKTRACE_SUPPORT=y # CONFIG_RCU_TRACE is not set # CONFIG_TREE_RCU_TRACE is not set CONFIG_TRACEPOINTS=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_CAN_PM_TRACE=y CONFIG_PM_TRACE=y CONFIG_PM_TRACE_RTC=y CONFIG_NETFILTER_XT_TARGET_TRACE=m CONFIG_MAC80211_DRIVER_API_TRACER=y # CONFIG_SCSI_IPR_TRACE is not set # CONFIG_VXGE_DEBUG_TRACE_ALL is not set # CONFIG_ATH5K_TRACER is not set CONFIG_CAPI_TRACE=y CONFIG_TRACE_ROUTER=m CONFIG_TRACE_SINK=m CONFIG_TRACE_IRQFLAGS_SUPPORT=y CONFIG_STACKTRACE=y # CONFIG_BACKTRACE_SELF_TEST is not set CONFIG_USER_STACKTRACE_SUPPORT=y CONFIG_NOP_TRACER=y CONFIG_HAVE_FTRACE_NMI_ENTER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_TRACER_MAX_TRACE=y CONFIG_FTRACE_NMI_ENTER=y CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_GENERIC_TRACER=y CONFIG_FTRACE=y CONFIG_FUNCTION_TRACER=y CONFIG_FUNCTION_GRAPH_TRACER=y # CONFIG_IRQSOFF_TRACER is not set CONFIG_SCHED_TRACER=y CONFIG_FTRACE_SYSCALLS=y CONFIG_STACK_TRACER=y CONFIG_BLK_DEV_IO_TRACE=y CONFIG_DYNAMIC_FTRACE=y CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_FTRACE_STARTUP_TEST is not set CONFIG_MMIOTRACE=y # CONFIG_MMIOTRACE_TEST is not set CONFIG_HAVE_MMIOTRACE_SUPPORT=y $
ええと、なんとなく使えそげ。試してみるか。とりあえず debugfs をナニ。
$ sudo mount -t debugfs nodev /sys/kernel/debug mount: nodev already mounted or /sys/kernel/debug busy mount: according to mtab, none is already mounted on /sys/kernel/debug $
む。デフォで mount されておる。/etc/mtab 見たら以下なエントリがありますな。
none /sys/kernel/debug debugfs rw 0 0
ええと、sudo su - して中身確認。
# cd /sys/kernel/debug/ # ls acpi bdi bluetooth dri extfrag gpio ieee80211 ips kprobes kvm mce regmap regulator sched_features suspend_stats tracing usb wakeup_sources x86 #
なんか沢山あります。ええと、tracing/available_tracers 確認。
# cat tracing/available_tracers blk function_graph mmiotrace wakeup_rt wakeup function nop #
あるいは以下。
# cat tracing/tracing_on 1 #
これって今も trace してるかとゆーとそうではないらしく、Documentation/trace/ftrace.txt によれば
tracing_on:
This sets or displays whether writing to the trace
ring buffer is enabled. Echo 0 into this file to disable
the tracer or 1 to enable it.
Documentation/trace/ftrace.txt より引用
ということらしい。実際には
echo 1 > /proc/sys/kernel/ftrace_enabled
することで、って中身見てみたら 1 だな。
# cat /proc/sys/kernel/ftrace_enabled 1 #
うーん。と言いつつ trace を cat してみたら
# cat tracing/trace # tracer: nop # # TASK-PID CPU# TIMESTAMP FUNCTION # | | | | | #
tracer が nop になっているのか。これは tracing/current_tracer に有効な文字列をセットすれば良いのかな。今は無論 nop がナニ。
# cat tracing/current_tracer nop #
ちょっと見てみます。
# cat tracing/available_tracers blk function_graph mmiotrace wakeup_rt wakeup function nop # echo 'function' tracing/current_tracer
で、tracing/trace 見てみたら凄いことに。いったん
# echo 'nop' tracing/current_tracer
して中身を確認。あ、駄目だ。確認するには
- echo '0' tracing/tracing_on
- echo 'function' tracing/current_tracer
- echo '1' tracing/tracing_on
- echo '0' tracing/tracing_on
して tracing/trace を cat すれば良いのかな。
うぶんつ
trace-cmd なるナニがある、と諸々の資料に書いてあったので確認してみた。
$ apt-cache search trace-cmd kernelshark - Utilities for graphically analyzing function tracing in the kernel trace-cmd - Utility for retrieving and analyzing function tracing in the kernel $
こりゃ凄い。さすがですな。kernelshark とか名前がアレ。
入れてみる
$ sudo apt-get install -fy kernelshark trace-cmd
trace-cmd とかリモートで云々とか書いてるし、おそらく kernelshark とか trace-cmd の wrapper だろうから (ry