Программирование 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.