DTrace unter Windows

DTrace (DTrace.exe) ist ein Befehlszeilentool, das Systeminformationen und Ereignisse anzeigt. DTrace ist eine auf Windows portierte Open-Source-Ablaufverfolgungsplattform. DTrace wurde ursprünglich für das Solaris-Betriebssystem entwickelt. Es bietet dynamische Instrumentierung sowohl von Benutzer- als auch Kernelfunktionen, die Möglichkeit zum Skripten mithilfe der D-Sprache, und spekulative Ablaufverfolgung. Darüber hinaus verfügt DTrace über Windows-spezifische Erweiterungen wie ETW-Instrumentierung, ETW-Ereignisgenerierung, Systemaufrufprüfungen und Live-Dump-Erfassungsfunktionen.

Hinweis

DTrace wird in den Insider-Builds von Windows nach Version 18980 und Windows Server Build 18975 unterstützt.

Die DTrace-Website auf Windows GitHub befindet sich hier:

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

Open DTrace-Informationen

Ausführliche Informationen zu DTrace finden Sie in der OpenDTrace-Spezifikation Version 1.0 an der University Of Cambridge.

Die primäre GitHub-Website befindet sich unter https://github.com/opendtrace/.

Eine Reihe nützlicher Skripts ist unter https://github.com/opendtrace/toolkit verfügbar.

Es sind eine Reihe von DTrace-Büchern verfügbar, darunter:

DTrace: Dynamic Tracing in Oracle Solaris, Mac OS X and FreeBSD von Brendan Gregg und Jim Mauro

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

Bereitstellen von Feedback zu Windows DTrace

Verwenden Sie den Feedback-Hub, um neue Features anzufordern oder Probleme oder Fehler mit Windows DTrace zu melden.

  1. Starten Sie den Feedback-Hub. Wechseln Sie zur Suche, geben Sie das Wort Feedback ein, und wählen Sie dann Feedback-Hub aus.
  2. Wählen Sie entweder Vorschlagen eines Features oder Problem melden aus.
  3. Geben Sie eine detaillierte, spezifische Beschreibung des Problems oder Vorschlags an.

DTrace Windows-Erweiterungen

Im Folgenden sind einige der unter Windows verfügbaren Anbieter und ihre Instrumente aufgeführt.

  • syscall – NTOS-Systemaufrufe

  • fbt (Function Boundary Tracing) – Kernelfunktionseintrag und -rückgabe

  • pid (Prozess-ID) – Prozessablaufverfolgung im Benutzermodus Wie FBT im Kernelmodus, ermöglicht aber auch die Instrumentierung beliebiger Funktionsoffsets.

  • etw (Ereignisablaufverfolgung für Windows) – Ermöglicht die Definition von Prüfpunkten für ETW. Dieser Anbieter hilft dabei, die vorhandene Betriebssysteminstrumentierung in DTrace zu nutzen.

SYSCALL

SYSCALL stellt für jeden Systemaufruf einige Prüfpunkte bereit: einen Eintrittsprüfpunkt, der ausgelöst wird, bevor der Systemaufruf eingegeben wird, und einen Rückgabeprüfpunkt, der ausgelöst wird, nachdem der Systemaufruf abgeschlossen ist, aber bevor die Steuerung wieder auf die Benutzerebene übertragen wird. Für alle SYSCALL-Prüfpunkte ist der Funktionsname auf den Namen des instrumentierten Systemaufrufs festgelegt, und der Modulname ist das Modul, in dem die Funktion vorhanden ist. Die Namen der Systemaufrufe, die vom SYSCALL-Anbieter bereitgestellt werden, finden Sie möglicherweise, indem Sie den Befehl dtrace.exe -l -P syscall über die Eingabeaufforderung eingeben. Beachten Sie, dass der Prüfpunktname „syscall“ in Kleinbuchstaben geschrieben wird. Der Befehl dtrace -ln syscall::: führt auch alle Prüfpunkte und deren Parameter auf, die vom syscall-Anbieter verfügbar sind.

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

Beachten Sie, dass nicht alle Bildschirmausgaben in diesen Beispielen angezeigt werden. „...“ wird verwendet, um eine abgeschnittene Ausgabe darzustellen.

Um durch die Ausgabe zu scrollen, übergeben Sie den Befehl more wie folgt:

dtrace -ln syscall:::|more

Fügen Sie die v-Option hinzu, um weitere Informationen zu den verfügbaren syscall-Prüfpunkten anzuzeigen.

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 enthält Unterstützung für vorhandene manifestierte/in einer Ablaufverfolgung protokollierte ETW-Prüfpunkte. Sie können ETW-Ereignisse synchron zum Zeitpunkt des Auslösens von Ereignissen instrumentieren, filtern und analysieren. Darüber hinaus kann DTrace verwendet werden, um verschiedene Ereignisse/Systemzustände zu kombinieren, um einen konsolidierten Ausgabedatenstrom bereitzustellen und so komplexe Fehlersituationen zu debuggen.

Der Befehl dtrace -ln etw::: führt alle Prüfpunkte und deren Parameter auf, die vom syscall-Anbieter verfügbar sind.

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

Weitere Informationen finden Sie unter DTrace ETW.

Function Boundary Tracing (FBT)

Der FBT-Anbieter (Function Boundary Tracing) stellt Prüfpunkte bereit, die dem Eintrag zugeordnet sind und von den meisten Funktionen im Windows-Kernel zurückgegeben werden. Die Funktion ist die grundlegende Einheit des Programmtexts. Ähnlich wie bei anderen DTrace-Anbietern hat FBT keinen Prüfeffekt, wenn dies nicht explizit aktiviert ist. Wenn diese Option aktiviert ist, löst FBT nur einen Prüfeffekt in prüffähigen Funktionen aus. FBT wurde auf x86- und x64-Plattformen implementiert.

Für jeden Befehlssatz gibt es eine kleine Anzahl von Funktionen, die keine anderen Funktionen aufrufen und vom Compiler stark optimiert werden (sogenannte Blattfunktionen), die nicht von FBT instrumentiert werden können. Prüfpunkte für diese Funktionen sind in DTrace nicht vorhanden.

Der Befehl dtrace -ln fbt:nt:: führt alle Prüfpunkte und deren Parameter auf, die für das nt-Modul verfügbar sind. Verwenden Sie den Debugger lm (List Loaded Modules), um alle verfügbaren Module aufzuführen.

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

Hinweis

Da in nt Tausende von Aufrufen verfügbar sind, empfiehlt es sich nicht, den Funktionsnamen leer zu lassen, wenn ein DTrace-Befehl ausgeführt wird, der Daten protokolliert. Der empfohlene Ansatz zur Vermeidung möglicher Leistungseinbußen besteht darin, zumindest einen Teil des Funktionsnamens anzugeben, z. B. fbt:nt:*Timer*:entry.

PID

Mit dem DTrace PID-Anbieter können Sie die interne Ausführung von Prozessen im Benutzermodus wie einem Webbrowser oder einer Datenbank verfolgen. Sie können DTrace auch zum Zeitpunkt des Prozessstarts anhängen, um Probleme beim Prozessstart zu beheben. Im Rahmen der PID-Definition geben Sie die im Prozess definierten Funktionen sowie bestimmte Offsets (oder alle Offsets mit einem Platzhalter *) innerhalb der Funktion an. Der PID-Anbieter erfordert, dass die Binärdatei zum Zeitpunkt der Skriptausführung gestartet oder ausgeführt wird.

In diesem Beispielbefehl werden Informationen zu einem bestimmten Aufruf in der PID angezeigt, die mit notepad.exe verknüpft ist. Verwenden Sie den Debugger lm (List Loaded Modules), um alle verfügbaren Module aufzuführen.

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

Hinweis

Beim Verfolgen von in C++ geschriebenen Funktionen sind die Funktionsnamen möglicherweise zu lang oder ausgeschmückt, um als Prüfpunkt in ihrer vollständigen Form angegeben zu werden. Eine gängige Lösung besteht darin, einen Ausdruck zu verwenden, der Ihrer Zielfunktion eindeutig entspricht. Verwenden Sie beispielsweise „String??Copy“ als „probefunc“-Teil des Prüfpunktnamens, um mit „String::Copy()“ übereinzustimmen, oder „*GetPinnableReference“, um mit „String::GetPinnableReference()“ übereinzustimmen.

DTrace Windows-Architektur

Benutzer interagieren mit DTrace über den DTrace-Befehl, der als Front-End für das DTrace-Modul dient. D-Skripte werden im Benutzerbereich in ein Zwischenformat (DIF) kompiliert und zur Ausführung an die DTrace-Kernelkomponente gesendet, die manchmal auch als DIF Virtual Machine bezeichnet wird. Dies wird im dtrace.sys-Treiber ausgeführt.

Traceext.sys (Ablaufverfolgungserweiterung) ist ein Windows-Kernelerweiterungstreiber, mit dem Windows Funktionen verfügbar machen kann, die DTrace benötigt, um die Ablaufverfolgung bereitzustellen. Der Windows-Kernel stellt bei Stackwalk- oder Speicherzugriffen Callouts bereit, die dann von der Trace-Erweiterung implementiert werden.

Diagramm der DTrace-Windows-Architektur mit dtrace.exe, die mit libtrace verbunden ist. Diese kommuniziert mit DTrace.sys und ruft Traceext.sys auf.

Installieren von DTrace unter Windows

  1. Stellen Sie sicher, dass Sie eine unterstützte Version von Windows ausführen. Der aktuelle Download von DTrace wird in den Insider-Builds von 20H1 Windows nach Version 18980 und Windows Server Build 18975 unterstützt. Die Installation dieser Version von DTrace in älteren Versionen von Windows kann zu Systeminstabilität führen und wird nicht empfohlen. (Die archivierte Version von DTrace für 19H1 ist nicht mehr verfügbar und wird nicht mehr unterstützt.)

  2. Laden Sie die MSI-Installationsdatei (DTrace unter Windows herunterladen) aus dem Microsoft Download Center herunter.

  3. Wählen Sie die vollständige Installation aus.

    Wichtig

    Bevor Sie bcdedit zum Ändern der Startinformationen verwenden, müssen Sie möglicherweise vorübergehend Windows-Sicherheitsfeatures wie Patchguard, BitLocker und Secure Boot auf dem Test-PC aussetzen. Aktivieren Sie diese Sicherheitsfeatures nach Abschluss des Tests erneut, und verwalten Sie den Test-PC entsprechend, wenn die Sicherheitsfeatures deaktiviert sind.

  4. Aktualisieren Sie die PATH-Umgebungsvariable, um C:\Programme\DTrace einzubeziehen.

set PATH=%PATH%;"C:\Program Files\DTrace"
  1. Aktivieren Sie DTrace auf dem Computer mithilfe des bcdedit-Befehls.
bcdedit /set dtrace ON

Wenn Sie auf einen neuen Windows-Insider-Build aktualisieren, müssen Sie die Option „dtrace bcdedit“ erneut festlegen.

Hinweis

Wenn Sie BitLocker verwenden, deaktivieren Sie es, wenn Sie Änderungen an den Startwerten vornehmen. Wenn Sie dies nicht tun, werden Sie möglicherweise zur Eingabe des BitLocker-Wiederherstellungsschlüssels aufgefordert. Eine Möglichkeit zur Wiederherstellung aus dieser Situation besteht darin, mit der Wiederherstellungskonsole zu starten und den bcdedit-Wert bcdedit /set {default} dtrace on wiederherzustellen. Wenn ein Betriebssystemupdate den Wert entfernt hat und Sie ihn hinzugefügt haben, verwenden Sie bcdedit, um den Wert bcdedit /deletevalue {default} dtrace wiederherzustellen. Deaktivieren Sie dann BitLocker, und aktivieren Sie dtrace bcdedit /set dtrace ON erneut.

Konfigurieren Sie VSM (Virtual Secure Mode) auf dem Computer, um das Function Boundary Tracing (FBT) des Kernels zu aktivieren, indem Sie „HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\EnableVirtualizationBasedSecurity“ auf 1 setzen, um VSM und den sicheren Kernel zu aktivieren.

Verwenden Sie dazu den Befehl „REG Add“ wie folgt:

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

Einige DTrace-Befehle verwenden Windows-Symbole. Erstellen Sie zum Verwenden von Windows-Symbolen ein Symbolverzeichnis, und legen Sie den Symbolpfad fest:

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

Weitere Informationen zu Symbolpfaden finden Sie unter Symbolpfad für Windows-Debugger.

Verwenden von DTrace innerhalb eines virtuellen Computers

Wenn Sie DTrace auf einer VM ausführen, aktivieren Sie die verschachtelte Virtualisierung auf der Maschine, die die VM unterstützt, wenn die VM gestoppt ist, indem Sie den folgenden PowerShell-Befehl verwenden. Geben Sie <VMName> für den virtuellen Computer an, in dem Sie DTrace ausführen. Öffnen Sie ein PowerShell-Fenster als Administrator.

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

Starten Sie den PC neu, der die VM unterstützt.

Überprüfen der DTrace-Installation

Verwenden Sie die -I-Option, um die aktiven Prüfpunkte aufzuführen. Wenn DTrace aktiv ist, sollten viele Prüfpunkte für ETW- und Systemereignisse aufgeführt werden.

Öffnen Sie eine Windows-Eingabeaufforderung als Administrator, um DTrace-Befehle einzugeben.

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

...

Wenn nur diese drei Prüfpunkte aufgeführt sind, gibt es ein Problem mit dem geladenen DTrace.sys-Treiber.

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

Erste Schritte mit DTrace – Einzeilige Befehle

Beginnen Sie, indem Sie diese Befehle über eine Administrator-Eingabeaufforderung ausführen.

Dieser Befehl zeigt eine syscall-Zusammenfassung nach Programm für 5 Sekunden an. Der tick-5sec-Parameter gibt den Zeitraum an. exit(0); bewirkt, dass der Befehl nach Abschluss wieder an der Eingabeaufforderung beendet wird. Die Ausgabe wird mithilfe von [pid,execname] = count(); angegeben. Dadurch werden die Prozess-ID (PID), der ausführbare Name und eine Anzahl für die letzten 5 Sekunden angegeben.

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

Dieser Befehl fasst Timer-Festlegungs-/Abbruch-Aufrufe für 3 Sekunden zusammen:

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

Einzeilige Befehle, die Symbole verwenden

Dieser Befehl nutzt Windows-Symbole und setzt voraus, dass der Symbolpfad wie im Installationsabschnitt beschrieben festgelegt wird. Erstellen Sie, wie bereits bei der Installation erwähnt, ein Verzeichnis und legen Sie den Symbolpfad mit diesen Befehlen fest.

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

In diesem Beispielbefehl werden die wichtigsten NT-Funktionen angezeigt.

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

Dieser Befehl erstellt einen Dump der SystemProcess-Kernelstruktur.

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 ]
    }
}

Dieser Befehl zeigt den obersten Kernel-Stack der letzten 10 Sekunden an.

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

Mit diesem Befehl werden die obersten Module angezeigt, die während des Starts von notepad.exe aufgerufen werden. Die Option -c führt den angegebenen Befehl (notepad.exe) aus und wird nach Abschluss beendet.

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

Weitere Informationen

DTrace Windows-Programmierung

DTrace ETW

DTrace Live Dump

DTrace Windows-Codebeispiele