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