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.
- Um den Feedback-Hub in Windows zu starten, wechseln Sie zur Suche, geben Sie das Wort "Feedback" ein, und wählen Sie dann "Feedback-Hub" aus.
- Wählen Sie entweder Vorschlagen eines Features oder Problem melden aus.
- Geben Sie eine detaillierte, spezifische Beschreibung des Problems oder Vorschlags an.
DTrace Windows-Erweiterungen
Im Folgenden finden Sie einige der Dtrace-Anbieter, die unter Windows verfügbar sind und welche Instrumente sie verwenden.
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 – NTOS-Systemaufrufe
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.
Installieren von DTrace unter Windows
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.)
Laden Sie die MSI-Installationsdatei (DTrace unter Windows herunterladen) aus dem Microsoft Download Center herunter.
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.
Aktualisieren Sie die PATH-Umgebungsvariable, um C:\Programme\DTrace einzubeziehen.
set PATH=%PATH%;"C:\Program Files\DTrace"
- 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