strace, ptrace, dtrace, dtruss 간단하게 정리

wisdom·2021년 5월 6일
1

뭔가 이런 기본적인 지식이 중요하다는 것을 깨닫게 되는 요즘이다.

strace & ptrace


strace

System call tracer

  • A zine about strace

    Spying on your programs with strace

  • 시스템 콜은 프로그램이 OS로부터 몇몇 기능을 요청할 수 있도록 하는 인터페이스이다.

  • 현재 워킹 디렉토리를 변경하거나, 파일의 권한을 변경하거나, 기타 등등의 일을 한다.

  • 시스템 콜 리스트

  • strace는 프로그램이 실행될 때 호출하는 시스템 콜을 출력한다.

ptrace

strace는 내부적으로 ptrace를 활용한다.

  • ptraceprocess trace를 의미하며, 부모 프로세스가 자식 프로세스의 실행을 감시하고 제어할 수 있도록 하는 시스템 콜의 일종이다.

  • strace에서 사용되나, gdb 디버거와 같은 것들을 사용할 수 있게 해준다.

  • ptrace 시스템 콜은 내부적인 리눅스 데이터 구조체를 사용하여, 추적 프로그램(부로 프로세스)과 추적 대상 프로그램(자식 프로세스) 간의 관계를 설정한다.

  • 자식 프로세스에서 시스템 콜이 호출될 때마다, 부모 프로세스에게 시스템 콜에 대한 알림이 전송되고, 자식 프로세스는 일시적으로 정지된다.

  • 이 시점에서 stracegdb든, ptrace를 호출하는 프로그램은 알림을 받은 시스템 콜에 대한 정보를 처리한 다음에 제어권을 다시 하위 프로세스로 되돌린다.

  • 자식 프로세스, ptrace, 상위 프로그램 사이를 앞뒤로 점프하는 것은 strace의 단점 중 하나이다.

  • 운영체제가 여러 프로세스 간에 컨텍스트를 반복적으로 전환해야 하므로 속도가 느리다.

요약

ptrace는 실행 중인 프로세스와 higher level tool (gdb 또는 strace와 같은) 사이의 중재자 역할을 담당한다.

dtrace


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을 실행한다.

    • entering a certain system call or exiting a function and so on
  • 이러한 유연성 덕분에 dtrace는 'dynamic tracer'라는 타이틀을 얻게 되었다.

dtruss


dtrace version of truss

  • truss는 사용자가 프로그램에 의해 수행된 시스템 콜을 print 할 수 있도록 하는 UNIX-specific command이다.
  • 본질적으로 리눅스에 존재하는 strace의 변형이다.
  • strace is to dtrace as truss is to dtruss

기타


추적기 리스트

A list of different Linux tracers

추가 자료

References


profile
블로그 이전 -> wisdom-lee.xyz

0개의 댓글