2jun0 2022. 5. 29. 00:27

이번에도 저번과 같이 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

 

참고

https://patchwork.kernel.org/project/linux-kselftest/patch/20200818173411.404104-2-christian.brauner@ubuntu.com/