Dela via


DTrace i Windows

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.

  1. Om du vill starta feedbackhubben i Windows går du till sökfunktionen, anger ordet feedback och väljer sedan Feedbackhubb.
  2. Välj antingen Föreslå en funktion eller Rapportera ett problem.
  3. 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.

Diagram som visar DTrace Windows-arkitektur med dtrace.exe ansluten till libtrace, som kommunicerar med DTrace.sysoch anropar Traceext.sys.

Installera DTrace under Windows

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

  2. Ladda ned MSI-installationsfilen (Ladda ned DTrace i Windows) från Microsoft Download Center.

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

  4. Uppdatera PATH-miljövariabeln så att den innehåller C:\Program Files\DTrace

set PATH=%PATH%;"C:\Program Files\DTrace"
  1. 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

Se även