#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;
}
#!/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"
#!/bin/bash
echo 0 > /sys/kernel/debug/tracing/tracing_on
echo "ftrace off"
sleep 3
cp /sys/kernel/debug/tracing/trace .
mv trace ftrace_log1.c
#ftrace 실습은 su 권한에서 실행 추천 sudo su #clone_process_debug.sh 실행권한 추가 chmod 777 clone_process_debug.sh #clone_process_debug.sh 실행 ./clone_process_debug.sh
Makefile
raspbian_proc: raspbian_test.c gcc -o raspbian_proc raspbian_test.c
#raspbian_proc 실행 권한 추가 chmod 777 raspbian_proc #raspbian_proc 실행 ./raspbian_proc
ps -ely
- PID: 2327
- PPID(부모 프로세스 PID): 2192(bash)
sudo kill -9 2327
#get_ftrace.sh 실행 권한 추가
chmod 777 get_ftrece.sh
# su 권한 계정 진입
sudo su
#ftrace 로그 추출
./get_ftrace.sh
- PID 2192 인 bash 쉘에서, PID 2327인 raspbain_proc 자식 프로세스를 fork()
- kill 명령어는 su 권한이 필요하기 때문에 sudo 를 처리하기 위한 PID 2329 프로세스 생성
- 이후 PID 2330 의 kill 프로세스 생성
- kill 프로세스가 signal_generate 를 통해 9번 시그널 생성해 raspbian_proc 프로세스에게 전달
- signal_deliver를 통해 9번 시그널을 전달받은 raspbian_proc는 do_exit()
- raspbian_proc는 signal_generate를 통해 17번 시그널을 생성
- 부모 프로세서인 PID 2192인 bash에 17번 시그널 전달
- 부모 프로세스인 bash는 signal_deliver를 통해 PID 2327인 raspbian_proc로 부터 17번 시그널 전달 받음
- kill 프로세스가 sudo 프로세스에게 종료 신호 보냄
- kill 프로세스의 종료 신호를 받은 sudo 프로세스도 종료
- sudo 프로세스의 부모 프로세스 PID 2254 bash 에게 종료 시그널 17 전달
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define PROC_TIMES 3
#define SLEEP_DURATION 3 // second unit
int main()
{
int proc_times = 0;
for(proc_times = 0; proc_times < PROC_TIMES; proc_times++) {
printf("rpi tracing \n");
sleep(SLEEP_DURATION);
}
exit(EXIT_SUCCESS);
return 0;
}
#!/bin/bash
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 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 do_exit copy_process > /sys/kernel/debug/tracing/set_ftrace_filter
sleep 1
echo "set_ftrace_filter enabled"
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_process_exit/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_process_fork/enable
echo 1 > /sys/kernel/debug/tracing/events/sched/sched_process_free/enable
sleep 1
echo "event 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"
#!/bin/sh
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 실습은 su 권한에서 실행 추천 sudo su #clone_process_debug.sh 실행권한 추가 chmod 777 process_exit.sh #clone_process_debug.sh 실행 ./process_exit.sh
Makefile
rpi_proc_exit:rpi_process_exit.c gcc -o rpi_proc_exit rpi_process_exit.c
#rpi_proc_exit 실행 권한 추가 chmod 777 rpi_proc_exit #rpi_proc_exit 실행 ./rpi_proc_exit
- 9초 후 프로세스가 자동으로 종료됨
#get_ftrace.sh 실행 권한 추가
chmod 777 get_ftrece.sh
# su 권한 계정 진입
sudo su
#ftrace 로그 추출
./get_ftrace.sh