728x90
반응형
ftrace 로그 추출하기 위한 과정
- ftrace 로그 설정
- 분석하기 위한 프로세스 실행
- 프로세스의 동작 확인 후, kill 명령어로 프로세스 종료
- ftrace 로그 추출
분석할 소스 코드
리눅스 시스템을 관리하는 sleep()이나 fork() 함수를 직접 호출하기 때문에 응용 프로그램 입장에서 저수준 프로그램이라고 한다.
sleep()이나 fork()와 같은 함수는 리눅스 시스템 저수준 함수(API)이다.
#include <stdio.h>
#include <unistd.h>
#define PROC_TIMES 500
#define SLEEP_DURATION 3 // second unit
int main()
{
int proc_times = 0;
for(proc_times = 0; proc_times < PROC_TIMES; proc_times++) {
printf("raspbian tracing \n");
sleep(SLEEP_DURATION);
}
return 0;
}
위 코드는 for문을 돌면서 "raspbian tracing"이라는 메시지를 출력하고 3초 동안 sleep 상태로 진입하는 과정을 반복한다.
컴파일
$ gcc -o raspbian_proc raspbian_test.c
위에서 컴파일한 raspbian_proc 프로세스가 어떻게 생성되고 실행되는지 분석해 보자.
ftrace 설정
아래 코드는 ftrace를 설정하는 clone_proces_debug.sh 코드이다.
#!/bin/bash
echo 0 > /sys/kernel/debug/tracing/tracing_on
sleep 1
echo "tracing_off"
echo 0 > /sys/kernel/debug/tracing/events/enable
echo 8096 > /sys/kernel/debug/tracing/buffer_size_kb
sleep 1
echo "events disabled"
echo do_init_module > /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_switch/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_process_fork/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_process_exit/enable
echo 1 > /sys/kernel/debug/tracing/events/signal/enable
echo do_exit copy_process > /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo "event enabled"
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 "function stack trace enabled"
echo 1 > /sys/kernel/debug/tracing/tracing_on
echo "tracing_on"
trace 할 함수 설정
echo sys_clone do_exit > /sys/kernel/debug/tracing/set_ftrace_filter
echo _do_fork copy_process* >> /sys/kernel/debug/tracing/set_ftrace_filter
위 명령어를 실행하면 콜 스택 출력할 함수를 set_ftrace_filter라는 파일로 지정한다.
- sys_clone(0
- do_exit()
- _do_fork()
- copy_process()
$ cat /sys/kernel/debug/tracing/available_filter_functions
위 경로의 available_filter_functions을 확인하면 출력 가능한 함수 목록을 확인할 수 있다.
이벤트 활성화
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_process_fork/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_process_exit/enable
sched_process_fork와 sched_process_exit 이번트를 통해 프로세스가 종료하고 생성하는 동작을 추적할 수 있다.
쉘 스크립트 실행
$ sudo ./clone_proces_debug.sh
728x90
반응형
로그 추출
프로세스 실행
$ ./raspbian_proc
프로세스 종료
# kill -9 [PID]
$ kill -9 1938
ftrace 로그 추출
$ ./get_ftrace.sh
#!/bin/bash
echo 0 > /sys/kernel/debug/tracing/tracing_on
echo "ftrace off"
sleep 3
cp /sys/kernel/debug/tracing/trace .
mv trace ftrace_log.c
위 쉘 스크립트를 실행하면 ftrace_log.c 파일이 생성된 것을 확인할 수 있다.
아래 이미지는 ftrace_log.c 파일을 확인한 모습이다.
다음 포스팅에서 ftrace 로그 분석을 해보자.
728x90
반응형