Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A DTrace (DTrace.exe) egy parancssori eszköz, amely rendszerinformációkat és eseményeket jelenít meg. A DTrace egy nyílt forráskódú nyomkövetési platform, amelyet a Windows portolt. A DTrace-t eredetileg a Solaris operációs rendszerhez fejlesztették ki. Dinamikus instrumentálást biztosít mind a felhasználói, mind a kernel függvényekhez, a D-nyelvvel végzett szkripteléshez és a spekulatív nyomkövetéshez. A DTrace emellett Windows operációs rendszer specifikus kiterjesztésekkel is rendelkezik, például az ETW-instrumentációval, az ETW-eseménygenerálással, a rendszerhívási próbákkal és az élő memóriakép rögzítési lehetőségekkel.
Megjegyzés:
A DTrace az 18980-es és a Windows Server 18975-ös build után támogatott a Windows Insider-buildjeiben.
A Windows GitHub DTrace webhelye itt található:
https://github.com/microsoft/DTrace-on-Windows
DTrace-információk megnyitása
A DTrace-ről a Cambridge-i Egyetem OpenDTrace Specification 1.0-s verziójában talál részletes információt.
Az elsődleges GitHub-webhely a következő helyen https://github.com/opendtrace/található: .
Hasznos szkriptek halmaza érhető el a következő helyen https://github.com/opendtrace/toolkit: .
Számos DTrace-könyv érhető el, például:
DTrace: Dinamikus nyomkövetés az Oracle Solaris, a Mac OS X és a FreeBSD rendszeren írta Brendan Gregg és Jim Mauro
Solaris teljesítmény és eszközök: DTrace és MDB technikák Solaris 10-hez és OpenSolaris-hoz Richard McDougall, Jim Mauro és Brendan Gregg könyve
Visszajelzés küldése a Windows DTrace-ről
A Visszajelzési központ segítségével új funkciókat kérhet le, vagy jelentheti a Windows DTrace-rel kapcsolatos problémákat vagy hibákat.
- A Visszajelzési központ Windows rendszerben való elindításához nyissa meg a keresést, írja be a visszajelzés szót, majd válassza a Visszajelzési központ lehetőséget.
- Válassza a Javaslat vagya Probléma jelentése lehetőséget.
- Adja meg a probléma vagy javaslat részletes, konkrét leírását.
DTrace Windows-bővítmények
Az alábbiakban néhány, a Windowson elérhető Dtrace-szolgáltatót és azok eszközét is bemutatjuk.
syscall – NTOS rendszerhívások.
fbt (Function Boundary Tracing) – Kernel függvénybejegyzés és visszatérés.
pid (Folyamatazonosító) – Felhasználói módú folyamatkövetés. A kernel módú FBT-hez hasonlóan, de lehetővé teszi tetszőleges függvényeltolások rendszerezését is.
etw (Eseménykövetés a Windowshoz) – Lehetővé teszi a mintavételek meghatározását az ETW-hez. Ez a szolgáltató segít kihasználni a DTrace meglévő operációsrendszer-instrumentációját.
SYSCALL – NTOS rendszerhívások
A SYSCALL egy pár mintavételt biztosít minden rendszerhíváshoz: egy belépési mintavételt, amely a rendszerhívás beírása előtt aktiválódik, és egy visszatérési mintavételt, amely a rendszerhívás befejezése után aktiválódik, de mielőtt a vezérlés visszakerül a felhasználói szintre. Az összes SYSCALL-mintavétel esetében a függvény neve a rendszerhívás neve, a modul neve pedig az a modul, amelyben a függvény létezik. A SYSCALL-szolgáltató által megadott rendszerhívások nevei a parancssorból a parancs dtrace.exe -l -P syscall beírásával találhatók. Vegye figyelembe, hogy a szonda neve kisbetűs syscall. A parancs dtrace -ln syscall::: a syscall szolgáltatótól elérhető összes mintavételt és paramétert is listázni fogja.
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
...
Vegye figyelembe, hogy ezekben a példákban nem minden képernyőkimenet jelenik meg. "..." csonkolt kimenet ábrázolására szolgál.
Ha végig szeretné görgetni a kimenetet, lépjen ki a következőhöz hasonló parancsra :
dtrace -ln syscall:::|more
Adja hozzá a v lehetőséget a rendelkezésre álló syscall-mintavételekkel kapcsolatos további információk megjelenítéséhez.
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
A DTrace támogatja a meglévő nyilvántartott/naplózott ETW-szondákat. Az ETW-eseményeket szinkron módon is rendszerezheti, szűrheti és elemezheti az eseményégetéskor. A DTrace emellett különböző események/rendszerállapotok kombinálására is használható, hogy konszolidált kimeneti adatfolyamot biztosítson az összetett hibahelyzetek hibakereséséhez.
A parancs dtrace -ln etw::: felsorolja a syscall szolgáltatótól elérhető összes mintavételt és azok paramétereit.
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
...
További információ: DTrace ETW.
Függvényhatár-nyomkövetés (FBT)
A Függvényhatár-nyomkövetés (FBT) szolgáltató a Windows kernel legtöbb függvényének bejegyzéséhez és visszatéréséhez társított mintavételeket biztosít. A függvény a programszöveg alapvető egysége. A többi DTrace-szolgáltatóhoz hasonlóan az FBT-nek nincs mintavételi hatása, ha nincs explicit módon engedélyezve. Ha engedélyezve van, az FBT csak mintavételes effektust indukál a mintavételezett függvényekben. Az FBT x86 és x64 platformokon lett implementálva.
Minden utasításkészlethez tartozik néhány olyan függvény, amely nem hív meg más függvényeket, és amelyeket a fordító nagyon optimalizál – ezek az úgynevezett levélfüggvények –, amelyekbe az FBT nem tud beavatkozni. Ezekhez a függvényekhez tartozó szondák nem érhetők el a DTrace-ben.
A parancs dtrace -ln fbt:nt:: felsorolja az nt modulhoz elérhető összes mintavételt és paramétert. A hibakereső lm (List Loaded Modules) paranccsal listázhatja az összes elérhető modult.
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
...
Megjegyzés:
Mivel több ezer hívás érhető el az nt-ben, nem lenne jó ötlet üresen hagyni a függvény nevét egy olyan DTrace-parancs futtatásakor, amely adatokat naplóz. A lehetséges teljesítményhatás elkerülésére javasolt módszer a függvénynév legalább egy részének megadása, például fbt:nt:*Timer*:entrya .
folyamatazonosító
A DTrace PID-szolgáltató lehetővé teszi a felhasználói módú folyamatok, például webböngészők vagy adatbázisok belső végrehajtásának nyomon követését. A DTrace-et a folyamat indításakor is csatolhatja a folyamatindítási problémák hibakereséséhez. A PID-definíció részeként adja meg a folyamatban definiált függvényeket és a függvényen belüli konkrét eltolásokat (vagy az összes eltolást a * karakterrel). A PID-szolgáltató megköveteli a bináris elindítását vagy futtatását a szkript végrehajtásakor.
Ez a példaparancs egy adott hívással kapcsolatos információkat jelenít meg a notepad.exetársított PID-ben. A hibakereső lm (List Loaded Modules) paranccsal listázhatja az összes elérhető modult.
C:\Windows\system32>dtrace -ln "pid$target:ntdll:RtlAllocateHeap:entry" -c notepad.exe
ID PROVIDER MODULE FUNCTION NAME
5102 pid6100 ntdll RtlAllocateHeap entry
Megjegyzés:
A C++-ban írt függvények nyomon követésekor előfordulhat, hogy a függvénynevek túl hosszúak vagy díszítve lesznek ahhoz, hogy mintavételként meg legyenek adva a teljes formájukkal. Gyakori megoldás egy olyan kifejezés használata, amely egyedileg megfelel a célfüggvénynek. Használja például a 'String??Copy' kifejezést a 'probefunc' részeként a 'String::Copy()' és a '*GetPinnableReference' a 'String::GetPinnableReference()' metódusokhoz való illeszkedéshez.
DTrace Windows-architektúra
A felhasználók a DTrace parancson keresztül kommunikálnak a DTrace-lel, amely a DTrace motor előtérként szolgál. A D-szkriptek egy köztes formátumba (DIF) lesznek lefordítva a felhasználói térben, és végrehajtás céljából a DTrace kernel összetevőjéhez kerülnek, más néven DIF virtuális gépként. Ez a dtrace.sys illesztőprogramban fut.
Traceext.sys (nyomkövetési bővítmény) egy Windows kernelbővítmény-illesztő, amely lehetővé teszi a Windows számára, hogy olyan funkciókat tegyen elérhetővé, amelyekre a DTrace támaszkodik a nyomkövetés biztosításához. A Windows kernel a veremkezelés vagy a memóriahozzáférés során meghívásokat biztosít, amelyeket aztán a nyomonkövetési kiterjesztés hajt végre.
A DTrace telepítése Windows rendszeren
Ellenőrizze, hogy a Windows támogatott verzióját futtatja-e. A DTrace jelenlegi letöltését az 18980-es és a Windows Server 18975-ös build után a 20H1-es Windows Insider-buildek támogatják. A DTrace ezen verziójának telepítése a Windows régebbi verzióira a rendszer instabilitásához vezethet, ezért nem ajánlott. (A DTrace 19H1-es archivált verziója már nem érhető el, és már nem támogatott.)
Töltse le az MSI telepítőfájlt (DTrace letöltése Windows rendszeren) a Microsoft Letöltőközpontból.
Válassza a Teljes telepítés lehetőséget.
Fontos
Mielőtt a bcdedit használatával megváltoztatja a rendszerindítási információkat, előfordulhat, hogy ideiglenesen fel kell függesztenie a Windows biztonsági funkcióit, például a Patchguardot, a BitLockert és a biztonságos rendszerindítást a tesztszámítógépen. Ha a tesztelés befejeződött, és megfelelően kezeli a tesztszámítógépet, a biztonsági funkciók letiltásakor engedélyezze újra ezeket a biztonsági funkciókat.
Frissítse a PATH környezeti változót úgy, hogy tartalmazza a C:\Program Files\DTrace fájlt
set PATH=%PATH%;"C:\Program Files\DTrace"
- Engedélyezze a DTrace-t a gépen a bcdedit paranccsal.
bcdedit /set dtrace ON
Amikor egy új Windows Insider-buildre frissít, újra be kell állítania a dtrace bcdedit lehetőséget.
Megjegyzés:
Ha BitLockert használ, tiltsa le a rendszerindítási értékek módosításakor. Ha ezt nem teszi meg, a rendszer kérheti a BitLocker helyreállítási kulcsának megadását. A helyzet helyreállításának egyik módja a helyreállítási konzolra való indítás és a bcdedit érték visszaállítása. bcdedit /set {default} dtrace on Ha egy operációsrendszer-frissítés eltávolította az értéket, majd Ön visszahelyezte azt, az operációs rendszer helyreállításához használja a bcdedit parancsot az érték eltávolítására. bcdedit /deletevalue {default} dtrace Ezután tiltsa le a BitLockert, és engedélyezze újra a dtrace-t. bcdedit /set dtrace ON
Konfigurálja a VSM-et (virtuális biztonságos módot) a rendszermagfüggvény-határkövetés (FBT) engedélyezéséhez úgy, hogy a "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\EnableVirtualizationBasedSecurity" beállítást 1-re állítja be, ezzel engedélyezve a VSM és a Biztonságos Kernel használatát.
Ehhez használja a REG Hozzáadás parancsot a következő módon:
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\ /v EnableVirtualizationBasedSecurity /t REG_DWORD /d 1
Egyes DTrace-parancsok Windows-szimbólumokat használnak. A Windows szimbólumok használatához hozzon létre egy szimbólumkönyvtárat, és állítsa be a szimbólumok elérési útját:
mkdir c:\symbols
set _NT_SYMBOL_PATH=srv*C:\symbols*https://msdl.microsoft.com/download/symbols
A szimbólumok elérési útjáról további információt a Windows hibakeresőinek szimbólumútvonalában talál.
A DTrace használata virtuális gépen belül
Ha a DTrace-t egy virtuális gépen futtatja, kapcsolja be a beágyazott virtualizálást a virtuális gépet támogató gépen, amikor a virtuális gép leáll, az alábbi PowerShell-paranccsal. Adja meg a <VMName>-t a DTrace-t futtató virtuális géphez. Nyisson meg egy PowerShell-windowst rendszergazdaként.
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
Indítsa újra a virtuális gépet támogató számítógépet.
A DTrace telepítésének ellenőrzése
A -l beállítással listázhatja az aktív mintavételeket. Etw és a rendszeresemények esetében, ha a DTrace aktív, számos szondát kellene felsorolni.
Nyisson meg egy Windows parancssort rendszergazdaként a DTrace-parancsok megadásához.
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
...
Ha csak ez a három szonda szerepel a listán, gond van az DTrace.sys illesztőprogram betöltésével.
C:\> dtrace -l
ID PROVIDER MODULE FUNCTION NAME
1 dtrace BEGIN
2 dtrace END
3 dtrace ERROR
A DTrace használatának első lépései – Egysoros parancsok
Első lépésként futtassa ezeket a parancsokat egy rendszergazdai parancssorból.
Ez a parancs 5 másodpercig jeleníti meg a syscall program szerinti összegzését. A tick-5sec paraméter megadja az időtartamot. Az exit(0) függvény a parancs befejezése után visszatér a parancssorhoz. A kimenetet a [pid,execname] = count(); használatával adjuk meg. Megjeleníti a folyamatazonosítót (PID), a végrehajtható fájl nevét és az események számát az utolsó 5 másodpercben.
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
...
Ez a parancs 3 másodpercig összegzi az időzítő beállítását/a hívások megszakítását:
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
...
Egy vonalparancs, amely szimbólumokat használ
Ezek a parancsok kihasználják a Windows-szimbólumok előnyeit, és megkövetelik, hogy a szimbólum elérési útja a telepítési szakaszban ismertetett módon legyen beállítva. A telepítés során már említettük, hozzon létre egy könyvtárat, és állítsa be a szimbólum elérési útját ezekkel a parancsokkal.
C:\> mkdir c:\symbols
C:\> set _NT_SYMBOL_PATH=srv*C:\symbols*https://msdl.microsoft.com/download/symbols
Ez a példaparancs a legfontosabb NT-függvényeket jeleníti meg.
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
Ez a parancs kiírja a SystemProcess kernel struktúráját.
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 ]
}
}
Ez a parancs megjeleníti a kernel verem legmagasabb részét az elmúlt 10 másodpercben.
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
...
Ez a parancs megjeleníti a notepad.exe által az indítás során meghívott legfontosabb modulokat. A -c beállítás futtatja a megadott parancsot (notepad.exe), és a befejezése után kilép.
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