DTrace в Windows

DTrace (DTrace.exe) — это средство командной строки, отображающее системную информацию и события. DTrace — это платформа трассировки открытый код, перенесенная в окна. DTrace изначально был разработан для операционной системы Solaris. Он обеспечивает динамическое инструментирование обеих функций пользователя или ядра, возможность скрипта с помощью D-языка, спекулятивной трассировки. Кроме того, DTrace имеет определенные расширения ОС Windows, такие как инструментирование ETW, создание событий ETW, пробы системных вызовов и возможности записи динамического дампа.

Примечание.

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

Сайт DTrace на сайте Windows GitHub находится здесь:

https://github.com/microsoft/DTrace-on-Windows

Открытие сведений DTrace

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

Основной сайт GitHub находится по адресу https://github.com/opendtrace/.

Набор полезных скриптов доступен по адресу https://github.com/opendtrace/toolkit.

Доступны несколько книг DTrace, например:

DTrace: динамическая трассировка в Oracle Solaris, Mac OS X и FreeBSD Брендан Грегг и Джим Мауро

Производительность и инструменты Solaris: DTrace и MDB методы для Solaris 10 и OpenSolaris Ричард Макдугалл, Джим Мауро и Брендан Грегг

Предоставление отзывов о Windows DTrace

Используйте центр отзывов, чтобы запросить новые функции или сообщить о любых проблемах или ошибках в Windows DTrace.

  1. Запустите центр отзывов. Перейдите к поиску, введите слово отзывов и выберите Центр отзывов.
  2. Выберите функцию или сообщите о проблеме.
  3. Укажите подробное описание проблемы или предложения.

Расширения Windows DTrace

Ниже приведены некоторые поставщики, доступные в Windows, и то, что они инструментируют.

  • syscall — вызовы системы NTOS

  • fbt (трассировка границ функции) — запись и возврат функции ядра

  • pid (идентификатор процесса) — трассировка процесса в режиме пользователя. Как и FBT в режиме ядра, но также позволяет инструментировать произвольные смещения функций.

  • etw (трассировка событий для Windows) — позволяет определять пробы для ETW Этот поставщик помогает использовать существующее инструментирование операционной системы в DTrace.

SYSCALL

SYSCALL предоставляет пару проб для каждого системного вызова: проба входа, которая запускается до ввода системного вызова, и возвращаемую пробу, которая запускается после завершения системного вызова, но до передачи элемента управления обратно на уровень пользователя. Для всех проб SYSCALL имя функции должно быть именем инструментированного системного вызова, а имя модуля — модулем, в котором существует функция. Имена системных вызовов, предоставляемых поставщиком SYSCALL, можно найти, введя команду dtrace.exe -l -P syscall из командной строки. Обратите внимание, что имя пробы является нижним регистром syscall. dtrace -ln syscall::: Команда также выводит список всех проб и их параметров, доступных поставщику syscall.

C:\> dtrace -ln syscall:::
  ID   PROVIDER            MODULE                          FUNCTION NAME
    6    syscall                                 NtWaitHighEventPair entry
    7    syscall                                 NtWaitHighEventPair return
    8    syscall                       NtRegisterThreadTerminatePort entry
    9    syscall                       NtRegisterThreadTerminatePort return
...

Обратите внимание, что в этих примерах отображаются не все выходные данные экрана. "..." используется для представления усеченных выходных данных.

Чтобы прокрутить выходные данные, выполните передачу в следующую команду:

dtrace -ln syscall:::|more

Добавьте параметр v, чтобы отобразить дополнительные сведения о доступных пробах syscall.

C:\> dtrace -lvn syscall:::
...

  942    syscall                                    NtSaveMergedKeys entry

        Probe Description Attributes
                Identifier Names: Private
                Data Semantics:   Private
                Dependency Class: ISA

        Argument Attributes
                Identifier Names: Private
                Data Semantics:   Private
                Dependency Class: ISA

        Argument Types
                args[0]: HANDLE
                args[1]: HANDLE
                args[2]: HANDLE
...

Трассировка событий Windows

DTrace включает поддержку существующих проб трассировки манифеста или трассировки трассировки событий трассировки событий. Вы можете инструментировать, фильтровать и анализировать события ETW синхронно во время выполнения события. Кроме того, DTrace можно использовать для объединения различных событий и системных состояний для предоставления консолидированного потока вывода для отладки сложных ситуаций ошибок.

dtrace -ln etw::: Команда будет перечислять все пробы и их параметры, доступные поставщиком syscall.

  C:\> dtrace -ln etw:::
  ID   PROVIDER            MODULE                          FUNCTION NAME
  944        etw 048dc470-37c1-52a8-565a-54cb27be37ec           0xff_0xffffffffffffffff generic_event
  945        etw aab97afe-deaf-5882-1e3b-d7210f059dc1           0xff_0xffffffffffffffff generic_event
  946        etw b0f40491-9ea6-5fd5-ccb1-0ec63be8b674           0xff_0xffffffffffffffff generic_event
  947        etw 4ee869fa-9954-4b90-9a62-308c74f99d32           0xff_0xffffffffffffffff generic_event
  ...

Дополнительные сведения см. в разделе DTrace ETW.

Трассировка границ функции (FBT)

Поставщик трассировки границ функции (FBT) предоставляет пробы, связанные с записью и возвратом из большинства функций в ядре Windows. Функция является основной единицей текста программы. Аналогично другим поставщикам DTrace, FBT не имеет эффекта пробы, если он не включен явным образом. При включении FBT вызывает только эффект пробы в пробных функциях. FBT реализован на платформах x86 и x64.

Для каждого набора инструкций существует небольшое количество функций, которые не вызывают другие функции и оптимизированы компилятором (так называемые конечные функции), которые не могут быть инструментированы FBT. Пробы для этих функций отсутствуют в DTrace.

Команда dtrace -ln fbt:nt:: выводит список всех проб и их параметров, доступных для модуля NT. Используйте команду отладчика lm (список загруженных модулей) для перечисления всех доступных модулей.

C:\>dtrace -ln "fbt:nt::"
   ID   PROVIDER            MODULE                          FUNCTION NAME
 3336        fbt                nt                PiDqActionDataFree entry
 3337        fbt                nt                PiDqActionDataFree return
 3338        fbt                nt PiDqActionDataGetRequestedProperties entry
 3339        fbt                nt PiDqActionDataGetRequestedProperties return
 3340        fbt                nt _CmGetMatchingFilteredDeviceInterfaceList entry
...

Примечание.

Так как в nt есть тысячи вызовов, рекомендуется оставить имя функции пустым при выполнении команды DTrace, которая регистрирует данные. Рекомендуемый подход, чтобы избежать возможного влияния на производительность, заключается в указании хотя бы части имени функции, например fbt:nt:*Timer*:entry.

ИД процесса

Поставщик DTrace PID позволяет отслеживать внутреннее выполнение процессов пользовательского режима, таких как веб-браузер или база данных. Вы также можете подключить DTrace во время запуска процесса, чтобы выполнить отладку проблем при запуске процесса. В рамках определения PID вы указываете функции, определенные в процессе и определенные смещения (или все смещения с помощью дикого карта *) в функции. Поставщик PID требует запуска или запуска двоичного файла во время выполнения скрипта.

В этом примере команды отображаются сведения о конкретном вызове в piD, связанном с notepad.exe. Используйте команду отладчика lm (список загруженных модулей) для перечисления всех доступных модулей.

C:\Windows\system32>dtrace -ln "pid$target:ntdll:RtlAllocateHeap:entry" -c notepad.exe
   ID   PROVIDER            MODULE                          FUNCTION NAME
 5102    pid6100             ntdll                   RtlAllocateHeap entry

Примечание.

При написании функций трассировки на C++имена функций могут быть слишком длинными или украшенными, чтобы быть указаны в качестве пробы с полной формой. Обычное решение — использовать выражение, уникально соответствующее целевой функции. Например, используйте "String?? Скопируйте" в качестве части имени пробы в качестве части имени пробы, соответствующей String::Copy(), или "*GetPinnableReference", чтобы соответствовать "String::GetPinnableReference()".

Архитектура DTrace Windows

Пользователи взаимодействуют с DTrace с помощью команды DTrace, которая служит интерфейсом для подсистемы DTrace. Скрипты D компилируются в промежуточный формат (DIF) в пространстве пользователя и отправляются в компонент ядра DTrace для выполнения, иногда называются виртуальной машиной DIF. Это выполняется в драйвере dtrace.sys.

Traceext.sys (расширение трассировки) — это драйвер расширения ядра Windows, который позволяет Windows предоставлять функции, которые DTrace использует для предоставления трассировки. Ядро Windows предоставляет выноски во время стека или доступа к памяти, которые затем реализуются расширением трассировки.

Схема, на которой показана архитектура DTrace Windows с dtrace.exe подключена к libtrace, которая взаимодействует с DTrace.sys и вызывает Traceext.sys.

Установка DTrace в Windows

  1. Убедитесь, что вы используете поддерживаемую версию Windows. Текущая загрузка DTrace поддерживается в сборках программы предварительной оценки 20H1 Windows после версии 18980 и Windows Server Build 18975. Установка этой версии DTrace в более ранних версиях Windows может привести к нестабильности системы и не рекомендуется. (Архивная версия DTrace для 19H1 больше недоступна и больше не поддерживается.)

  2. Скачайте файл установки MSI (скачать DTrace в Windows) из Центра загрузки Майкрософт.

  3. Нажмите кнопку "Завершить установку".

    Внимание

    Перед использованием bcdedit для изменения сведений о загрузке может потребоваться временно приостановить функции безопасности Windows, такие как Patchguard, BitLocker и безопасная загрузка на тестовом компьютере. Повторно включите эти функции безопасности при завершении тестирования и соответствующим образом управлять тестируемым компьютером при отключении функций безопасности.

  4. Обновите переменную среды PATH, чтобы включить C:\Program Files\DTrace

set PATH=%PATH%;"C:\Program Files\DTrace"
  1. Включите DTrace на компьютере с помощью команды bcdedit.
bcdedit /set dtrace ON

При обновлении до новой сборки программы предварительной оценки Windows необходимо снова задать параметр dtrace bcdedit.

Примечание.

Если вы используете BitLocker, отключите его при внесении изменений в значения загрузки. Если это не делается, вам может потребоваться ключ восстановления BitLocker. Одним из способов восстановления из этой ситуации является загрузка в консоль восстановления и восстановление значения bcdedit. bcdedit /set {default} dtrace on Если обновление ОС удалило значение, и вы добавили его, чтобы восстановить ОС, используйте bcdedit для удаления значения. bcdedit /deletevalue {default} dtrace Затем отключите BitLocker и снова включите отброс, bcdedit /set dtrace ON.

Настройте VSM (виртуальный безопасный режим) на компьютере для включения трассировки границ функции ядра (FBT), установив для параметра "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\EnableVirtualizationBasedSecurity" значение 1, чтобы включить VSM и безопасное ядро.

Для этого используйте команду REG Add, как показано ниже.

REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\ /v EnableVirtualizationBasedSecurity /t REG_DWORD /d 1

Некоторые команды DTrace используют символы Windows. Чтобы использовать символы Windows, создайте каталог символов и задайте путь к символам:

mkdir c:\symbols
set _NT_SYMBOL_PATH=srv*C:\symbols*https://msdl.microsoft.com/download/symbols

Дополнительные сведения о путях символов см. в разделе "Путь к символам" для отладчиков Windows.

Использование DTrace внутри виртуальной машины

Если на виртуальной машине запущен DTrace, включите вложенную виртуализацию на компьютере, поддерживающем виртуальную машину, при остановке виртуальной машины с помощью следующей команды PowerShell. Укажите виртуальную <VMName> машину, в которую выполняется DTrace. Откройте PowerShell Windows в качестве Администратор istrator.

Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true

Перезагрузите компьютер, поддерживающий виртуальную машину.

Проверка установки DTrace

Используйте параметр -l для перечисления активных проб. Если DTrace активен во многих пробах, следует укажите для событий etw и системных событий.

Откройте командную строку Windows от имени администратора, чтобы ввести команды DTrace.

C:\> dtrace -l

...

  179    syscall                                 NtLockVirtualMemory return
  180    syscall                               NtDeviceIoControlFile entry
  181    syscall                               NtDeviceIoControlFile return
  182    syscall                                 NtCreateUserProcess entry
  183    syscall                                 NtCreateUserProcess return
  184    syscall                                      NtQuerySection entry
  185    syscall                                      NtQuerySection return

...

 3161        etw 222962ab-6180-4b88-a825-346b75f2a24a           0xff_0xffffffffffffffff generic_event
 3162        etw 3ac66736-cc59-4cff-8115-8df50e39816b           0xff_0xffffffffffffffff generic_event
 3163        etw 42695762-ea50-497a-9068-5cbbb35e0b95           0xff_0xffffffffffffffff generic_event
 3164        etw 3beef58a-6e0f-445d-b2a4-37ab737bd47e           0xff_0xffffffffffffffff generic_event

...

Если указаны только эти три пробы, возникает проблема с загрузкой драйвера DTrace.sys.

C:\>  dtrace -l
   ID   PROVIDER            MODULE                          FUNCTION NAME
    1     dtrace                                                     BEGIN
    2     dtrace                                                     END
    3     dtrace                                                     ERROR

Начало работы с DTrace — команды одной строки

Начните работу, выполнив эти команды из командной строки администратора.

Эта команда отображает сводку syscall по программе в течение 5 секунд. Параметр tick-5sec задает период времени. Выход(0); Вызывает выход команды после завершения обратно в командную строку. Выходные данные указываются с помощью [pid,execname] = count(); этого идентификатора процесса (PID), имени исполняемого файла и счетчика за последние 5 секунд.

C:\> dtrace -Fn "tick-5sec {exit(0);} syscall:::entry{ @num[pid,execname] = count();} "  
dtrace: description 'tick-5sec ' matched 471 probes
CPU FUNCTION
  0 | :tick-5sec

     1792  svchost.exe                                                       4
     4684  explorer.exe                                                      4
     4916  dllhost.exe                                                       4
     6192  svchost.exe                                                       4
     6644  SecurityHealth                                                    4
       92  TrustedInstall                                                    5
      504  csrss.exe                                                         5
      696  svchost.exe                                                       6
...

Эта команда суммирует вызовы таймера и отмены в течение 3 секунд:

C:\> dtrace -Fn "tick-3sec {exit(0);} syscall::Nt*Timer*:entry { @[probefunc, execname, pid] = count();}"
dtrace: description 'tick-3sec ' matched 14 probes
CPU FUNCTION
  0 | :tick-3sec

  NtCreateTimer                                       WmiPrvSE.exe                                            948                1
  NtCreateTimer                                       svchost.exe                                             564                1
  NtCreateTimer                                       svchost.exe                                            1276                1
  NtSetTimer2                                         svchost.exe                                            1076                1
  NtSetTimer2                                         svchost.exe                                            7080                1
  NtSetTimerEx                                        WmiPrvSE.exe                                            948                1
...  

Одна строка команд, использующих символы

Эта команда использует преимущества символов Windows и требует, чтобы путь к символам был задан, как описано в разделе установки. Как упоминание ранее при установке, создайте каталог и задайте путь к символам с помощью этих команд.

C:\> mkdir c:\symbols
C:\> set _NT_SYMBOL_PATH=srv*C:\symbols*https://msdl.microsoft.com/download/symbols

В этом примере команды отображаются основные функции NT.

C:\> dtrace -n "fbt:nt:*Timer*:entry { @k[probefunc] = count(); } tick-5s { trunc(@k, 10);printa(@k); exit(0); }"
dtrace: description 'fbt:nt:*Timer*:entry ' matched 340 probes
CPU     ID                    FUNCTION:NAME
  0  22362                         :tick-5s
  KeCancelTimer                                                   712
  KeSetTimer2                                                     714
  HalpTimerClearProblem                                           908
  ExpSetTimerObject                                               935
  NtSetTimerEx                                                    935
  KeSetTimer                                                     1139
  KeSetCoalescableTimer                                          3159
  KeResumeClockTimerFromIdle                                    11767
  xHalTimerOnlyClockInterruptPending                            22819
  xHalTimerQueryAndResetRtcErrors                               22819

Эта команда дамп структуры ядра SystemProcess.

C:\> dtrace -n "BEGIN {print(*(struct nt`_EPROCESS *) nt`PsInitialSystemProcess);exit(0);}"

...

   uint64_t ParentSecurityDomain = 0
    void *CoverageSamplerContext = 0
    void *MmHotPatchContext = 0
    union _PS_PROCESS_CONCURRENCY_COUNT ExpectedConcurrencyCount = {
         Fraction :20 = 0
         Count :12 = 0
        uint32_t AllFields = 0
    }
    struct _KAFFINITY_EX IdealProcessorSets = {
        uint16_t Count = 0x1
        uint16_t Size = 0x20
        uint32_t Reserved = 0
        uint64_t [32] Bitmap = [ 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
    }
}

Эта команда отображает верхний стек ядра за последние 10 секунд.

C:\> dtrace -qn "profile-997hz { @[stack()] = count(); } tick-10sec { trunc(@,5); printa(@); exit(0);}"

              nt`KiDispatchInterruptContinue
              nt`KiDpcInterrupt+0x318
              nt`KiSwapThread+0x1054
              nt`KiCommitThreadWait+0x153
              nt`KeRemoveQueueEx+0x263
              nt`IoRemoveIoCompletion+0x54
              nt`NtWaitForWorkViaWorkerFactory+0x284
              nt`KiSystemServiceCopyEnd+0x35
               14

              nt`KiDispatchInterruptContinue
              nt`KiDpcInterrupt+0x318
...

Эта команда отображает верхние модули, вызываемые notepad.exe во время запуска. Параметр -c выполняет указанную команду (notepad.exe) и завершает работу после его завершения.

C:\> dtrace -qn "pid$target:::entry { @k[probemod] = count();} tick-10s{printa(@k); exit(0);}" -c notepad.exe

  gdi32full                                                         5
  msvcp_win                                                         6
  combase                                                           7
  notepad                                                           9
  ADVAPI32                                                         10
  GDI32                                                            11
  SHELL32                                                          11
  USER32                                                           21
  win32u                                                          345
  KERNELBASE                                                     3727
  msvcrt                                                         7749
  KERNEL32                                                       9883
  RPCRT4                                                        11710
  ntdll                                                        383445

См. также

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

DTrace ETW

DTrace Live Dump

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