Partilhar via


DTrace no Windows

DTrace (DTrace.exe) é uma ferramenta de linha de comando que exibe informações e eventos do sistema. O DTrace é uma plataforma de rastreamento de código aberto portada para Windows. O DTrace foi originalmente desenvolvido para o sistema operacional Solaris. Ele fornece instrumentação dinâmica de ambas as funções do usuário / kernel, a capacidade de script usando a linguagem D e rastreamento especulativo. Além disso, DTrace tem extensões específicas do sistema operativo Windows, como instrumentação ETW, geração de eventos ETW, sondas de chamadas ao sistema e recursos de captura de despejo em tempo real.

Observação

O DTrace é suportado nas builds do programa Insider do Windows após a versão 18980 e na build do Windows Server 18975.

O site do DTrace no Windows GitHub está localizado aqui:

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

Abrir informações do DTrace

Para obter informações detalhadas sobre o DTrace, consulte a Especificação OpenDTrace versão 1.0 na Universidade de Cambridge.

O site principal do GitHub está localizado em https://github.com/opendtrace/.

Um conjunto de scripts úteis está disponível em https://github.com/opendtrace/toolkit.

Vários livros do DTrace estão disponíveis, tais como:

DTrace: Dynamic Tracing em Oracle Solaris, Mac OS X e FreeBSD por Brendan Gregg e Jim Mauro

Desempenho e ferramentas do Solaris: técnicas DTrace e MDB para Solaris 10 e OpenSolaris por Richard McDougall, Jim Mauro e Brendan Gregg

Fornecendo comentários sobre o Windows DTrace

Use o Hub de Comentários para solicitar novos recursos ou relatar quaisquer problemas ou bugs com o Windows DTrace.

  1. Para iniciar o Hub de Comentários no Windows, Vá para pesquisar, insira a palavra feedback e selecione Hub de Feedback.
  2. Selecione Sugerir um recurso ou Relatar um problema.
  3. Forneça uma descrição detalhada e específica do problema ou sugestão.

Extensões do DTrace para Windows

A seguir, estão alguns dos fornecedores de DTrace disponíveis no Windows e o que eles instrumentam.

  • syscall – Chamadas do sistema NTOS.

  • fbt (Function Boundary Tracing) – Entrada e retorno de funções do kernel.

  • pid (Process ID) – Rastreamento de processo no modo de usuário. Como o FBT de modo kernel, mas também permite a instrumentação de deslocamentos de função arbitrários.

  • etw (Event Tracing for Windows) – Permite que sondas sejam definidas para ETW. Esse provedor ajuda a aproveitar a instrumentação do sistema operacional existente no DTrace.

SYSCALL – Chamadas do sistema NTOS

SYSCALL fornece um par de testes para cada chamada do sistema: um teste de entrada que é acionado antes que a chamada do sistema seja inserida e um teste de retorno que é acionado após a conclusão da chamada do sistema, mas antes que o controle seja transferido de volta para o nível do usuário. Para todas as sondas SYSCALL, o nome da função é definido como o nome da chamada do sistema instrumentado e o nome do módulo é o módulo no qual a função existe. Os nomes das chamadas do sistema, conforme fornecido pelo provedor SYSCALL, podem ser encontrados digitando o comando dtrace.exe -l -P syscall no prompt de comando. Observe que o nome da sonda é syscall minúsculo. O comando dtrace -ln syscall::: também listará todas as sondas e seus parâmetros disponíveis no provedor 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
...

Observe que nem toda a saída de tela é mostrada nesses exemplos. "..." é usado para representar a saída truncada.

Para percorrer a saída, utilize o comando more desta forma:

dtrace -ln syscall:::|more

Adicione a opção v para exibir mais informações sobre as sondas syscall disponíveis.

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

O DTrace inclui suporte para sondas ETW manifestadas/tracelogadas existentes. Você pode instrumentar, filtrar e analisar de forma síncrona os eventos ETW no momento em que eles são disparados. Além disso, o DTrace pode ser usado para combinar vários eventos/estados do sistema para fornecer um fluxo de saída consolidado para ajudar a depurar situações de erro complexas.

O comando dtrace -ln etw::: listará todas as sondas e seus parâmetros disponíveis no provedor 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 obter mais informações, consulte DTrace ETW.

Rastreamento de limite de função (FBT)

O fornecedor de Function Boundary Tracing (FBT) fornece sondas associadas à entrada e à saída da maioria das funções no kernel do Windows. A função é a unidade fundamental do texto do programa. Semelhante a outros provedores do DTrace, o FBT não tem efeito de teste quando não está explicitamente habilitado. Quando ativado, o FBT apenas induz um efeito de sonda em funções sondadas. FBT foi implementado em plataformas x86 e x64.

Para cada conjunto de instruções, há um pequeno número de funções que não chamam outras funções e são altamente otimizadas pelo compilador (as chamadas funções folha) que não podem ser instrumentadas pelo FBT. Sondas para essas funções não estão presentes no DTrace.

O comando dtrace -ln fbt:nt:: listará todas as sondas e seus parâmetros disponíveis para o módulo nt. Use o comando depurador lm (List Loaded Modules) para listar todos os módulos disponíveis.

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

Observação

Como há milhares de chamadas disponíveis em nt, não seria uma boa ideia deixar o nome da função vazio ao executar um comando do DTrace que registra dados. A abordagem recomendada para evitar um possível impacto no desempenho é especificar pelo menos parte do nome da função, como fbt:nt:*Timer*:entry.

PID

O provedor PID do DTrace permite rastrear a execução interna de processos de modo de usuário, como um navegador da Web ou um banco de dados. Você também pode anexar o DTrace no momento da inicialização do processo para depurar problemas de inicialização do processo. Como parte da definição PID, você especifica as funções definidas no processo e deslocamentos específicos (ou todos os deslocamentos usando curinga *) dentro da função. O provedor PID requer que o binário seja iniciado ou executado no momento da execução do script.

Este comando de exemplo exibe informações sobre uma chamada específica no PID associado ao notepad.exe. Use o comando depurador lm (List Loaded Modules) para listar todos os módulos disponíveis.

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

Observação

Ao rastrear funções escritas em C++, os nomes das funções podem ser muito longos ou decorados para serem especificados como uma sonda com sua forma completa. Uma solução comum é usar uma expressão que corresponda exclusivamente à sua função de destino. Por exemplo, use 'String??Copy' como uma parte 'probefunc' do nome da sonda para corresponder a 'String::Copy()', ou '*GetPinnableReference' para corresponder a 'String::GetPinnableReference()'.

Arquitetura do Windows do DTrace

Os usuários interagem com o DTrace através do comando DTrace, que serve como um front-end para o mecanismo DTrace. Os scripts D são compilados para um formato intermediário (DIF) no espaço do usuário e enviados para o componente do kernel do DTrace para execução, às vezes chamado de DIF Virtual Machine. Isso é executado no driver dtrace.sys.

Traceext.sys (extensão de rastreamento) é um driver de extensão do kernel do Windows, que permite ao Windows expor a funcionalidade na qual o DTrace se baseia para fornecer rastreamento. O kernel do Windows fornece chamadas durante o stackwalk ou acessos de memória que são então implementadas pela extensão de rastreamento.

Diagrama que mostra a arquitetura do Windows do DTrace com dtrace.exe conectado ao libtrace, que se comunica com DTrace.syse chama Traceext.sys.

Instalação do DTrace no Windows

  1. Verifique se você está executando uma versão suportada do Windows. O download atual do DTrace é suportado nas compilações Insider do Windows 20H1 após a versão 18980 e no Windows Server Build 18975. A instalação desta versão do DTrace em versões mais antigas do Windows pode levar à instabilidade do sistema e não é recomendada. (A versão arquivada do DTrace para 19H1 não está mais disponível e não é mais suportada.)

  2. Transfira o ficheiro de instalação MSI (Transferir o DTrace no Windows) a partir do Centro de Transferências da Microsoft.

  3. Selecione a instalação completa.

    Importante

    Antes de usar o bcdedit para alterar as informações de inicialização, talvez seja necessário suspender temporariamente os recursos de segurança do Windows, como Patchguard, BitLocker e Inicialização Segura no computador de teste. Reative esses recursos de segurança quando o teste estiver concluído e gerencie adequadamente o computador de teste, quando os recursos de segurança estiverem desativados.

  4. Atualize a variável de ambiente PATH para incluir C:\Program Files\DTrace

set PATH=%PATH%;"C:\Program Files\DTrace"
  1. Habilite o DTrace na máquina usando o comando bcdedit.
bcdedit /set dtrace ON

Ao atualizar para uma nova compilação do Windows Insider, você precisará definir a opção dtrace bcdedit novamente.

Observação

Se você estiver usando o BitLocker, desative-o ao fazer alterações nos valores de inicialização. Se não o fizer, poderá ser-lhe solicitada a chave de recuperação BitLocker. Uma maneira de se recuperar dessa situação é inicializar no console de recuperação e restaurar o valor bcdedit, bcdedit /set {default} dtrace on. Se uma atualização do sistema operacional removeu o valor e você o adicionou, para recuperar o sistema operacional, use bcdedit para remover o valor, bcdedit /deletevalue {default} dtrace. Em seguida, desative o BitLocker e reative o dtrace, bcdedit /set dtrace ON.

Configure o VSM (Virtual Secure Mode) na máquina para habilitar o rastreamento de limite de função do kernel (FBT) definindo "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\EnableVirtualizationBasedSecurity" como 1 para habilitar o VSM e o Secure Kernel.

Para fazer isso, use o comando REG Add, da seguinte forma:

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

Alguns comandos do DTrace usam símbolos do Windows. Para usar símbolos do Windows, crie um diretório de símbolos e defina o caminho dos símbolos:

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

Para obter mais informações sobre caminhos de símbolos, consulte Caminho de símbolos para depuradores do Windows.

Usando o DTrace dentro de uma máquina virtual

Se estiver executando o DTrace em uma VM, ative a Virtualização aninhada na máquina que suporta a VM, quando a VM for interrompida, usando o seguinte comando do PowerShell. Forneça o <VMName> para a VM onde está a executar o DTrace. Abra uma janela do PowerShell como administrador.

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

Reinicialize o PC que suporta a VM.

Validando a instalação do DTrace

Use a opção -l para listar as sondas ativas. Se o DTrace estiver ativo, muitas sondas devem ser listadas para eventos etw e system.

Abra um prompt de comando do Windows como administrador para inserir comandos do 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

...

Se apenas essas três sondas estiverem listadas, há um problema no carregamento do driver DTrace.sys.

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

Introdução ao DTrace - Comandos de uma linha

Comece executando esses comandos a partir de um prompt de comando do administrador.

Este comando exibe, durante 5 segundos, um resumo das syscalls por programa. O parâmetro tick-5sec especifica o período de tempo. A função exit(0); termina o comando, retornando ao prompt de comando após a conclusão. A saída é especificada usando [pid,execname] = count(); Isso exibe a ID do processo (PID), o nome do executável e uma contagem para os ú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 as chamadas de definir/cancelar do temporizador por 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 uma linha que usam símbolos

Esses comandos aproveitam os símbolos do Windows e exigem que o caminho do símbolo seja definido conforme discutido na seção de instalação. Como mencionado anteriormente na instalação, crie um diretório e defina o caminho do símbolo usando esses comandos.

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

Este comando de exemplo exibe as principais funções do 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 despeja a estrutura do 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 exibe a pilha principal do kernel nos ú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 exibe os principais módulos invocados por notepad.exe durante a inicialização. A opção -c executa o comando especificado (notepad.exe) e sai após a sua conclusão.

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

Ver também