이번에도 저번과 같이 ftrace에 대한 오류가 나왔다.
아래와 같은 오류다.
root@raspberrypi:/home/ejun0/user_procs# ./clone_process_debug.sh
tracing_off
events disabled
set_ftrace_filter init
function tracer enabled
./clone_process_debug.sh: 28 줄: echo: 쓰기 오류: 부적절한 인수
event enabled
set_ftrace_filter enabled
function stack trace enabled
tracing_on
clone_process_debug.sh의 28번째 줄은 아래와 같다.
echo _do_fork copy_process* >> /sys/kernel/debug/tracing/set_ftrace_filter
_do_fork나 copy_process중에 함수가 없다는 것이다.
사용자 정의 함수도 아니고 원래 리눅스 커널 함수인데 없다니..!
좀 의아했다.
아무튼 아래와 같은 명령어로 _do_fork가 없다는 사실을 알게 되었다.
cat /sys/kernel/debug/tracing/available_filter_functions | grep _do_fork
cat /sys/kernel/debug/tracing/available_filter_functions | grep copy_process
copy_process
그럼 함수 이름이 바뀐 것일까?
kernel/fork.c 파일에 정의된 clone 함수를 찾아보았더니 아래와 같이 함수가 바뀐 것을 알 수 있었다.
#ifdef CONFIG_CLONE_BACKWARDS
SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
int __user *, parent_tidptr,
unsigned long, tls,
int __user *, child_tidptr)
#elif defined(CONFIG_CLONE_BACKWARDS2)
SYSCALL_DEFINE5(clone, unsigned long, newsp, unsigned long, clone_flags,
int __user *, parent_tidptr,
int __user *, child_tidptr,
unsigned long, tls)
#elif defined(CONFIG_CLONE_BACKWARDS3)
SYSCALL_DEFINE6(clone, unsigned long, clone_flags, unsigned long, newsp,
int, stack_size,
int __user *, parent_tidptr,
int __user *, child_tidptr,
unsigned long, tls)
#else
SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
int __user *, parent_tidptr,
int __user *, child_tidptr,
unsigned long, tls)
#endif
{
struct kernel_clone_args args = {
.flags = (lower_32_bits(clone_flags) & ~CSIGNAL),
.pidfd = parent_tidptr,
.child_tid = child_tidptr,
.parent_tid = parent_tidptr,
.exit_signal = (lower_32_bits(clone_flags) & CSIGNAL),
.stack = newsp,
.tls = tls,
};
return kernel_clone(&args);
}
마지막을 보면 함수가 _do_fork가 아닌 kernel_clone으로 바뀌어 있는게 보인다.
결론
clone_process_debug.sh의 28번째 줄을 아래와 같이 바꾸자
echo kernel_clone copy_process* >> /sys/kernel/debug/tracing/set_ftrace_filter
참고
'디버깅을 통해 배우는 리눅스 커널의 구조' 카테고리의 다른 글
IRQ 스레드 (threaded IRQ) (0) | 2022.06.17 |
---|---|
인터럽트 디스크립터와 인터럽트 디버깅 (0) | 2022.06.15 |
bcm2711 라즈베리파이에서 bcm2835 라이브러리 사용 (0) | 2022.06.12 |
스터디 계획(1주차) (0) | 2022.06.11 |
line 19: echo: write error: Invalid argument (0) | 2022.05.24 |