Sdílet prostřednictvím


DTrace ve Windows

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.

  1. Pokud chcete spustit Centrum Feedback ve Windows, přejděte do vyhledávání, zadejte slovo váš názor a pak vyberte Centrum Feedback.
  2. Vyberte Možnost Navrhnout funkci nebo Nahlásit problém.
  3. 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í.

Diagram znázorňující architekturu systému Windows DTrace s dtrace.exe připojenou k knihovně libtrace, která komunikuje s DTrace.sysa volá Traceext.sys.

Instalace DTrace v systému Windows

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

  2. Stáhněte instalační soubor MSI (Stáhnout DTrace ve Windows) z webu Microsoft Download Center.

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

  4. Aktualizujte proměnnou prostředí PATH tak, aby zahrnovala C:\Program Files\DTrace.

set PATH=%PATH%;"C:\Program Files\DTrace"
  1. 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

Viz také