Поделиться через


Программирование DTrace

DTrace поддерживает язык программирования D. В этом разделе описывается, как приступить к написанию и использованию скриптов DTrace.

Общие сведения о DTrace в Windows см. в разделе DTrace.

Подробные сведения о DTrace см. в спецификации OpenDTrace версии 1.0 в Кембриджском университете.

Примечание

DTrace поддерживается в сборках Предварительной оценки Windows после версии 18980 и Windows Server 18975.

Дополнительные примеры скриптов

Дополнительные скрипты D, применимые для сценариев Windows, доступны в каталоге примеров исходного кода DTrace.

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

Набор скриптов opentrace Toolkit доступен по адресу 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 для отслеживания времени, затраченного на несколько функций или событий. Ниже приведен простой пример, который отслеживает функцию 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.

См. также:

DTrace в Windows

DTrace ETW

Примеры кода DTrace Windows

DTrace Live Dump