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 코드 샘플을 참조하세요.