Linux/Linux System Programming

ftrace 메세지로 시스템 콜 exit() 프로세스 생성과 종료 과정 분석

Hans_S_92 2022. 12. 22. 17:48

ftrace 메세지로 시스템 콜 exit() 프로세스 생성과 종료 과정 분석

소스코드

1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <stdlib.h>
  4
  5 #define PROC_TIMES 3
  6 #define SLEEP_DURATION 3 //sec unit
  7
  8 int main()
  9 {
 10     int proc_times = 0;
 11
 12     for(proc_times = 0; proc_times < PROC_TIMES; proc_times++) {
 13         printf("rpi tracing\\n");
 14         sleep(SLEEP_DURATION);
 15     }
 16
 17     exit(EXIT_SUCCESS);
 18     return 0;
 19 }

ftrace 활성화 → 위 소스코드 실행 → ftrace 비활성화

프로세스 생성 로그

1101             bash-20507 [003] .... 260833.154530: sys_clone+0x14/0x38 <-ret_fast_syscall+0x0/0x28
1102             bash-20507 [003] .... 260833.154557: <stack trace>
1103  => sys_clone+0x18/0x38
1104  => ret_fast_syscall+0x0/0x28
1105  => 0x7e9d5170
1106             bash-20507 [003] .... 260833.154560: _do_fork+0x14/0x464 <-sys_clone+0x30/0x38
1107             bash-20507 [003] .... 260833.154571: <stack trace>
1108  => _do_fork+0x18/0x464
1109  => sys_clone+0x30/0x38
1110  => ret_fast_syscall+0x0/0x28
1111  => 0x7e9d5170
1112             bash-20507 [003] .... 260833.154574: copy_process.part.3+0x14/0x1af0 <-_do_fork+0xc0/0x464
1113             bash-20507 [003] .... 260833.154587: <stack trace>
1114  => copy_process.part.3+0x18/0x1af0
1115  => _do_fork+0xc0/0x464
1116  => sys_clone+0x30/0x38
1117  => ret_fast_syscall+0x0/0x28
1118  => 0x7e9d5170
1119             bash-20507 [003] .... 260833.155233: sched_process_fork: comm=bash pid=20507 child_comm=bash child_pid=20520
1120           <idle>-0     [002] d... 260833.155275: sched_switch: prev_comm=swapper/2 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=bash next_pid=20520 next_prio=120
1121             bash-20507 [003] d... 260833.155764: sched_switch: prev_comm=bash prev_pid=20507 prev_prio=120 prev_state=S ==> next_comm=swapper/3 next_pid=0 next_prio=120
1122           <idle>-0     [000] dnh. 260833.156383: sched_wakeup: comm=in:imklog pid=423 prio=120 target_cpu=000
1123           <idle>-0     [000] dnh. 260833.156397: sched_wakeup: comm=systemd-journal pid=115 prio=120 target_cpu=000

위는 프로세스 생성 시점이다. 스택 트레이스가 쌓이면서 do fork가 호출되는 것을 확인할 수 있다.

1119번 라인을 보면 20520 pid를 가진 자식 프로세스가 생성된 것을 확인할 수 있다.

프로세스 종료 로그

1888    rpi_proc_exit-20520 [002] .... 260842.160358: do_exit+0x14/0xbe8 <-do_group_exit+0x50/0xe8
1889    rpi_proc_exit-20520 [002] .... 260842.160388: <stack trace>
1890  => do_exit+0x18/0xbe8
1891  => do_group_exit+0x50/0xe8
1892  => __wake_up_parent+0x0/0x30
1893  => ret_fast_syscall+0x0/0x28
1894  => 0x7eada538
1895    rpi_proc_exit-20520 [002] .... 260842.160714: sched_process_exit: comm=rpi_proc_exit pid=20520 prio=120
1896    rpi_proc_exit-20520 [002] d... 260842.160802: signal_generate: sig=17 errno=0 code=1 comm=bash pid=20507 grp=1 res=0
1897    rpi_proc_exit-20520 [002] d... 260842.160820: sched_switch: prev_comm=rpi_proc_exit prev_pid=20520 prev_prio=120 prev_state=Z ==> next_comm=swapper/2 next_pid=0 next_prio=120

exit함수를 호출하면 커널공간에서 실행되는 sys_exit_group() 함수가 호출된다.

유저단과 비교하자면 유저단은 signal을 받아들여서 커널에서 호출되고, exit함수는 바로 sys_exit_group() 함수를 호출한다.

'Linux > Linux System Programming' 카테고리의 다른 글

유닉스 디렉토리 구조와 의미  (0) 2023.05.22
Kill -9 Program ftrace (유저단)  (0) 2022.12.22
프로세스는 뭘까? - 정의  (0) 2022.12.08
ftrace란?  (0) 2022.11.24
dump_stack()함수  (0) 2022.11.20