CONFIG_FTRACE=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
CONFIG_IRQSOFF_TRACER=y
CONFIG_SCHED_TRACER=y
CONFIG_FUNCTION_PROFILER=y
CONFIG_STACK_TRACER=y
CONFIG_TRACER_SNAPSHOT=y
$ bitbake -c menuconfig virtual/kernel
debugfs
파일시스템을 마운트 해야한다./sys/kernel/debug
디렉토리에 있다.# mount -t debugfs none /sys/kernel/debug
/sys/kernel/debug/tracing
디렉토리에 있다.# cat /sys/kernel/debug/tracing/available_tracers
실행 중인 트레이서는 current_tracer
에 의해 표시되며, 처음에는 널 트레이서(nop
)이다.
추적을 캡쳐하려면, current_tracer
에 available_tracers
중 하나의 이름을 씀으로써 트레이서를 선택한다. 그 후 잠시 동안 다음 예제처럼 추적을 활성화 한다.
# echo function > /sys/kernel/debug/tracing/current_tracer
# echo 1 > /sys/kernel/debug/tracing/tracing_on
# sleep 1
# echo 0 > /sys/kernel/debug/tracing/tracing_on
# cat /sys/kernel/debug/tracing/trace
.... 너무 많이 나온다.
# head -n 20 /sys/kernel/debug/tracing/trace
이와 같은 flat function
목록을 이해하긴 어렵다.
function_graph
트레이서를 선택하자.# echo function_graph > /sys/kernel/debug/tracing/current_tracer
# echo 1 > /sys/kernel/debug/tracing/tracing_on
# sleep 1
# echo 0 > /sys/kernel/debug/tracing/tracing_on
# head -n 20 /sys/kernel/debug/tracing/trace
{ }
가 중첩된 함수 호출을 볼 수 있다.+
부호!
부호단일 프로세스 또는 스레드로 인해 발생하는 커널 활동에만 관심이 있는 경우 스레드 ID를 set_ftrace_pid
에 씀으로써 단일 스레드로의 추적으로 제한할 수 있다.
CONFIG_DYNAMIC_FTRACE
를 사용하면, Ftrace
가 런타임에 함수 추적하는 곳을 수정할 수 있는데, 이 것은 몇 가지 이점이 있다.Ftrace
서브 시스템이 부팅 시에 이들을 찾아내어 NOP
명령으로 덮어쓸 수 있다. 따라서 함수 추적 코드의 오버헤드를 거의 없게 만든다. 그런 다음 성능에 영향을 미치지 않고 완성 또는 거의 완성된 커널에서 Ftrace
를 사용할 수 있다.available_filter_functions
에 저장되며 수만 개가 있다. available_filter_functions
에서 set_ftrace_filter
로 이름을 복사해 함수 추적을 선택적으로 활성화할 수 있으며, 그런 다음 set_ftrace_notrace
에 이름을 작성해 해당 함수 추적을 중지한다. 와일드카드를 사용할 수 있고, 목록에 이름을 추가할 수도 있다.# cd /sys/kernel/debug/tracing
# echo "tcp*" > set_ftrace_filter
# echo function > current_tracer
# echo 1 > tracing_on
# cat trace
echo 0 > /sys/kernel/debug/tracing/tracing_on
sleep 1
echo "tracing_off"
echo 0 > /sys/kernel/debug/tracing/events/enable
sleep 1
echo "events disabled"
echo secondary_start_kernel > /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo "set_ftrace_filter init"
echo function > /sys/kernel/debug/tracing/current_tracer
sleep 1
echo "function tracer enabled"
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_entry/enable
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_exit/enable
echo 1 > /sys/kernel/debug/tracing/events/raw_syscalls/enable
sleep 1
echo "event enabled"
echo schedule ttwu_do_wakeup > /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo "set_ftrace_filter enabled"
echo 1 > /sys/kernel/debug/tracing/options/func_stack_trace
echo 1 > /sys/kernel/debug/tracing/options/sys-offset
echo "function stack trace enabled"
echo 1 > /sys/kernel/debug/tracing/tracing_on
echo "tracing_on"
sleep 1
은 1초 동안 딜레이를 준다.ftrace
설정 명령어를 입력하면 커널 내부에서 ftrace
를 설정하는 함수가 실행된다. 이 때 ftrace
설정 명령어를 커널 내에서 충분히 수행할만한 시간을 확보하기 위해 딜레이를 주는 것이다.tracing_on
: 트레이서 활/비활성화하기ftrace
를 활성화/비활성화 하려면 tracing_on
파일을 설정해야한다.tracing_on
은 부팅 후 기본적으로 0으로 설정돼어 있다.echo 0 > /sys/kernel/debug/tracing/tracing_on
...
echo 1 > /sys/kernel/debug/tracing/tracing_on
echo 0
으로 tracing_on
파일에 0
을 저장한다.ftrace
를 비활성화한다.echo 1
으로 tracing_on
파일에 1
을 저장하는 것은 ftrace
를 활성화 한다.tracing_on
: ftrace
를 활성/비활성 하기 위한 설정파일tracer
설정ftrace
는 nop
, function
, function_graph
같은 트레이서를 제공한다.nop
: 기본 트레이서. ftrace
이벤트만 출력한다.function
: 함수 트레이서. set_ftrace_filter
로 지정한 함수를 누가 호출하는지 출력한다.function_graph
: 함수 실행 시간과 세부 호출 정보를 그래프 포맷으로 출력한다.tracer
설정current_tracer
파일에 트레이서의 이름을 저장해야한다.echo function > /sys/kernel/debug/tracing/current_tracer
current_tracer
파일에 기본적으로 nop
트레이서가 설정되어 있음