뭔가 이런 기본적인 지식이 중요하다는 것을 깨닫게 되는 요즘이다.
System call tracer
A zine about strace
시스템 콜
은 프로그램이 OS로부터 몇몇 기능을 요청할 수 있도록 하는 인터페이스이다.
현재 워킹 디렉토리를 변경하거나, 파일의 권한을 변경하거나, 기타 등등의 일을 한다.
strace
는 프로그램이 실행될 때 호출하는 시스템 콜을 출력한다.
strace는 내부적으로 ptrace를 활용한다.
ptrace
는 process trace
를 의미하며, 부모 프로세스가 자식 프로세스의 실행을 감시하고 제어할 수 있도록 하는 시스템 콜의 일종이다.
strace에서 사용되나, gdb
디버거와 같은 것들을 사용할 수 있게 해준다.
ptrace 시스템 콜은 내부적인 리눅스 데이터 구조체를 사용하여, 추적 프로그램(부로 프로세스)과 추적 대상 프로그램(자식 프로세스) 간의 관계를 설정한다.
자식 프로세스에서 시스템 콜이 호출될 때마다, 부모 프로세스에게 시스템 콜에 대한 알림이 전송되고, 자식 프로세스는 일시적으로 정지된다.
이 시점에서 strace
든 gdb
든, ptrace를 호출하는 프로그램은 알림을 받은 시스템 콜에 대한 정보를 처리한 다음에 제어권을 다시 하위 프로세스로 되돌린다.
자식 프로세스, ptrace, 상위 프로그램 사이를 앞뒤로 점프
하는 것은 strace의 단점 중 하나이다.
운영체제가 여러 프로세스 간에 컨텍스트를 반복적으로 전환해야 하므로 속도가 느리다.
ptrace는 실행 중인 프로세스와 higher level tool (gdb 또는 strace와 같은) 사이의 중재자 역할을 담당한다.
An implementation of dynamic tracing
Sysdig vs DTrace vs Strace: A technical discussion. | Sysdig
strace는 프로세스를 검사하기 위해 ptrace에 의존하지만, dtrace는 조금 다르게 진행된다.
프로그래머는 C-like syntax인 D
를 사용하여 probe
를 작성한다.
이 probe는 dtrace가 시스템 콜을 호출하거나, 함수를 종료할 때 수행해야 하는 작업 또는 원하는 다른 작업을 정의한다.
probe는 아래와 같은 스크립트 파일에 저장된다.
syscall::read:entry {
printf("read has been called.");
}
read
가 호출되면 추적기는 "read has been called" 라는 문자열을 출력한다.이러한 스크립트 파일은 다음과 같이 dtrace에 의해 호출된다.
$ dtrace -s my_probe.d
dtrace
는 해당 probe
에 정의된 이벤트가 실행될 때마다 probe 내부의 logic
을 실행한다.
이러한 유연성 덕분에 dtrace는 'dynamic tracer'라는 타이틀을 얻게 되었다.
dtrace version of truss
truss
는 사용자가 프로그램에 의해 수행된 시스템 콜을 print
할 수 있도록 하는 UNIX-specific command
이다.A list of different Linux tracers