DTrace Windows rendszeren

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.

  1. 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.
  2. Válassza a Javaslat vagya Probléma jelentése lehetőséget.
  3. 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 Windows architektúrát bemutató diagram, ahol a dtrace.exe a libtrace-hez csatlakozik, amely kommunikál a DTrace.sys-gyel, és meghívja a Traceext.sys-t.

A DTrace telepítése Windows rendszeren

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

  2. Töltse le az MSI telepítőfájlt (DTrace letöltése Windows rendszeren) a Microsoft Letöltőközpontból.

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

  4. 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"
  1. 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

Lásd még