다음을 통해 공유


DTrace 프로그래밍

DTrace는 D 프로그래밍 언어를 지원합니다. 이 항목에서는 DTrace 스크립트 작성 및 사용을 시작하는 방법을 설명합니다.

Windows의 DTrace에 대한 일반적인 내용은 DTrace를 참조하세요.

DTrace에 대한 자세한 내용은 케임브리지 대학의 OpenDTrace 사양 버전 1.0 을 참조하세요.

참고

DTrace는 버전 18980 이후의 Windows 참가자 빌드 및 Windows Server 빌드 18975에서 지원됩니다.

추가 샘플 스크립트

Windows 시나리오에 적용 가능한 추가 D 스크립트는 DTrace 소스 코드의 샘플 디렉터리에서 사용할 수 있습니다.

https://github.com/microsoft/DTrace-on-Windows/tree/windows/samples/windows

opentrace 도구 키트 스크립트 집합은 에서 https://github.com/opendtrace/toolkit사용할 수 있습니다.

Hello World

DTrace 스크립트는 명령 및 D 프로그래밍 스크립트 요소를 포함하는 간단한 텍스트 파일입니다.

dtrace:::BEGIN
{
  trace("Hello World from DTrace!");
  exit(0);
}

파일을 helloworld.d로 저장합니다.

관리자 권한으로 명령 프롬프트 창을 열고 -s 옵션을 사용하여 스크립트를 실행합니다.

dtrace -s helloworld.d
dtrace: script '.\helloworld.d' matched 1 probe
CPU     ID                    FUNCTION:NAME
  0      1                           :BEGIN   Hello World from DTrace!

NtCreateUserProcess 반환 시간

DTrace 스크립트를 작성하여 여러 함수/이벤트에서 소요된 시간을 추적할 수 있습니다. 다음은 만들기 프로세스에 대한 entry/return 간에 NtCreateUserProcess 함수를 추적하는 간단한 예제입니다.


syscall::NtCreateUserProcess:entry
{
    self->ts = timestamp;
}

syscall::NtCreateUserProcess:return
{
    printf(" [Caller %s]: Time taken to return from create process is %d MicroSecond \n", execname, (timestamp - self->ts)/ 1000);
}

파일을 ntcreatetime.d로 저장하고 -s 옵션을 사용하여 테스트 스크립트를 실행합니다.

C:\Windows\system32>dtrace -s ntcreatetime.d
dtrace: script 'ntcreatetime.d' matched 2 probes
CPU     ID                    FUNCTION:NAME
  0    183       NtCreateUserProcess:return  [Caller svchost.exe]: Time taken to return from create process is 51191 MicroSecond

  0    183       NtCreateUserProcess:return  [Caller SearchIndexer.]: Time taken to return from create process is 84418 MicroSecond

  0    183       NtCreateUserProcess:return  [Caller SearchIndexer.]: Time taken to return from create process is 137961 MicroSecond

파일 삭제 추적기

이 샘플 스크립트는 syscall 공급자를 사용하여 항목에서 NtOpenFile을 계측하고 전달된 플래그(인수 #5)를 확인하여 시스템 전체에서 삭제를 추적합니다.

아래 스크립트를 filedeletetracker.d에 복사합니다.

ERROR{exit(0);}

struct ustr{uint16_t buffer[256];};

syscall::NtOpenFile:entry
{
   this->deleted = arg5 & 0x00001000; /* & with FILE_DELETE_ON_CLOSE */

  if (this->deleted) {
        this->attr = (nt`_OBJECT_ATTRIBUTES*)
            copyin(arg2, sizeof(nt`_OBJECT_ATTRIBUTES));

        if (this->attr->ObjectName) {
            this->objectName = (nt`_UNICODE_STRING*)
                copyin((uintptr_t)this->attr->ObjectName,
                       sizeof(nt`_UNICODE_STRING));
          
            this->fname = (uint16_t*)
                copyin((uintptr_t)this->objectName->Buffer,
                       this->objectName->Length);

            printf("Process %s PID %d deleted file %*ws \n", execname,pid, 
			this->objectName->Length / 2, 
			 ((struct ustr*)this->fname)->buffer);
        }
    }
}

-s 옵션을 사용하여 테스트 스크립트를 실행합니다.

삭제할 파일을 만들거나 찾습니다. 파일을 휴지통으로 이동한 다음 휴지통을 비우세요. 파일이 삭제되고 이벤트가 발생하면 파일 삭제에 대한 정보가 표시됩니다.

C:\Windows\system32>dtrace -s filedeletetracker.d
dtrace: script 'filedeletetracker.d' matched 8 probes
CPU     ID                    FUNCTION:NAME
  0    512                 NtOpenFile:entry Process explorer.exe PID 4684 deleted file \??\C:\$Recycle.Bin\S-1-12-1-3310478672-1302480547-4207937687-2985363607\$ROSR3FA.txt

이 프로그램은 파일 삭제를 계속 모니터링하도록 설계되었습니다. Ctrl+C를 눌러 종료합니다.

더 큰 코드 샘플은 다음 항목인 DTrace Windows 코드 샘플을 참조하세요.

참고 항목

Windows의 DTrace

DTrace ETW

DTrace Windows 코드 샘플

DTrace 라이브 덤프