Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
DTrace (DTrace.exe) är ett kommandoradsverktyg som visar systeminformation och händelser. DTrace är en spårningsplattform med öppen källkod som är porterad till Windows. DTrace utvecklades ursprungligen för Solaris-operativsystemet. Det ger dynamisk instrumentering av både användar-/kernelfunktioner, möjligheten att skripta med D-språket och spekulativ spårning. Dessutom har DTrace Windows OS-specifika tillägg som ETW-instrumentering, ETW-händelsegenerering, systemanropsprobning och möjligheter för livedumpfångst.
Anmärkning
DTrace stöds i Insider-versionerna av Windows efter version 18980 och Windows Server Build 18975.
DTrace på Windows GitHub-webbplatsen finns här:
https://github.com/microsoft/DTrace-on-Windows
Öppna DTrace-information
Detaljerad information om DTrace finns i OpenDTrace Specification version 1.0 vid University Of Cambridge.
Den primära GitHub-platsen finns på https://github.com/opendtrace/.
En uppsättning användbara skript finns på https://github.com/opendtrace/toolkit.
Ett antal DTrace-böcker finns tillgängliga, till exempel:
DTrace: Dynamisk spårning i Oracle Solaris, Mac OS X och FreeBSD av Brendan Gregg och Jim Mauro
Solaris Prestanda och verktyg: DTrace och MDB-tekniker för Solaris 10 och OpenSolaris av Richard McDougall, Jim Mauro och Brendan Gregg
Ge er feedback om Windows DTrace
Använd feedbackhubben för att begära nya funktioner eller rapportera eventuella problem eller buggar med Windows DTrace.
- Om du vill starta feedbackhubben i Windows går du till sökfunktionen, anger ordet feedback och väljer sedan Feedbackhubb.
- Välj antingen Föreslå en funktion eller Rapportera ett problem.
- Ange en detaljerad, specifik beskrivning av problemet eller förslaget.
DTrace Windows-tillägg
Följande är några av de Dtrace providers som är tillgängliga på Windows och vad de instrumenterar.
syscall – NTOS-systemanrop.
fbt (Funktionsgränsspårning) – Kernel-funktioners inmatning och returnering.
pid (process-ID) – processspårning i användarläge. Precis som kärnläge FBT, men tillåter även instrumentering av arbiträra funktionsförskjutningar.
etw (Händelsespårning för Windows) – Tillåter att prober definieras för ETW. Den här providern hjälper till att utnyttja befintlig operativsysteminstrumentation i DTrace.
SYSCALL – NTOS-systemanrop
SYSCALL tillhandahåller ett par avsökningar för varje systemanrop: en inmatningsavsökning som utlöses innan systemanropet anges och en returavsökning som utlöses när systemanropet har slutförts men innan kontrollen har överförts tillbaka till användarnivå. För alla SYSCALL-avsökningar är funktionsnamnet inställt på namnet på det instrumenterade systemanropet och modulnamnet är modulen där funktionen finns. Namnen på systemanropen som tillhandahålls av SYSCALL-providern kan hittas genom att skriva kommandot dtrace.exe -l -P syscall från kommandotolken. Observera att probe-namnet är gemener syscall. Kommandot dtrace -ln syscall::: visar också alla sonder och deras parametrar som är tillgängliga från syscall-leverantören.
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
...
Observera att inte alla skärmutdata visas i dessa exempel. "..." används för att representera trunkerade utdata.
För att bläddra igenom utdata, vidarebefordra till 'more'-kommandot så här:
dtrace -ln syscall:::|more
Lägg till v-alternativet för att visa mer information om tillgängliga syscall-prober.
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 innehåller stöd för befintliga manifesterade/spårade ETW-sonder. Du kan instrumentera, filtrera och parsa ETW-händelser synkront vid tidpunkten för händelseavfyrningen. Dessutom kan DTrace användas för att kombinera olika händelser/systemtillstånd för att tillhandahålla en konsoliderad utdataström för att felsöka komplexa felsituationer.
Kommandot dtrace -ln etw::: visar alla prober och deras parametrar som är tillgängliga från syscall-leverantören.
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
...
Mer information finns i DTrace ETW.
Funktionsgränsspårning (FBT)
FBT-providern (Function Boundary Tracing) tillhandahåller sonder som är associerade med inträde till och återlämning från de flesta funktioner i Windows-kärnan. Funktionen är den grundläggande enheten i programtexten. På samma sätt som andra DTrace-leverantörer har FBT ingen prob-effekt när den inte uttryckligen är aktiverad. När det är aktiverat inducerar FBT endast en probe-effekt i funktioner som undersöks. FBT har implementerats på x86- och x64-plattformar.
För varje instruktionsuppsättning finns det ett litet antal funktioner som inte anropar andra funktioner och är mycket optimerade av kompilatorn (så kallade lövfunktioner) som inte kan instrumenteras av FBT. Prober för dessa funktioner finns inte i DTrace.
Kommandot dtrace -ln fbt:nt:: kommer att lista alla sonder och deras parametrar som är tillgängliga för nt-modulen. Använd kommandot debugger lm (List Loaded Modules) för att visa en lista över alla tillgängliga moduler.
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
...
Anmärkning
Eftersom det finns tusentals tillgängliga anrop i nt är det inte en bra idé att lämna funktionsnamnet tomt när du kör ett DTrace-kommando som loggar data. Den rekommenderade metoden för att undvika en möjlig prestandapåverkan är att ange minst en del av funktionsnamnet, till exempel fbt:nt:*Timer*:entry.
PID
Med DTrace PID-providern kan du spåra den interna körningen av användarlägesprocesser, till exempel en webbläsare eller en databas. Du kan också koppla DTrace vid tidpunkten för processens start för att felsöka problem med att starta processen. Som en del av PID-definitionen anger du de funktioner som definierats i processen och specifika förskjutningar (eller alla förskjutningar med jokertecken *) i funktionen. PID-providern kräver att binärfilen startas eller körs vid tidpunkten för skriptkörningen.
Det här exempelkommando visar information om ett specifikt anrop i den PID som är associerat med notepad.exe. Använd kommandot debugger lm (List Loaded Modules) för att visa en lista över alla tillgängliga moduler.
C:\Windows\system32>dtrace -ln "pid$target:ntdll:RtlAllocateHeap:entry" -c notepad.exe
ID PROVIDER MODULE FUNCTION NAME
5102 pid6100 ntdll RtlAllocateHeap entry
Anmärkning
När funktioner skrivna i C++ spåras, kan funktionsnamnen vara för långa eller dekorerade för att specificeras som en probe med sin fullständiga form. En vanlig lösning är att använda ett uttryck som unikt matchar målfunktionen. Använd till exempel 'String??Copy' som en probedel av probnamnet för att matcha 'String::Copy()', eller '*GetPinnableReference' för att matcha 'String::GetPinnableReference()'.
DTrace Windows-arkitektur
Användare interagerar med DTrace via DTrace-kommandot, som fungerar som en klientdel till DTrace-motorn. D-skript kompileras till ett mellanliggande format (DIF) i användarutrymmet och skickas till DTrace-kärnkomponenten för körning, ibland kallad som DIF Virtual Machine. Detta körs i drivrutinen dtrace.sys.
Traceext.sys (spårningstillägg) är en windows-kerneltilläggsdrivrutin som gör att Windows kan exponera funktioner som DTrace förlitar sig på för att tillhandahålla spårning. Windows-kerneln tillhandahåller utrop under stackwalk och minnesåtkomster som sedan implementeras av spårningstillägget.
Installera DTrace under Windows
Kontrollera att du kör en version av Windows som stöds. Den aktuella nedladdningen av DTrace stöds i Insider-versionerna av 20H1 Windows efter version 18980 och Windows Server Build 18975. Installation av den här versionen av DTrace på äldre versioner av Windows kan leda till systeminstabilitet och rekommenderas inte. (Den arkiverade versionen av DTrace för 19H1 är inte längre tillgänglig och stöds inte längre.)
Ladda ned MSI-installationsfilen (Ladda ned DTrace i Windows) från Microsoft Download Center.
Välj Slutför installationen.
Viktigt!
Innan du använder bcdedit för att ändra startinformationen kan du tillfälligt behöva pausa Windows-säkerhetsfunktioner som Patchguard, BitLocker och Säker start på testdatorn. Återaktivera dessa säkerhetsfunktioner när testningen är klar och hantera testdatorn på rätt sätt när säkerhetsfunktionerna är inaktiverade.
Uppdatera PATH-miljövariabeln så att den innehåller C:\Program Files\DTrace
set PATH=%PATH%;"C:\Program Files\DTrace"
- Aktivera DTrace på datorn med kommandot bcdedit.
bcdedit /set dtrace ON
När du uppdaterar till en ny Windows Insider-version måste du ange alternativet dtrace bcdedit igen.
Anmärkning
Om du använder BitLocker inaktiverar du det när du gör ändringar i startvärdena. Om du inte gör det kan du uppmanas att ange BitLocker-återställningsnyckeln. Ett sätt att återställa från denna situation är att starta upp återställningskonsolen och återställa bcdedit-värdet, bcdedit /set {default} dtrace on. Om en OS-uppdatering har tagit bort värdet och du har lagt till det igen använder du bcdedit för att ta bort värdet och återställa operativsystemet. bcdedit /deletevalue {default} dtrace Inaktivera sedan BitLocker och återaktivera dtrace, bcdedit /set dtrace ON.
Konfigurera VSM (virtuellt säkert läge) på datorn för aktivering av kernelfunktionens gränsspårning (FBT) genom att ange "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\EnableVirtualizationBasedSecurity" inställt på 1 för att aktivera VSM och den säkra kerneln.
Det gör du genom att använda kommandot REG Add, så här:
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\ /v EnableVirtualizationBasedSecurity /t REG_DWORD /d 1
Vissa DTrace-kommandon använder Windows-symboler. Om du vill använda Windows-symboler skapar du en symbolkatalog och anger symbolsökvägen:
mkdir c:\symbols
set _NT_SYMBOL_PATH=srv*C:\symbols*https://msdl.microsoft.com/download/symbols
Mer information om symbolsökvägar finns i Symbolsökväg för Windows-felsökningsprogram.
Använda DTrace inuti en virtuell dator
Om du kör DTrace på en virtuell dator aktiverar du kapslad virtualisering på datorn som stöder den virtuella datorn när den virtuella datorn stoppas med hjälp av följande PowerShell-kommando. Ange informationen för den virtuella dator som du kör DTrace på. Öppna ett PowerShell Windows som administratör.
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
Starta om datorn som stöder den virtuella datorn.
Validera DTrace-installationen
Använd alternativet -l för att lista aktiva prober. Om DTrace är aktivt bör många avsökningar visas för etw- och systemhändelser.
Öppna en Windows-kommandotolk som administratör för att ange DTrace-kommandon.
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
...
Om endast dessa tre sonder visas, finns det ett problem med att drivrutinen DTrace.sys läses in.
C:\> dtrace -l
ID PROVIDER MODULE FUNCTION NAME
1 dtrace BEGIN
2 dtrace END
3 dtrace ERROR
Komma igång med DTrace – enradskommandon
Kom igång genom att köra dessa kommandon från en kommandotolk för administratör.
Det här kommandot visar en syscall-sammanfattning per program i 5 sekunder. Parametern tick-5sec anger tidsperioden. Funktionen exit(0); gör att kommandot avslutas och återgår till kommandotolken när det är färdigt. Utdata specificeras med [pid,execname] = count();, vilket visar process-ID (PID), det körbara namnet och ett antal för de senaste fem sekunderna.
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
...
Det här kommandot sammanfattar tidsinställda/avbrutna anrop i 3 sekunder:
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
...
Enradskommandon som använder symboler
Det här kommandot drar nytta av Windows-symboler och kräver att symbolsökvägen anges enligt beskrivningen i installationsavsnittet. Som tidigare nämnts i installationen skapar du en katalog och anger symbolsökvägen med hjälp av dessa kommandon.
C:\> mkdir c:\symbols
C:\> set _NT_SYMBOL_PATH=srv*C:\symbols*https://msdl.microsoft.com/download/symbols
Det här exempelkommandot visar de översta NT-funktionerna.
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
Det här kommandot dumpar SystemProcess-kernelstrukturen.
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 ]
}
}
Det här kommandot visar den översta kernelstacken under de senaste 10 sekunderna.
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
...
Det här kommandot visar de översta modulerna som anropas av notepad.exe under starten. Alternativet -c kör det angivna kommandot (notepad.exe) och avslutas när det har slutförts.
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