
binary format으로 처리)이라 ftrace 로그를 활성화해도 시스템 동작에 부하를 거의 주지 않음개발자에게 친화적인 툴
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
이미지 사이즈 체크 요망
echo 0 > /sys/kernel/debug/tracing/tracing_on
# ftrace configuration script code
echo 1 > /sys/kernel/debug/tracing/tracing_on
tracing_on 파일을 설정kernel/trace/trace_events_trigger.c
static void traceon_trigger(struct event_trigger_data *data, struct trace_buffer *buffer, void *rec, struct ring_buffer_event *event)
{
struct trace_event_file *file = data->private_data;
...
if(tracing_is_on())
return;
tracing_on();
}
echo 0 > /sys/kernel/debug/tracing/tracing_on
sleep 1
echo "tracing_off"
# ftrace buffer size를 늘려준다.
echo 8096 > /sys/kernel/debug/tracing/buffer_size_kb
sleep 1
echo nop > /sys/kernel/debug/tracing/current_tracer
sleep 1
# interrupt 처리하는 tracing : irq
# interrupt handler 함수가 마무리되기 전에 ftrace event 메시지가 출력됨
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_exit/enable
# interrupt handler 함수를 호출하기 전에 정보를 출력해줌
echo 1 > /sys/kernel/debug/tracing/events/irq/irq_handler_entry/enable
# 프로세스가 task scheduling 될 때의 동작을 tracing해줌
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable
# 프로세스를 깨울 때 tracing해줌
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable
## 프로세스의 task scheduling과 관련된 속성 정보 출력
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_stat_runtime/enable
echo 1 > /sys/kernel/debug/tracing/tracing_on
echo "tracing_on"

nop : 기본 tracer로써 ftrace 이벤트만 출력function : 함수 tracer로 set_ftrace_filter로 지정한 함수를 누가 호출하는지 출력function_graph : 함수 실행 시간과 세부 호출 정보를 그래프 포맷으로 출력root@rasberrypi:/home/austin# cat /sys/kernel/debug/tracing/available_tracers
blk function_graph wakeup_dl wadup_rt wakeup irqsoff function nop
kernel/trace/trace.c
static const struct file_operations set_tracer_fops = {
.open = tracing_open_generic,
.read = tracing_set_trace_read,
.write = tracing_set_trace_write,
.llseek = generic_file_llseek,
};
#!/bin/bash
echo 0 > /sys/kernel/debug/tracing/tracing_on
sleep 1
echo "tracing_off"
echo 0 > /sys/kernel/debug/tracing/enable
sleep 1
echo "events disabled"
echo secondary_start_kernel > /sys/kernel/debug/tracing/set_trace_filter
sleep 1
echo "set_trace_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/sym-offset
echo 1 > /sys/kernel/debug/tracing/tracing_on
echo "tracing_on"
echo schedule > /sys/kernel/debug/tracing/set_trace_filter
set_ftrace_filter 파일에 tracing하려는 함수 이름을 지정(현업에서 많이 설정)set_ftrace_filter는 현재 tracer를 function_graph와 function으로 설정할 경우 설정available_filter_functions파일에 포함된 함수만 지정 (커널 함수 inline 불가)set_ftrace_filter파일에 필터로 함수를 지정하지 않으면 available_filter_functions파일에 포함된 모든 커널 함수를 tracing (불필요한 로그가 출력되니 반드시 설정!)