DTrace sur Windows
DTrace (DTrace.exe) est un outil en ligne de commande qui affiche des informations et des événements système. DTrace est une plateforme de suivi open source porté sur Windows. DTrace a été initialement développé pour le système d’exploitation Solaris. Il fournit une instrumentation dynamique des deux fonctions utilisateur/noyau, la possibilité de scripter à l’aide du suivi spéculatif en langage D. En outre, DTrace a des extensions spécifiques au système d’exploitation Windows, telles que l’instrumentation ETW, la génération d’événements ETW, les sondes d’appel système et les fonctionnalités de capture de vidage en direct.
Notes
DTrace est pris en charge dans les builds Insider de Windows après la version 18980 et Windows Server Build 18975.
Le site DTrace sur Windows Github se trouve ici :
https://github.com/microsoft/DTrace-on-Windows
Ouvrir les informations DTrace
Pour plus d’informations sur DTrace, consultez la spécification OpenDTrace version 1.0 à l’Université de Cambridge.
Le site GitHub principal se trouve à l’adresse https://github.com/opendtrace/.
Un ensemble de scripts utiles est disponible à l’adresse https://github.com/opendtrace/toolkit.
Un certain nombre de livres DTrace sont disponibles, tels que :
DTrace : Suivi dynamique dans Oracle Solaris, Mac OS X et FreeBSD par Brendan Gregg et Jim Mauro
Solaris Performance and Tools: DTrace and MDB Techniques for Solaris 10 and OpenSolaris par Richard McDougall, Jim Mauro et Brendan Gregg
Fournir des commentaires sur Windows DTrace
Utilisez le hub de commentaires pour demander de nouvelles fonctionnalités ou pour signaler des problèmes ou des bogues avec Windows DTrace.
- Lancez le hub de commentaires. Accédez à la recherche, entrez le mot commentaires, puis sélectionnez Hub de commentaires.
- Sélectionnez Suggérer une fonctionnalité ou Signaler un problème.
- Fournissez une description détaillée et spécifique du problème ou de la suggestion.
DTrace Windows Extensions
Voici quelques-uns des fournisseurs disponibles sur Windows et ce qu’ils instrumentent.
syscall – Appels système NTOS
fbt (Suivi des limites de fonction) : entrée et retours de la fonction noyau
pid (ID de processus) : suivi du processus en mode utilisateur. Comme FBT en mode noyau, mais autorise également l’instrumentation de décalages de fonction arbitraires.
etw (Suivi d’événements pour Windows) : permet de définir des sondes pour ETW Ce fournisseur permet de tirer parti de l’instrumentation de système d’exploitation existante dans DTrace.
SYSCALL
SYSCALL fournit une paire de sondes pour chaque appel système : une sonde d’entrée qui se déclenche avant l’entrée de l’appel système et une sonde de retour qui se déclenche une fois l’appel système terminé, mais avant que le contrôle ne soit transféré au niveau de l’utilisateur. Pour toutes les sondes SYSCALL, le nom de la fonction est défini sur le nom de l’appel système instrumenté et le nom du module est le module dans lequel la fonction existe. Les noms des appels système fournis par le fournisseur SYSCALL peuvent être trouvés en tapant la commande dtrace.exe -l -P syscall
à partir de l’invite de commandes. Notez que le nom de la sonde est syscall en minuscules. La commande dtrace -ln syscall:::
répertorie également toutes les sondes et leurs paramètres disponibles auprès du fournisseur 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
...
Notez que toutes les sorties d’écran ne sont pas affichées dans ces exemples. "..." est utilisé pour représenter la sortie tronquée.
Pour faire défiler la sortie, dirigez vers la commande plus comme suit :
dtrace -ln syscall:::|more
Ajoutez l’option v pour afficher plus d’informations sur les sondes syscall disponibles.
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 prend en charge les sondes ETW manifestées/consignées existantes. Vous pouvez instrumenter, filtrer et analyser les événements ETW de manière synchrone au moment du déclenchement de l’événement. En outre, DTrace peut être utilisé pour combiner différents événements/états système afin de fournir un flux de sortie consolidé pour aider à déboguer des situations d’erreur complexes.
La commande dtrace -ln etw:::
répertorie toutes les sondes et leurs paramètres disponibles auprès du fournisseur 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
...
Pour plus d’informations, consultez DTrace ETW.
FBT (Function Boundary Tracing)
Le fournisseur FBT (Function Boundary Tracing) fournit des sondes associées à l’entrée et au retour de la plupart des fonctions dans le noyau Windows. La fonction est l’unité fondamentale du texte du programme. Comme pour d’autres fournisseurs DTrace, FBT n’a aucun effet de sonde lorsqu’il n’est pas explicitement activé. Lorsqu’il est activé, FBT provoque uniquement un effet de sonde dans les fonctions sondées. FBT a été implémenté sur les plateformes x86 et x64.
Pour chaque jeu d’instructions, il existe un petit nombre de fonctions qui n’appellent pas d’autres fonctions et qui sont hautement optimisées par le compilateur (fonctions feuilles) qui ne peuvent pas être instrumentées par FBT. Les sondes pour ces fonctions ne sont pas présentes dans DTrace.
La commande dtrace -ln fbt:nt::
répertorie toutes les sondes et leurs paramètres disponibles pour le module nt. Utilisez la commande lm (Liste des modules chargés) du débogueur pour répertorier tous les modules disponibles.
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
...
Notes
Comme des milliers d’appels sont disponibles dans nt, il ne serait pas judicieux de laisser le nom de la fonction vide lors de l’exécution d’une commande DTrace qui journalise les données. L’approche recommandée pour éviter un impact possible sur les performances consiste à spécifier au moins une partie du nom de la fonction, par fbt:nt:*Timer*:entry
exemple .
PID
Le fournisseur DTrace PID vous permet de suivre l’exécution interne des processus en mode utilisateur, tels qu’un navigateur web ou une base de données. Vous pouvez également attacher DTrace au moment du lancement du processus afin de déboguer les problèmes de démarrage du processus. Dans le cadre de la définition PID, vous spécifiez les fonctions définies dans le processus et des décalages spécifiques (ou tout décalage à l’aide de caractères génériques *) dans la fonction. Le fournisseur PID nécessite que le fichier binaire soit lancé ou en cours d’exécution au moment de l’exécution du script.
Cet exemple de commande affiche des informations sur un appel spécifique dans le PID associé à notepad.exe. Utilisez la commande lm (Liste des modules chargés) du débogueur pour répertorier tous les modules disponibles.
C:\Windows\system32>dtrace -ln "pid$target:ntdll:RtlAllocateHeap:entry" -c notepad.exe
ID PROVIDER MODULE FUNCTION NAME
5102 pid6100 ntdll RtlAllocateHeap entry
Notes
Lors du suivi de fonctions écrites en C++, les noms des fonctions peuvent être trop longs ou décorés pour être spécifiés en tant que sonde avec leur forme complète. Une solution courante consiste à utiliser une expression qui correspond de manière unique à votre fonction cible. Par exemple, utilisez 'String?? Copiez » en tant que partie « probefunc » du nom de la sonde pour correspondre à « String::Copy() », ou « *GetPinnableReference » pour correspondre à « String::GetPinnableReference() ».
Architecture DTrace Windows
Les utilisateurs interagissent avec DTrace via la commande DTrace, qui sert de serveur frontal au moteur DTrace. Les scripts D sont compilés au format intermédiaire (DIF) dans l’espace utilisateur et envoyés au composant noyau DTrace pour exécution, parfois appelé machine virtuelle DIF. Cela s’exécute dans le pilote dtrace.sys.
Traceext.sys (extension de trace) est un pilote d’extension du noyau Windows, qui permet à Windows d’exposer des fonctionnalités sur lesquelles DTrace s’appuie pour fournir un suivi. Le noyau Windows fournit des légendes pendant les accès à la pile ou à la mémoire, qui sont ensuite implémentées par l’extension de trace.
Installation de DTrace sous Windows
Vérifiez que vous exécutez une version prise en charge de Windows. Le téléchargement actuel de DTrace est pris en charge dans les builds Insider de Windows 20H1 après la version 18980 et Windows Server Build 18975. L’installation de cette version de DTrace sur des versions antérieures de Windows peut entraîner une instabilité du système et n’est pas recommandée.
La version archivée de DTrace pour 19H1 est disponible dans Archived Download DTrace sur Windows. Notez que cette version de DTrace n’est plus prise en charge.
Téléchargez le fichier d’installation MSI (Télécharger DTrace sur Windows) à partir du Centre de téléchargement Microsoft.
Sélectionnez Terminer l’installation.
Important
Avant d’utiliser bcdedit pour modifier les informations de démarrage, vous devrez peut-être suspendre temporairement les fonctionnalités de sécurité Windows telles que Patchguard, BitLocker et démarrage sécurisé sur le PC de test. Réactivez ces fonctionnalités de sécurité une fois le test terminé et gérez correctement le PC de test lorsque les fonctionnalités de sécurité sont désactivées.
Activez DTrace sur la machine à l’aide de la commande bcdedit.
bcdedit /set dtrace ON
Lorsque vous effectuez une mise à jour vers une nouvelle build Windows Insider, vous devez à nouveau définir l’option dtrace bcdedit.
Notes
Si vous utilisez BitLocker, désactivez-le lorsque vous apportez des modifications aux valeurs de démarrage. Si vous ne le faites pas, vous serez peut-être invité à entrer la clé de récupération BitLocker. Une façon de récupérer à partir de cette situation consiste à démarrer sur la console de récupération et à restaurer la valeur bcdedit, bcdedit /set {default} dtrace on
. Si une mise à jour du système d’exploitation a supprimé la valeur et que vous l’avez ajoutée dans, pour récupérer le système d’exploitation, utilisez bcdedit pour supprimer la valeur, bcdedit /deletevalue {default} dtrace
. Désactivez ensuite BitLocker et réactivez dtrace, bcdedit /set dtrace ON
.
Configurez VSM (Virtual Secure Mode) sur l’ordinateur pour activer le suivi des limites de fonction du noyau (FBT) en définissant « HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\EnableVirtualizationBasedSecurity » sur 1 pour activer VSM et le noyau sécurisé.
Pour ce faire, utilisez la commande REG Add, comme suit :
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\ /v EnableVirtualizationBasedSecurity /t REG_DWORD /d 1
Certaines commandes DTrace utilisent des symboles Windows. Pour utiliser des symboles Windows, créez un répertoire de symboles et définissez le chemin des symboles :
mkdir c:\symbols
set _NT_SYMBOL_PATH=srv*C:\symbols*https://msdl.microsoft.com/download/symbols
Pour plus d’informations sur les chemins d’accès aux symboles, consultez Chemin des symboles pour les débogueurs Windows.
Utilisation de DTrace à l’intérieur d’une machine virtuelle
Si vous exécutez DTrace sur une machine virtuelle, activez la virtualisation imbriquée sur la machine prenant en charge la machine virtuelle, lorsque la machine virtuelle est arrêtée, à l’aide de la commande PowerShell suivante. Fournissez le <VMName>
pour la machine virtuelle dans laquelle vous exécutez DTrace. Ouvrez un Windows PowerShell en tant qu’administrateur.
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
Redémarrez le PC prenant en charge la machine virtuelle.
Validation de l’installation de DTrace
Utilisez l’option -l pour répertorier les sondes actives. Si DTrace est actif, de nombreuses sondes doivent être répertoriées pour les événements etw et système.
Ouvrez une invite de commandes Windows en tant qu’administrateur pour entrer des commandes 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
...
Si seules ces trois sondes sont répertoriées, le chargement du pilote DTrace.sys pose problème.
C:\> dtrace -l
ID PROVIDER MODULE FUNCTION NAME
1 dtrace BEGIN
2 dtrace END
3 dtrace ERROR
Prise en main de DTrace - Commandes à une ligne
Commencez par exécuter ces commandes à partir d’une invite de commandes administrateur.
Cette commande affiche un résumé syscall par programme pendant 5 secondes. Le paramètre tick-5sec spécifie la période. La sortie(0); entraîne la fermeture de la commande à la fin de l’invite de commandes. La sortie est spécifiée à l’aide [pid,execname] = count();
de Ceci affiche l’ID de processus (PID), le nom de l’exécutable et un nombre pour les 5 dernières secondes.
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
...
Cette commande récapitule les appels définis/annulés du minuteur pendant 3 secondes :
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
...
Commandes d’une ligne qui utilisent des symboles
Ces commandes tirent parti des symboles Windows et exigent que le chemin du symbole soit défini comme indiqué dans la section d’installation. Comme mentionné précédemment dans l’installation, créez un répertoire et définissez le chemin du symbole à l’aide de ces commandes.
C:\> mkdir c:\symbols
C:\> set _NT_SYMBOL_PATH=srv*C:\symbols*https://msdl.microsoft.com/download/symbols
Cet exemple de commande affiche les principales fonctions 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
Cette commande vide la structure du noyau 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 ]
}
}
Cette commande affiche la pile de noyau supérieure pendant les 10 dernières secondes.
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
...
Cette commande affiche les principaux modules appelés par notepad.exe lors du lancement. L’option -c exécute la commande spécifiée (notepad.exe) et se ferme à l’achèvement de celle-ci.
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