KTRACE(2)

명칭
ktrace - 프로세스의 트레이스

프로그램 라이브러리
libc

서식
<sys/param.h> <sys/time.h> <sys/uio.h> <sys/ktrace.h> int ktrace(const char *tracefile, int ops, int trpoints, int pid)

해설
ktrace() 함수는, 1 개(살) 또는 복수의 프로세스의 트레이스를 유효 또는 무효로 합니다. 유저는 자신의 프로세스만을 트레이스 할 수 있습니다. 슈퍼 유저만이, setuid 프로그램 또는 setgid 프로그램을 트레이스 할 수 있습니다.

tracefile (은)는, 트레이스에 사용하는 파일의 패스명을 지정합니다. 파일은 존재하고 있지 않으면 안되어, 호출측 프로세스에 의해 기입해 가능한 통상 파일일 필요가 있습니다. 트레이스 레코드는 모두 파일의 말미에 추가되므로, 직전의 트레이스 데이터를 잘라 버리기 위해서(때문에)는 파일의 길이를 0 으로 할 필요가 있습니다. 트레이스점이 무효인 경우 (후술의 KTROP_CLEAR 를 참조), tracefile (은)는 NULL 로 할 수 있습니다.

ops 파라미터는 요구된 ktrace 조작을 지정합니다. 정의되고 있는 조작은 다음과 같습니다.
KTROP_SET |
trpoints 그리고 지정된 트레이스점을 유효하게 합니다.
KTROP_CLEAR |
trpoints 그리고 지정된 트레이스점을 무효로 합니다.
KTROP_CLEARFILE | 모든 트레이스를 정지합니다.
KTRFLAG_DESCEND | 트레이스의 변경이, 지정의 프로세스와 그 현재의
모든 child process에 적용됩니다.

trpoints 파라미터는 관심이 있는 트레이스점을 지정합니다. 정의되고 있는 트레이스점은 다음과 같습니다.
KTRFAC_SYSCALL | 시스템 콜을 트레이스 합니다.
KTRFAC_SYSRET | 시스템 콜로부터의 반환값을 트레이스 합니다.
KTRFAC_NAMEI | 패스명의 탐색 조작을 트레이스 합니다.
KTRFAC_GENIO | 모든 입출력을 트레이스 합니다
(이 옵션이 대량의 출력을 생성할 가능성이 있는 것에 주의해 주세요).
KTRFAC_PSIG | 포스트된 시그널을 트레이스 합니다.
KTRFAC_CSW | 콘텍스트 스위칭을 트레이스 합니다.
KTRFAC_INHERIT | 이 이후의 아이에게 트레이스를 계승합니다.

각 트레이스 이벤트는, 범용의 헤더의 뒤에 트레이스점에 고유의 원가요소가 계속되는 형식의 레코드를 출력합니다. 범용의 헤더는 다음과 같습니다.

    struct ktr_header {
    	int	ktr_len;		/* 버퍼의 길이 */
    	short	ktr_type;		/* 트레이스 레코드의 타입 */
    	pid_t	ktr_pid;		/* 프로세스 ID */
    	char	ktr_comm[MAXCOMLEN+1];	/* 명령명 */
    	struct	timeval ktr_time;	/* 타임 스탬프 */
    	caddr_t	ktr_buf;
    };

ktr_len 필드는 이 헤더에 계속된다 ktr_type 데이터의 길이를 나타냅니다. ktr_pid 필드와 ktr_comm 필드는, 레코드를 생성한 프로세스와 명령을 나타냅니다. ktr_time 필드는, 레코드가 생성되었을 때 각을 (마이크로 세컨드 단위로) 나타냅니다. ktr_buf (은)는, 내부 커널 포인터로 있어 유용하지는 않습니다.

범용 헤더에는 ktr_len 바이트의 길이의 ktr_type 레코드가 계속됩니다. 타입에 고유의 레코드는 <sys/ktrace.h> 인클루드 파일내에서 정의되고 있습니다.

반환값

에러
ktrace() (은)는 다음의 경우에 실패합니다.

[ENOTDIR]
    패스의 원가요소중에 디렉토리 이외의 것이 포함되어 있습니다.

[ENAMETOOLONG]
    패스명의 원가요소가 255 캐릭터를 넘고 있는지, 또는 패스명 전체가 1023 캐릭터를 넘고 있습니다.

[ENOENT]
    지정의 트레이스 파일이 존재하지 않습니다.

[EACCES]
    전치패스명의 원가요소에 대해 검색 허가가 거부되고 있습니다.

[ELOOP]
    패스명을 변환할 경우에 검출된 기호 연결이 너무 많습니다.

[EIO]
    파일 시스템에 읽고 쓰기하고 있는 동안에 입출력 에러가 발생했습니다.

[ENOSYS]
    커널이 ktrace 서포트와 함께 컴파일 되고 있지 않습니다.

관련 항목
kdump(1), ktrace(1)

역사
ktrace() 함수는 4.4BSD 그리고 처음 등장했습니다.