Condividi tramite


DTrace in Windows

DTrace (DTrace.exe) è uno strumento da riga di comando che visualizza informazioni ed eventi di sistema. DTrace è una piattaforma di traccia open source con conversione in finestre. DTrace è stato originariamente sviluppato per il sistema operativo Solaris. Fornisce la strumentazione dinamica di entrambe le funzioni utente/kernel, la possibilità di creare script usando il linguaggio D, la traccia speculativa. DTrace include inoltre estensioni specifiche del sistema operativo Windows, ad esempio strumentazione ETW, generazione di eventi ETW, probe di chiamata di sistema e funzionalità di acquisizione di dump live.

Nota

DTrace è supportato nelle build Insider di Windows dopo la versione 18980 e Windows Server Build 18975.

Il sito DTrace in Windows GitHub si trova qui:

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

Apri informazioni DTrace

Per informazioni dettagliate su DTrace, vedere la specifica OpenDTrace versione 1.0 all'Università di Cambridge.

Il sito GitHub primario si trova in https://github.com/opendtrace/.

Un set di script utili è disponibile in https://github.com/opendtrace/toolkit.

Sono disponibili diversi libri DTrace, ad esempio:

DTrace: Traccia dinamica in Oracle Solaris, Mac OS X e FreeBSD di Brendan Gregg e Jim Mauro

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

Commenti e suggerimenti su Windows DTrace

Usare l'hub di feedback per richiedere nuove funzionalità o per segnalare eventuali problemi o bug con Windows DTrace.

  1. Avviare l'hub di feedback. Passare alla ricerca, immettere il feedback della parola e quindi selezionare Hub di Feedback.
  2. Selezionare Suggerisci una funzionalità o Segnala un problema.
  3. Fornire una descrizione dettagliata e specifica del problema o del suggerimento.

Estensioni di Windows DTrace

Di seguito sono riportati alcuni dei provider disponibili in Windows e ciò che instrumentano.

  • syscall : chiamate di sistema NTOS

  • fbt (traccia dei limiti della funzione): voce della funzione kernel e restituisce

  • pid (ID processo): traccia del processo in modalità utente. Come fbt in modalità kernel, ma consente anche la strumentazione di offset arbitrari di funzioni.

  • etw (Event Tracing for Windows): consente di definire probe per ETW Questo provider consente di sfruttare la strumentazione del sistema operativo esistente in DTrace.

SYSCALL

SYSCALL fornisce una coppia di probe per ogni chiamata di sistema: un probe di ingresso che viene attivato prima dell'immissione della chiamata di sistema e un probe restituito che viene attivato dopo il completamento della chiamata di sistema, ma prima che il controllo venga trasferito di nuovo a livello di utente. Per tutti i probe SYSCALL, il nome della funzione è impostato come nome della chiamata di sistema instrumentata e il nome del modulo è il modulo in cui esiste la funzione. I nomi delle chiamate di sistema fornite dal provider SYSCALL possono essere trovati digitando il comando dtrace.exe -l -P syscall dal prompt dei comandi. Si noti che il nome del probe è la chiamata syscall minuscola. Il comando dtrace -ln syscall::: elenca anche tutti i probe e i relativi parametri disponibili dal provider 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
...

Si noti che non tutti gli output dello schermo vengono visualizzati in questi esempi. "..." viene utilizzato per rappresentare l'output troncato.

Per scorrere l'output, passare tramite pipe al comando più simile al seguente:

dtrace -ln syscall:::|more

Aggiungere l'opzione v per visualizzare altre informazioni sui probe di syscall disponibili.

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 include il supporto per i probe ETW manifested/tracelogged esistenti. È possibile instrumentare, filtrare e analizzare gli eventi ETW in modo sincrono al momento della generazione di eventi. DTrace può inoltre essere usato per combinare vari eventi/stati di sistema per fornire un flusso di output consolidato per facilitare il debug di situazioni di errore complesse.

Il comando dtrace -ln etw::: elenca tutti i probe e i relativi parametri disponibili dal provider 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
  ...

Per altre informazioni, vedere DTrace ETW.

Traccia dei limiti della funzione (FBT)

Il provider fbt (Function Boundary Tracing) fornisce probe associati alla voce e restituiscono dalla maggior parte delle funzioni nel kernel di Windows. La funzione è l'unità fondamentale del testo del programma. Analogamente ad altri provider DTrace, FBT non ha alcun effetto probe quando non è abilitato in modo esplicito. Se abilitata, FBT induce solo un effetto probe nelle funzioni probe. FBT è stato implementato su piattaforme x86 e x64.

Per ogni set di istruzioni, esistono un numero ridotto di funzioni che non chiamano altre funzioni e sono altamente ottimizzate dal compilatore (cosiddette funzioni foglia) che non possono essere instrumentate da FBT. I probe per queste funzioni non sono presenti in DTrace.

Il comando dtrace -ln fbt:nt:: elenca tutti i probe e i relativi parametri disponibili per il modulo nt. Usare il comando lm del debugger (Elenca moduli caricati) per elencare tutti i moduli disponibili.

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

Poiché sono disponibili migliaia di chiamate in nt, non sarebbe consigliabile lasciare vuoto il nome della funzione quando si esegue un comando DTrace che registra i dati. L'approccio consigliato per evitare un possibile impatto sulle prestazioni consiste nel specificare almeno parte del nome della funzione, ad esempio fbt:nt:*Timer*:entry.

PID

Il provider DTrace PID consente di tracciare l'esecuzione interna dei processi in modalità utente, ad esempio un Web browser o un database. È anche possibile collegare DTrace al momento dell'avvio del processo in modo da eseguire il debug dei problemi di avvio del processo. Come parte della definizione PID, è possibile specificare le funzioni definite nel processo e gli offset specifici (o tutti gli offset usando il carattere jolly *) all'interno della funzione. Il provider PID richiede l'avvio o l'esecuzione del file binario al momento dell'esecuzione dello script.

Questo comando di esempio visualizza informazioni su una chiamata specifica nel PID associato a notepad.exe. Usare il comando lm del debugger (Elenca moduli caricati) per elencare tutti i moduli disponibili.

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

Nota

Quando le funzioni di traccia scritte in C++, i nomi delle funzioni possono essere troppo lunghi o decorati per essere specificati come probe con il formato completo. Una soluzione comune consiste nell'usare un'espressione che corrisponde in modo univoco alla funzione di destinazione. Ad esempio, usare 'String?? Copia come parte 'probefunc' del nome del probe in modo che corrisponda a 'String::Copy()', o '*GetPinnableReference' in modo che corrisponda a 'String::GetPinnableReference()'.

Architettura di Windows DTrace

Gli utenti interagiscono con DTrace tramite il comando DTrace, che funge da front-end per il motore DTrace. Gli script D vengono compilati in un formato intermedio (DIF) nello spazio utente e inviati al componente kernel DTrace per l'esecuzione, talvolta chiamata macchina virtuale DIF. Viene eseguito nel driver dtrace.sys.

Traceext.sys (estensione di traccia) è un driver di estensione del kernel windows, che consente a Windows di esporre funzionalità su cui DTrace si basa per fornire la traccia. Il kernel di Windows fornisce callout durante lo stackwalk o gli accessi alla memoria che vengono quindi implementati dall'estensione di traccia.

Diagramma che mostra L'architettura di Windows DTrace con dtrace.exe connessa a libtrace, che comunica con DTrace.sys e chiama Traceext.sys.

Installazione di DTrace in Windows

  1. Verificare di eseguire una versione supportata di Windows. Il download corrente di DTrace è supportato nelle build Insider di Windows 20H1 dopo la versione 18980 e Windows Server Build 18975. L'installazione di questa versione di DTrace nelle versioni precedenti di Windows può causare instabilità del sistema e non è consigliata. La versione archiviata di DTrace per 19H1 non è più disponibile e non è più supportata.

  2. Scaricare il file di installazione MSI (Download DTrace in Windows) dall'Area download Microsoft.

  3. Selezionare l'installazione completa.

    Importante

    Prima di usare bcdedit per modificare le informazioni di avvio, potrebbe essere necessario sospendere temporaneamente le funzionalità di sicurezza di Windows, ad esempio Patchguard, BitLocker e Avvio protetto nel PC di test. Riabilitare queste funzionalità di sicurezza al termine del test e gestire in modo appropriato il PC di test, quando le funzionalità di sicurezza sono disabilitate.

  4. Aggiornare la variabile di ambiente PATH per includere C:\Programmi\DTrace

set PATH=%PATH%;"C:\Program Files\DTrace"
  1. Abilitare DTrace nel computer usando il comando bcdedit.
bcdedit /set dtrace ON

Quando si esegue l'aggiornamento a una nuova build di Windows Insider, sarà necessario impostare nuovamente l'opzione dtrace bcdedit.

Nota

Se si usa BitLocker, disabilitarlo quando si apportano modifiche ai valori di avvio. Se non si esegue questa operazione, è possibile che venga richiesta la chiave di ripristino di BitLocker. Un modo per eseguire il ripristino da questa situazione consiste nell'avviare la console di ripristino e ripristinare il valore bcdedit, bcdedit /set {default} dtrace on. Se un aggiornamento del sistema operativo ha rimosso il valore e lo è stato aggiunto in, per ripristinare il sistema operativo usare bcdedit per rimuovere il valore . bcdedit /deletevalue {default} dtrace Disabilitare quindi BitLocker e riabilitare dtrace, bcdedit /set dtrace ON.

Configurare VSM (modalità di protezione virtuale) nel computer per abilitare la traccia dei limiti della funzione kernel (FBT) impostando "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\EnableVirtualizationBasedSecurity" impostato su 1 per abilitare VSM e il kernel protetto.

A tale scopo, usare il comando REG Add, come illustrato di seguito:

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

Alcuni comandi DTrace usano i simboli di Windows. Per usare i simboli di Windows, creare una directory dei simboli e impostare il percorso dei simboli:

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

Per altre informazioni sui percorsi dei simboli, vedere Percorso dei simboli per i debugger di Windows.

Uso di DTrace all'interno di una macchina virtuale

Se si esegue DTrace in una macchina virtuale, attivare la virtualizzazione annidata nel computer che supporta la macchina virtuale, quando la macchina virtuale viene arrestata, usando il comando di PowerShell seguente. Specificare per <VMName> la macchina virtuale in cui si esegue DTrace. Aprire una finestra di PowerShell come Amministrazione istrator.

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

Riavviare il PC che supporta la macchina virtuale.

Convalida dell'installazione di DTrace

Usare l'opzione -l per elencare i probe attivi. Se DTrace è attivo, è necessario elencare molti probe per gli eventi di sistema ed etw.

Aprire un prompt dei comandi di Windows come amministratore per immettere i comandi 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 sono elencati solo questi tre probe, si verifica un problema con il driver DTrace.sys caricato.

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

Introduzione a DTrace - Comandi da riga

Per iniziare, eseguire questi comandi da un prompt dei comandi dell'amministratore.

Questo comando visualizza un riepilogo syscall per programma per 5 secondi. Il parametro tick-5sec specifica il periodo di tempo. Uscita (0); fa sì che il comando esce al prompt dei comandi al termine. L'output viene specificato usando [pid,execname] = count(); Questo visualizza l'ID processo (PID), il nome dell'eseguibile e un conteggio per gli ultimi 5 secondi.

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

Questo comando riepiloga le chiamate di set/annullamento del timer per 3 secondi:

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

Comandi di una riga che usano simboli

Questi comandi sfruttano i simboli di Windows e richiedono che il percorso del simbolo sia impostato come descritto nella sezione di installazione. Come accennato in precedenza nell'installazione, creare una directory e impostare il percorso del simbolo usando questi comandi.

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

Questo comando di esempio visualizza le principali funzioni 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

Questo comando esegue il dump della struttura 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 ]
    }
}

Questo comando visualizza lo stack principale del kernel per gli ultimi 10 secondi.

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

Questo comando visualizza i moduli principali richiamati da notepad.exe durante l'avvio. L'opzione -c esegue il comando specificato (notepad.exe) e viene chiuso al completamento.

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

Vedi anche

Programmazione DTrace di Windows

DTrace ETW

DTrace Live Dump

Esempi di codice di Windows DTrace