DTrace en Windows
DTrace (DTrace.exe) es una herramienta de línea de comandos que muestra información y eventos del sistema. DTrace es una plataforma de seguimiento de código abierto trasladada a Windows. DTrace se desarrolló originalmente para el sistema operativo Solaris. Proporciona instrumentación dinámica de ambas funciones de usuario o kernel, la capacidad de crear scripts mediante el lenguaje D y el seguimiento especulativo. Además, DTrace tiene extensiones específicas del sistema operativo Windows, como instrumentación ETW, generación de eventos ETW, sondeos de llamadas del sistema y funcionalidades de captura de volcado en vivo.
Nota:
DTrace se admite en las compilaciones de Insider de Windows después de la versión 18980 y Windows Server Build 18975.
El sitio de DTrace en GitHub de Windows se encuentra aquí:
https://github.com/microsoft/DTrace-on-Windows
Abrir información de DTrace
Para obtener información detallada sobre DTrace, consulte la especificación OpenDTrace versión 1.0 de la Universidad de Cambridge.
El sitio principal de GitHub se encuentra en https://github.com/opendtrace/.
Hay disponible un conjunto de scripts útiles en https://github.com/opendtrace/toolkit.
Hay una serie de libros sobre DTrace disponibles, como:
DTrace: Dynamic Tracing in Oracle Solaris, Mac OS X and FreeBSD de Brendan Gregg y Jim Mauro
Rendimiento y herramientas de Solaris: Técnicas DTrace y MDB para Solaris 10 y OpenSolaris por Richard McDougall, Jim Mauro y Brendan Gregg
Proporcionar comentarios sobre Windows DTrace
Usa el Centro de opiniones para solicitar nuevas características o notificar problemas o errores con Windows DTrace.
- Para iniciar el Centro de opiniones en Windows, vaya a la búsqueda, escriba la palabra comentarios y, a continuación, seleccione Centro de opiniones.
- Seleccione Sugerir una característica o Informar de un problema.
- Proporcione una descripción detallada y específica del problema o la sugerencia.
Extensiones de Windows DTrace
A continuación se muestran algunos de los proveedores de Dtrace disponibles en Windows y lo que instrumentan.
syscall: llamadas del sistema NTOS.
fbt (Seguimiento de límites de función): entrada de función kernel y devuelve.
pid (Identificador de proceso): seguimiento de procesos en modo de usuario. Al igual que FBT en modo kernel, pero también permite la instrumentación de desplazamientos arbitrarios de función.
etw (Seguimiento de eventos para Windows): permite definir sondeos para ETW. Este proveedor ayuda a aprovechar la instrumentación del sistema operativo existente en DTrace.
SYSCALL: llamadas del sistema NTOS
SYSCALL proporciona un par de sondeos para cada llamada del sistema: un sondeo de entrada que se activa antes de que se escriba la llamada del sistema y un sondeo de retorno que se activa después de que se haya completado la llamada del sistema, pero antes de que el control se haya transferido de nuevo al nivel de usuario. Para todos los sondeos SYSCALL, el nombre de la función se establece como el nombre de la llamada del sistema instrumentado y el nombre del módulo es el módulo en el que existe la función. Los nombres de las llamadas del sistema proporcionadas por el proveedor SYSCALL se pueden encontrar escribiendo el comando dtrace.exe -l -P syscall
desde el símbolo del sistema. Tenga en cuenta que el nombre del sondeo es syscall en minúsculas. El comando dtrace -ln syscall:::
también enumerará todos los sondeos y sus parámetros disponibles en el proveedor 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
...
Tenga en cuenta que no todos los resultados de pantalla se muestran en estos ejemplos. "..." se usa para representar la salida truncada.
Para desplazarse por la salida, canalice al comando más similar al siguiente:
dtrace -ln syscall:::|more
Agregue la opción v para mostrar más información sobre los sondeos de syscall disponibles.
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
...
ETW
DTrace incluye compatibilidad con sondeos ETW manifested/tracelogged existentes. Puede instrumentar, filtrar y analizar eventos ETW de forma sincrónica en el momento de la activación del evento. Además, DTrace se puede usar para combinar varios eventos o estados del sistema para proporcionar un flujo de salida consolidado para ayudar a depurar situaciones de error complejas.
El comando dtrace -ln etw:::
enumerará todos los sondeos y sus parámetros disponibles en el proveedor 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
...
Para obtener más información, consulte ETW DTrace.
Seguimiento de límites de función (FBT)
El proveedor de Seguimiento de límites de función (FBT) proporciona sondeos asociados a la entrada y devolución de la mayoría de las funciones del kernel de Windows. La función es la unidad fundamental del texto del programa. De forma similar a otros proveedores DTrace, FBT no tiene ningún efecto de sondeo cuando no está habilitado explícitamente. Cuando se habilita, FBT solo induce un efecto de sondeo en las funciones sondeadas. FBT se ha implementado en plataformas x86 y x64.
Para cada conjunto de instrucciones, hay un pequeño número de funciones que no llaman a otras funciones y están muy optimizadas por el compilador (llamadas funciones hoja) que FBT no puede instrumentar. Los sondeos de estas funciones no están presentes en DTrace.
El comando dtrace -ln fbt:nt::
enumerará todos los sondeos y sus parámetros disponibles para el módulo nt. Use el comando lm (lista de módulos cargados) del depurador para enumerar todos los módulos disponibles.
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
...
Nota:
Como hay miles de llamadas disponibles en nt, no sería una buena idea dejar vacío el nombre de la función al ejecutar un comando DTrace que registra los datos. El enfoque recomendado para evitar un posible impacto en el rendimiento es especificar al menos parte del nombre de la función, como fbt:nt:*Timer*:entry
.
PID
El proveedor de PID de DTrace permite realizar un seguimiento de la ejecución interna de procesos en modo de usuario, como un explorador web o una base de datos. También puede adjuntar DTrace en el momento del inicio del proceso para depurar problemas de inicio del proceso. Como parte de la definición de PID, puede especificar las funciones definidas en el proceso y desplazamientos específicos (o todos los desplazamientos mediante un comodín *) dentro de la función. El proveedor de PID requiere que el archivo binario se inicie o ejecute en el momento de la ejecución del script.
Este comando de ejemplo muestra información sobre una llamada específica en el PID asociado a notepad.exe. Use el comando lm (lista de módulos cargados) del depurador para enumerar todos los módulos disponibles.
C:\Windows\system32>dtrace -ln "pid$target:ntdll:RtlAllocateHeap:entry" -c notepad.exe
ID PROVIDER MODULE FUNCTION NAME
5102 pid6100 ntdll RtlAllocateHeap entry
Nota:
Al realizar el seguimiento de funciones escritas en C++, los nombres de función pueden ser demasiado largos o estar decorados para especificarse como sondeo con su formato completo. Una solución común consiste en usar una expresión que coincida de forma única con la función de destino. Por ejemplo, use 'String??Copy' como parte de 'probefunc' del nombre de un sondeo para que coincida con 'String::Copy()' o '*GetPinnableReference' para que coincida con 'String::GetPinnableReference()'.
Arquitectura de Windows de DTrace
Los usuarios interactúan con DTrace a través del comando DTrace, que actúa como front-end para el motor DTrace. Los scripts D se compilan en un formato intermedio (DIF) en el espacio de usuario y se envían al componente del kernel DTrace para su ejecución, a veces llamado máquina virtual DIF. Esto se ejecuta en el controlador dtrace.sys.
Traceext.sys (extensión de seguimiento) es un controlador de extensión de kernel de Windows que permite a Windows exponer la funcionalidad en la que DTrace se basa para proporcionar seguimiento. El kernel de Windows proporciona llamadas durante el acceso a stackwalk o memoria que la extensión de seguimiento implementa a continuación.
Instalación de DTrace en Windows
Compruebe que está ejecutando una versión compatible de Windows 10. La descarga actual de DTrace es compatible con las compilaciones de Insider de Windows 20H1 después de la versión 18980 y Windows Server Build 18975. La instalación de esta versión de DTrace en versiones anteriores de Windows puede provocar inestabilidad del sistema y no se recomienda. (La versión archivada de DTrace para 19H1 ya no está disponible y ya no se admite).
Descargue el archivo de instalación MSI (Descarga de DTrace en Windows) desde el Centro de descargas de Microsoft.
Seleccione la instalación completa.
Importante
Antes de usar bcdedit para cambiar la información de arranque, es posible que deba suspender temporalmente las características de seguridad de Windows, como Patchguard, BitLocker y Arranque seguro, en el equipo de prueba. Vuelva a habilitar estas características de seguridad cuando finalicen las pruebas y administre correctamente el equipo de prueba cuando se deshabiliten las características de seguridad.
Actualice la variable de entorno PATH para incluir C:\Archivos de programa \DTrace
set PATH=%PATH%;"C:\Program Files\DTrace"
- Habilite DTrace en la máquina mediante el comando bcdedit.
bcdedit /set dtrace ON
Al actualizar a una nueva compilación de Windows Insider, deberá volver a establecer la opción dtrace bcdedit.
Nota:
Si usa BitLocker, deshabilítela al realizar cambios en los valores de arranque. Si no lo hace, es posible que se le pida la clave de recuperación de BitLocker. Una manera de recuperarse de esta situación es arrancar en la consola de recuperación y restaurar el valor bcdedit, bcdedit /set {default} dtrace on
. Si una actualización del sistema operativo ha quitado el valor y lo ha agregado, para recuperar el sistema operativo, use bcdedit para quitar el valor, bcdedit /deletevalue {default} dtrace
. A continuación, deshabilite BitLocker y vuelva a habilitar dtrace, bcdedit /set dtrace ON
.
Configure VSM (modo seguro virtual) en la máquina para habilitar el seguimiento de límites de función de kernel (FBT) estableciendo "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\EnableVirtualizationBasedSecurity" en 1 para habilitar VSM y el kernel seguro.
Para ello, use el comando REG Add, de la siguiente manera:
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\ /v EnableVirtualizationBasedSecurity /t REG_DWORD /d 1
Algunos comandos DTrace usan símbolos de Windows. Para usar símbolos de Windows, cree un directorio de símbolos y establezca la ruta de acceso a los símbolos:
mkdir c:\symbols
set _NT_SYMBOL_PATH=srv*C:\symbols*https://msdl.microsoft.com/download/symbols
Para obtener más información sobre las rutas de acceso a los símbolos, consulte Ruta de acceso a los símbolos para depuradores de Windows.
Uso de DTrace dentro de una máquina virtual
Si ejecuta DTrace en una máquina virtual, active la virtualización anidada en la máquina que admite la máquina virtual, cuando se detenga la máquina virtual, con el siguiente comando de PowerShell. Proporcione el <VMName>
para la máquina virtual en la que se ejecuta DTrace. Abra una ventana de Windows PowerShell como administrador.
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
Reinicie el equipo compatible con la máquina virtual.
Validación de la instalación de DTrace
Use la opción -l para enumerar los sondeos activos. Si DTrace está activo, se deben enumerar muchos sondeos para los eventos etw y del sistema.
Abra un símbolo del sistema de Windows como administrador y escriba los comandos 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
...
Si solo se muestran estos tres sondeos, hay un problema con el controlador DTrace.sys que se está cargando.
C:\> dtrace -l
ID PROVIDER MODULE FUNCTION NAME
1 dtrace BEGIN
2 dtrace END
3 dtrace ERROR
Introducción a DTrace - Comandos de una línea
Para empezar, ejecute estos comandos desde un símbolo del sistema de administrador.
Este comando muestra un resumen de syscall por programa durante 5 segundos. El parámetro tick-5sec especifica el período de tiempo. exit(0); hace que el comando vuelva a salir al finalizar el símbolo del sistema. La salida se especifica mediante [pid,execname] = count();
Este muestra el identificador de proceso (PID), el nombre del archivo ejecutable y un recuento de los últimos 5 segundos.
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
...
Este comando resume las llamadas del conjunto o cancelación del temporizador durante 3 segundos:
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
...
Comandos de línea que usan símbolos
Estos comandos aprovechan los símbolos de Windows y requieren que la ruta de acceso a los símbolos se establezca como se describe en la sección de instalación. Como se mencionó anteriormente en la instalación, cree un directorio y establezca la ruta de acceso a los símbolos mediante estos comandos.
C:\> mkdir c:\symbols
C:\> set _NT_SYMBOL_PATH=srv*C:\symbols*https://msdl.microsoft.com/download/symbols
Este comando de ejemplo muestra las principales funciones 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
Este comando vuelva la estructura del kernel 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 ]
}
}
Este comando muestra la pila de kernel superior durante los últimos 10 segundos.
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
...
Este comando muestra los módulos principales invocados por notepad.exe durante el inicio. La opción -c ejecuta el comando especificado (notepad.exe) y se cierra tras su finalización.
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