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.
- Запустите центр отзывов. Перейдите к поиску, введите слово отзывов и выберите Центр отзывов.
- Выберите функцию или сообщите о проблеме.
- Укажите подробное описание проблемы или предложения.
Расширения 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
Убедитесь, что вы используете поддерживаемую версию Windows. Текущая загрузка DTrace поддерживается в сборках программы предварительной оценки 20H1 Windows после версии 18980 и Windows Server Build 18975. Установка этой версии DTrace в более ранних версиях Windows может привести к нестабильности системы и не рекомендуется. (Архивная версия DTrace для 19H1 больше недоступна и больше не поддерживается.)
Скачайте файл установки MSI (скачать DTrace в Windows) из Центра загрузки Майкрософт.
Нажмите кнопку "Завершить установку".
Внимание
Перед использованием bcdedit для изменения сведений о загрузке может потребоваться временно приостановить функции безопасности Windows, такие как Patchguard, BitLocker и безопасная загрузка на тестовом компьютере. Повторно включите эти функции безопасности при завершении тестирования и соответствующим образом управлять тестируемым компьютером при отключении функций безопасности.
Обновите переменную среды PATH, чтобы включить C:\Program Files\DTrace
set PATH=%PATH%;"C:\Program Files\DTrace"
- Включите 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