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 Windows. 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 e 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.
- Per avviare l'hub di Feedback in Windows, passare alla ricerca, immettere il feedback della parola e quindi selezionare Hub di Feedback.
- Selezionare Suggerisci una funzionalità o Segnala un problema.
- Fornire una descrizione dettagliata e specifica del problema o del suggerimento.
Estensioni di Windows DTrace
Di seguito sono riportati alcuni dei provider Dtrace disponibili in Windows e ciò che instrumentano.
syscall: chiamate di sistema NTOS.
fbt (Traccia limite 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 : chiamate di sistema NTOS
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.
Installazione di DTrace in Windows
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.
Scaricare il file di installazione MSI (Download DTrace in Windows) dall'Area download Microsoft.
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.
Aggiornare la variabile di ambiente PATH per includere C:\Programmi\DTrace
set PATH=%PATH%;"C:\Program Files\DTrace"
- 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 un'istanza di Windows PowerShell come amministratore.
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 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