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 portada 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 seguimiento especulativo del lenguaje D. 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

Solaris Performance and Tools: DTrace and MDB Techniques for Solaris 10 and OpenSolaris de Richard McDougall, Jim Mauro y Brendan Gregg

Proporcionar comentarios sobre Windows DTrace

Usa el centro de comentarios para solicitar nuevas características o notificar cualquier problema o error con Windows DTrace.

  1. Inicie el Centro de comentarios. Vaya a la búsqueda, escriba la palabra comentarios y, a continuación, seleccione Centro de comentarios.
  2. Seleccione Sugerir una característica o Informar de un problema.
  3. 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 disponibles en Windows y lo que instrumentan.

  • syscall: llamadas del sistema NTOS

  • fbt (Seguimiento de límites de función): entrada y devoluciones de la función kernel

  • 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

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.

Diagrama que muestra la arquitectura DTrace Windows con dtrace.exe conectado a libtrace, que se comunica con DTrace.sys y llama a Traceext.sys.

Instalación de DTrace en Windows

  1. 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).

  2. Descargue el archivo de instalación MSI (Descarga de DTrace en Windows) desde el Centro de descargas de Microsoft.

  3. 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.

  4. Actualice la variable de entorno PATH para incluir C:\Archivos de programa \DTrace

set PATH=%PATH%;"C:\Program Files\DTrace"
  1. 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(); Muestra el identificador de proceso (PID), el nombre 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

Consulte también

Programación de Windows DTrace

ETW DTrace

Volcado en directo de DTrace

Ejemplos de código de Windows de DTrace