DTrace
Начиная с Windows Server 2025, dtrace
включается в качестве встроенного средства. DTrace — это программа командной строки, которая позволяет пользователям отслеживать и отлаживать производительность системы в режиме реального времени. С dtrace
помощью пользователей можно динамически инструментировать ядро и код пространства пользователя, не изменяя сам код.
Это мощное средство поддерживает различные методы сбора и анализа данных, включая агрегаты, гистограммы и трассировку событий на уровне пользователя. Пробы можно указать в dtrace
сценариях, где скрипт определяет отслеживаемые пробы и действия, которые необходимо предпринять при срабатывании проб. Проба — это определенная точка в коде, где данные можно собирать для выполнения этих действий.
Примечание.
Этот встроенный dtrace
порт отличается от установщика MSI DTrace для Windows окружающих параметров и других возможностей. Дополнительные сведения о DTrace для Windows см. в разделе DTrace в Windows.
Полное руководство по использованию DTrace см. в руководстве по динамической трассировке.
Включение DTrace
Прежде чем dtrace
его можно будет использовать, сначала его необходимо включить. Чтобы включить dtrace
, откройте командную строку с повышенными привилегиями или PowerShell от имени администратора и выполните следующую команду:
bcdedit /set dtrace on
Перезагрузка требуется для того, чтобы это изменение вступило в силу.
Синтаксис
dtrace [-BCeFhlqSvVwYZ] [-b bufsz] [-c cmd] [-D name[=def]] [-I path]
[-L path] [-o output] [-p pid] [-s script] [-U name] [-x opt[=val]] [-X a|c|s|t]
[-y symbol path]
[-P provider [[ predicate ] action ]] [-m [ provider: ]
module [[ predicate ] action ]] [-f [[ provider: ] module: ]
func [[ predicate ] action ]] [-n [[[ provider: ] module: ] func: ]
name [[ predicate ] action ]] [-i probe-id [[ predicate ] action ]] [ args ... ]
Примечание.
Параметры для dtrace.exe учитывает регистр. Не забудьте использовать правильный регистр при указании параметров, чтобы избежать непредвиденного поведения.
Параметр | Описание |
---|---|
-B <bufsz> |
Задает размер буфера, используемого для хранения данных трассировки, где bufsz — требуемый размер буфера в байтах, килобайтах (k), мегабайтах (m) или гигабайтах (g). |
-C <cmd> |
Запускает указанную команду и завершает работу после завершения, где cmd — это команда, которую необходимо выполнить перед запуском трассировки. Если используется несколько экземпляров -c , вытягивается, когда все команды завершаются выполнением и сообщают о состоянии выхода для каждого дочернего процесса. |
C- | Запускает препроцессор ucpp в файлах скриптов перед выполнением трассировки. |
-D <name> =<def> |
Определяет символ при вызове препроцессора, где имя является именем символа для определения, и дефирование является необязательным значением для назначения символу. |
-e | Завершает работу после компиляции запроса, но перед включением проб. |
f- | Включает или перечисляет пробы, соответствующие указанному имени функции. |
F- | Объединяет выходные данные трассировки по функции, что упрощает анализ. |
-h | Создает файл заголовка с определениями статических проб. |
-Я <probe-id> |
Включает или перечисляет пробы, соответствующие указанному идентификатору пробы, где идентификатор пробы является идентификатором трассировки пробы. |
-Я <path> |
Добавляет указанный каталог в путь поиска препроцессора, где путь — это каталог, который необходимо добавить, содержащий файлы #include . |
-l | Выводит список проб, которые соответствуют заданным критериям на основе параметров -P, -m, -f, -n, -i и -s . Если эти параметры не указаны, перечислены все пробы. |
-L <path> |
Добавляет указанный каталог в путь поиска библиотеки, где путь — это каталог библиотеки, который необходимо добавить, содержащий общие определения. |
-m | Включает или перечисляет пробы, соответствующие указанному имени модуля в аргументе с помощью поставщика формата :module или модуля. Если квалификаторы не указаны помимо имени модуля, все пробы с этим именем модуля сопоставляются. |
-n | Включает или перечисляет пробы, соответствующие указанному имени пробы в аргументе с помощью поставщика формата:module:function:name, module:function:name, function:name, function:name или name. Если квалификаторы не указаны помимо имени пробы, все пробы с этим именем совпадают. |
-O <output> |
Задает выходной файл для данных трассировки, где выходные данные — это имя файла, который требуется использовать для данных трассировки. |
-P <pid> |
Захватывает указанный идентификатор процесса (PID) и кэширует свои таблицы символов, которые можно использовать для анализа поведения программы. |
-P <provider> |
Включает или перечисляет пробы, соответствующие указанному имени поставщика, где поставщик является именем поставщика. Одновременно можно использовать несколько экземпляров параметра -P . |
-q | Задает тихий режим, который выводит только данные явно трассировки. |
-s <script> |
Включает или перечисляет пробы в соответствии с указанным скриптом D, где скрипт — это имя скрипта, который требуется запустить. Если задано значение -e , программа компилируется, но сбор данных не выполняется. Если задано значение -l , программа компилируется и отображается список сопоставленных проб, но сбор данных не выполняется. Если параметр -e или -l не указан, программа компилируется, сбор данных выполняется в соответствии с указанными пробами и начинается трассировка. |
S- | Выводит промежуточный код компилятора D-языка для отладки в stderr. |
-U <name> |
Не определяет символ при вызове препроцессора, где имя — имя символа, который требуется отменить. |
-v | Задает подробный режим, который сообщает атрибуты стабильности и аргументы. |
-V | Отображает версию API dtrace. |
w- | Разрешает разрушительные действия при указании параметров -s, -P, -m, -f, -n или -i. Разрушительные действия могут включать такие действия, как изменение переменных ядра, изменение поведения системных вызовов или сбой системы. |
-X <opt> =<val> |
Включает или изменяет параметры компилятора и трассировки, где выбирается имя параметра, который требуется включить или изменить, и val является необязательным значением. |
-X <a|c|s|t> |
Определяет, насколько строгий скомпилированный код C соответствует стандарту ISO C при вызове cpp. Доступные аргументы:
|
-Y <symbol path> |
Задает путь поиска символов для разрешения скрипта dtrace, где путь к общей библиотеке или каталогу, содержащему символы. Дополнительные сведения см. в разделе "Пути символов". |
-Y | Использует путь поиска символов по умолчанию для скрипта dtrace. |
Z | Разрешает описания проб, которые соответствуют нулю проб для отладки. |
В следующем списке описаны оставшиеся описания:
Предикат: предикат заключен в косую черту (
/ /
) и является логическим выражением, которое может ссылаться на переменные, константы и функции. Предикаты можно использовать для фильтрации выходныхdtrace
данных на основе этих событий. Это выражение вычисляется каждый раз при срабатывании пробы. Если предикат оценивается как true, выполняется связанное действие.Действие: действие заключено в фигурные скобки (
{ }
) и представляет собой набор инструкций D-языка, выполняемых при срабатывании пробы и связанного с ним предиката, если он имеет значение true. Действия можно использовать для печати инструкций вывода, записи данных или выполнения других операций, таких как отправка сигнала или изменение переменной.Модуль: компонент поставщика, который содержит набор связанных проб. Модули можно указать в
dtrace
сценариях, чтобы ограничить область скрипта определенным модулем или набором модулей.Func: имя функции, связанное с пробой. Например, проба
syscall::NtReadFile
связана с функциейread
. Функции можно указать вdtrace
сценариях, чтобы ограничить область скрипта определенной функцией или набором функций.Args: аргументы, передаваемые выражению действия при срабатывании пробы и связанного предиката, если таковые имеются, оценивается как true. Args можно использовать для сбора данных из контекста пробы, таких как значения аргументов функции или возвращаемых системным вызовом значений. Args также можно использовать для передачи данных между пробами или изменения поведения скрипта.
Примеры
Чтобы отследить все системные вызовы, напечатать имя исполняемого файла и имя выполняемого системного вызова выполните следующую команду:
dtrace -n 'syscall:::entry { printf("%s called syscall %s", execname, probefunc); }'
Эта команда выполняет трассировку функции "function_name" в процессе с указанным идентификатором ИДЕНТИФИКАТОРа и выводит имя функции, идентификатор идентификатора вызываемого процесса и имя исполняемого файла.
dtrace -n 'pid$target::function_name:entry { printf("Function %s called by process %d (%s)", probefunc, pid, execname); }' -p <PID>
Дополнительные примеры использования см. в статье "Начало работы dtrace
с DTrace" — команды одной строки.