Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
DTrace (DTrace.exe) je nástroj příkazového řádku, který zobrazuje systémové informace a události. DTrace je opensourcová platforma trasování portovaná do Windows. DTrace byl původně vyvinut pro operační systém Solaris. Poskytuje dynamickou instrumentaci funkcí uživatele nebo jádra, schopnost skriptovat pomocí jazyka D a spekulativní trasování. DTrace má navíc rozšíření specifická pro operační systém Windows, jako jsou instrumentace ETW, generování událostí ETW, sondy systémových volání a schopnosti zachytávání živého výpisu.
Poznámka:
DTrace se podporuje v buildech Insider systému Windows po verzi 18980 a buildu Windows Serveru 18975.
Web DTrace na GitHubu pro Windows se nachází tady:
https://github.com/microsoft/DTrace-on-Windows
Otevřít informace o DTrace
Podrobné informace o DTrace naleznete v OpenDTrace Specification verze 1.0 na University of Cambridge.
Primární web GitHubu se nachází na https://github.com/opendtrace/adrese .
Sada užitečných skriptů je k dispozici na adrese https://github.com/opendtrace/toolkit.
K dispozici je řada knih DTrace, například:
DTrace: Dynamické trasování v Oracle Solaris, Mac OS X a FreeBSD od Brendan Gregg a Jim Mauro
Solaris Performance and Tools: Techniky DTrace a MDB pro Solaris 10 a OpenSolaris od Richarda McDougalla, Jima Maura a Brendana Gregga
Poskytnutí zpětné vazby na Windows DTrace
Centrum Feedback můžete použít k vyžádání nových funkcí nebo hlášení problémů nebo chyb pomocí nástroje Windows DTrace.
- Pokud chcete spustit Centrum Feedback ve Windows, přejděte do vyhledávání, zadejte slovo váš názor a pak vyberte Centrum Feedback.
- Vyberte Možnost Navrhnout funkci nebo Nahlásit problém.
- Zadejte podrobný popis problému nebo návrhu.
Rozšíření DTrace pro Windows
Následuje několik poskytovatelů Dtrace dostupných ve Windows a k čemu slouží.
syscall – systémová volání NTOS.
fbt (trasování hranic funkce) – vstupy a návraty funkcí jádra.
pid (ID procesu) – trasování procesů v uživatelském režimu. Stejně jako FBT v režimu jádra, ale také umožňuje instrumentaci libovolných posunů funkcí.
etw (Trasování událostí pro Windows) – Umožňuje definovat sondy pro ETW (Trasování událostí pro Windows). Tento poskytovatel pomáhá využít existující instrumentaci operačního systému v DTrace.
SYSCALL – systémová volání NTOS
SYSCALL poskytuje dvojici sond pro každé volání systému: vstupní sondu, která se aktivuje před vstupem systémového volání, a návratovou sondu, která se aktivuje po dokončení systémového volání, ale před přenesením řízení zpět na úroveň uživatele. Pro všechny sondy SYSCALL je název funkce nastaven na název instrumentovaného systémového volání a název modulu je modul, ve kterém funkce existuje. Názvy systémových volání poskytované poskytovatelem SYSCALL mohou být nalezeny zadáním příkazu dtrace.exe -l -P syscall z příkazového řádku. Všimněte si, že název sondy je malé písmeno syscall.
dtrace -ln syscall::: Příkaz také zobrazí seznam všech sond a jejich parametrů dostupných od poskytovatele 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
...
Všimněte si, že v těchto příkladech se nezobrazuje veškerý výstup obrazovky. "..." slouží k reprezentaci zkráceného výstupu.
Pokud chcete procházet výstup, přeskakujte ho k dalšímu příkazu, jak je znázorněno níže:
dtrace -ln syscall:::|more
Přidejte možnost v pro zobrazení dalších informací o dostupných sondách syscall.
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
...
Trasování událostí pro Windows
DTrace zahrnuje podporu pro stávající ETW sondy manifestovaného nebo záznamového trasování událostí. Události EtW můžete instrumentovat, filtrovat a parsovat synchronně v době spuštění události. Kromě toho lze DTrace použít ke kombinování různých událostí nebo stavů systému, aby poskytoval konsolidovaný výstupní datový proud, který pomáhá ladit složité chybové situace.
Příkaz dtrace -ln etw::: zobrazí seznam všech sond a jejich parametrů dostupných od zprostředkovatele 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
...
Další informace naleznete v tématu DTrace ETW.
Trasování hranic funkce (FBT)
Zprostředkovatel FBT (Funkce Boundary Tracing) zajišťuje sondy pro vstup do a návrat z většiny funkcí v jádru Windows. Funkce je základní jednotkou textu programu. Podobně jako u jiných poskytovatelů DTrace nemá FBT žádný účinek sondy, pokud není explicitně povolený. Pokud je povolena, FBT indukuje efekt sondy pouze ve zkoumaných funkcích. FBT byla implementována na platformách x86 a x64.
Pro každou sadu instrukcí existuje malý počet funkcí, které nevolají jiné funkce a jsou vysoce optimalizované kompilátorem (tzv. listové funkce), které není možné instrumentovat pomocí FBT. Sondy těchto funkcí nejsou přítomné v DTrace.
dtrace -ln fbt:nt:: Příkaz zobrazí seznam všech sond a jejich parametrů dostupných pro modul nt. Pomocí příkazu ladicího programu lm (List Loaded Modules) zobrazte seznam všech dostupných modulů.
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
...
Poznámka:
Vzhledem k tomu, že v nt jsou k dispozici tisíce volání, není vhodné nechat název funkce prázdný při spuštění příkazu DTrace, který protokoluje data. Doporučeným přístupem k zabránění možnému dopadu na výkon je zadat alespoň část názvu funkce, například fbt:nt:*Timer*:entry.
identifikátor PID
Zprostředkovatel DTrace PID umožňuje trasovat interní provádění procesů uživatelského režimu, jako je webový prohlížeč nebo databáze. Při spuštění procesu můžete také připojit DTrace, abyste mohli ladit problémy související se spuštěním procesu. Jako součást definice PID zadáte funkce definované v procesu a specifické posuny (nebo všechny posuny pomocí zástupného znaku *) v rámci funkce. Zprostředkovatel PID vyžaduje spuštění nebo běh binárky v době spuštění skriptu.
Tento ukázkový příkaz zobrazí informace o konkrétním volání v PID přidruženém k notepad.exe. Použijte příkaz lm (List Loaded Modules) k zobrazení seznamu všech dostupných modulů.
C:\Windows\system32>dtrace -ln "pid$target:ntdll:RtlAllocateHeap:entry" -c notepad.exe
ID PROVIDER MODULE FUNCTION NAME
5102 pid6100 ntdll RtlAllocateHeap entry
Poznámka:
Při trasování funkcí napsaných v jazyce C++ mohou být názvy funkcí příliš dlouhé nebo upravené, aby byla zadána jako sonda v jejich úplné podobě. Běžným řešením je použít výraz, který jednoznačně odpovídá vaší cílové funkci. Například použijte 'String??Copy' jako 'probefunc' část názvu sondy, aby odpovídal 'String::Copy()', nebo '*GetPinnableReference', aby odpovídal 'String::GetPinnableReference()'.
Architektura DTrace pro Windows
Uživatelé komunikují s DTrace prostřednictvím příkazu DTrace, který slouží jako front-end modulu DTrace. Skripty D se kompilují do zprostředkujícího formátu (DIF) v uživatelském prostoru a odesílají se do komponenty jádra DTrace ke spuštění, někdy označované jako virtuální počítač DIF. Spustí se v ovladači dtrace.sys.
Traceext.sys (rozšíření pro trasování) je ovladač rozšíření jádra systému Windows, který umožňuje systému Windows zpřístupnit funkce, které DTrace používá k poskytování trasování. Jádro Windows poskytuje výstupy během procházení zásobníkem nebo přístupu k paměti, které jsou pak implementovány rozšířením pro trasování.
Instalace DTrace v systému Windows
Zkontrolujte, že používáte podporovanou verzi Windows. Aktuální stažení DTrace je podporováno v buildech Insider systému Windows 20H1 po verzi 18980 a buildu Windows Serveru 18975. Instalace této verze DTrace ve starších verzích Windows může vést k nestabilitě systému a nedoporučuje se. (Archivovaná verze DTrace pro verzi 19H1 už není dostupná a už se nepodporuje.)
Stáhněte instalační soubor MSI (Stáhnout DTrace ve Windows) z webu Microsoft Download Center.
Vyberte dokončenou instalaci.
Důležité
Před použitím nástroje bcdedit ke změně informací o spuštění může být nutné dočasně pozastavit funkce zabezpečení systému Windows, jako je Patchguard, BitLocker a Zabezpečené spouštění na testovacím počítači. Po dokončení testování opět aktivujte tyto funkce zabezpečení a odpovídajícím způsobem zacházejte s testovacím počítačem, když jsou bezpečnostní funkce vypnuté.
Aktualizujte proměnnou prostředí PATH tak, aby zahrnovala C:\Program Files\DTrace.
set PATH=%PATH%;"C:\Program Files\DTrace"
- Povolte na počítači DTrace pomocí příkazu bcdedit.
bcdedit /set dtrace ON
Když aktualizujete na nový build Windows Insider, budete muset znovu nastavit možnost dtrace bcdedit.
Poznámka:
Pokud používáte BitLocker, zakažte ho při provádění změn spouštěcích hodnot. Pokud to neuděláte, může se zobrazit výzva k zadání obnovovacího klíče BitLockeru. Jedním ze způsobů, jak se z této situace zotavit, je spustit do konzoly pro zotavení a obnovit hodnotu bcdedit, bcdedit /set {default} dtrace on. Pokud aktualizace operačního systému odebrala hodnotu a vy jste ji přidali, obnovte operační systém tak, že pomocí bcdedit hodnotu odeberete bcdedit /deletevalue {default} dtrace. Potom zakažte nástroj BitLocker a znovu povolte dtrace. bcdedit /set dtrace ON
Konfigurujte VSM (virtuální zabezpečený režim) na stroji pro povolení trasování hranic funkcí jádra (FBT) nastavením "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\EnableVirtualizationBasedSecurity" na hodnotu 1 pro povolení VSM a Zabezpečeného jádra.
K tomu použijte příkaz REG Add, například takto:
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\ /v EnableVirtualizationBasedSecurity /t REG_DWORD /d 1
Nějaký příkaz DTrace používá symboly Windows. Pokud chcete použít symboly Windows, vytvořte adresář symbolů a nastavte cestu symbolů:
mkdir c:\symbols
set _NT_SYMBOL_PATH=srv*C:\symbols*https://msdl.microsoft.com/download/symbols
Další informace o cestách symbolů naleznete v tématu Cesta symbolů pro ladicí programy systému Windows.
Použití DTrace uvnitř virtuálního počítače
Pokud na virtuálním počítači spouštíte DTrace, pomocí následujícího příkazu PowerShellu zapněte vnořenou virtualizaci na počítači podporujícím virtuální počítač.
<VMName> Zadejte virtuální počítač, ve kterém běží DTrace. Otevřete Windows v PowerShellu jako správce.
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
Restartujte počítač podporující virtuální počítač.
Ověření instalace DTrace
Pomocí možnosti -l zobrazíte seznam aktivních sond. Pokud je DTrace aktivní, musí být uvedeno mnoho sond pro události ETW a systémové události.
Otevřete příkazový řádek systému Windows jako správce a zadejte příkazy 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
...
Pokud jsou uvedené pouze tyto tři sondy, dojde k problému s načtením ovladače DTrace.sys.
C:\> dtrace -l
ID PROVIDER MODULE FUNCTION NAME
1 dtrace BEGIN
2 dtrace END
3 dtrace ERROR
Začínáme s DTrace – příkazy s jedním řádkem
Začněte spuštěním těchto příkazů z příkazového řádku správce.
Tento příkaz zobrazí souhrn systémových volání podle programu na 5 sekund. Parametr tick-5sec určuje časové období. exit(0); způsobí, že se příkaz po dokončení vrátí na příkazový řádek. Výstup se zadává pomocí funkce [pid,execname] = count(); Toto zobrazuje ID procesu (PID), název spustitelného souboru a počet za posledních 5 sekund.
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
...
Tento příkaz shrnuje volání nastavení/zrušení časovače po dobu 3 sekund:
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
...
Příkazy s jedním řádkem, které používají symboly
Tento příkaz využívá symboly Windows a vyžaduje, aby byla cesta symbolu nastavená podle postupu v části instalace. Jak už bylo zmíněno dříve v instalaci, vytvořte adresář a nastavte cestu symbolu pomocí těchto příkazů.
C:\> mkdir c:\symbols
C:\> set _NT_SYMBOL_PATH=srv*C:\symbols*https://msdl.microsoft.com/download/symbols
Tento ukázkový příkaz zobrazí hlavní funkce 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
Tento příkaz vypíše strukturu jádra s názvem 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 ]
}
}
Tento příkaz zobrazí aktuální stav zásobníku jádra za posledních 10 sekund.
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
...
Tento příkaz zobrazí horní moduly vyvolané notepad.exe během spuštění. Možnost -c spustí zadaný příkaz (notepad.exe) a po dokončení se ukončí.
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