Udostępnij przez


DTrace w systemie Windows

DTrace (DTrace.exe) to narzędzie wiersza polecenia, które wyświetla informacje o systemie i zdarzenia. DTrace to platforma śledzenia typu open source portowana do systemu Windows. DTrace został pierwotnie opracowany dla systemu operacyjnego Solaris. Zapewnia dynamiczną instrumentację funkcji użytkownika i jądra, możliwość tworzenia skryptów w języku D oraz śledzenie spekulatywne. Ponadto DTrace ma rozszerzenia specyficzne dla systemu operacyjnego Windows, takie jak instrumentacja ETW, generowanie zdarzeń ETW, sondy wywołań systemowych i przechwytywanie zrzutów pamięci w czasie rzeczywistym.

Uwaga / Notatka

Narzędzie DTrace jest obsługiwane w kompilacjach niejawnych systemu Windows po wersji 18980 i Windows Server Build 18975.

Plik DTrace w witrynie GitHub systemu Windows znajduje się tutaj:

https://github.com/microsoft/DTrace-on-Windows

Otwórz informacje DTrace

Aby uzyskać szczegółowe informacje o DTrace, zobacz Specyfikację OpenDTrace w wersji 1.0 na Uniwersytecie w Cambridge.

Podstawowa witryna usługi GitHub znajduje się w lokalizacji https://github.com/opendtrace/.

Zestaw przydatnych skryptów jest dostępny pod adresem https://github.com/opendtrace/toolkit.

Dostępnych jest wiele książek DTrace, takich jak:

DTrace: Śledzenie dynamiczne w Oracle Solaris, Mac OS X i FreeBSD przez Brendan Gregg i Jim Mauro

Wydajność i narzędzia Solarisa: Techniki DTrace i MDB dla Solarisa 10 i OpenSolaris autorstwa Richarda McDougalla, Jima Mauro i Brendana Gregga

Przekazywanie opinii na temat funkcji DTrace systemu Windows

Użyj centrum opinii, aby poprosić o nowe funkcje lub zgłosić wszelkie problemy lub błędy w systemie Windows DTrace.

  1. Aby uruchomić centrum opinii w systemie Windows, przejdź do wyszukiwania, wprowadź słowo opinie, a następnie wybierz pozycję Centrum opinii.
  2. Wybierz pozycję Zaproponuj funkcję lub Zgłoś problem.
  3. Podaj szczegółowy, szczegółowy opis problemu lub sugestii.

Rozszerzenia systemu Windows DTrace

Poniżej przedstawiono niektórych dostawców Dtrace dostępnych w systemie Windows i co one monitorują.

  • syscall — wywołania systemowe NTOS.

  • fbt (Śledzenie granic funkcji) — wpis i zwracanie funkcji jądra.

  • pid (identyfikator procesu) — śledzenie procesów trybu użytkownika. Podobnie jak tryb jądra FBT, ale umożliwia także instrumentację dowolnych przesunięć funkcji.

  • etw (śledzenie zdarzeń dla systemu Windows) — umożliwia definiowanie sond ETW. Ten dostawca pomaga wykorzystać istniejącą instrumentację systemu operacyjnego w DTrace.

SYSCALL — wywołania systemowe NTOS

System SYSCALL udostępnia parę sond dla każdego wywołania systemu: sondę wejściową uruchamianą przed wprowadzeniem wywołania systemu, a sonda powrotna uruchamiana po zakończeniu wywołania systemu, ale przed przeniesieniem kontroli z powrotem na poziom użytkownika. Dla wszystkich sond SYSCALL nazwa funkcji jest ustawiona na nazwę instrumentowanego wywołania systemu, a nazwa modułu to moduł, w którym istnieje funkcja. Nazwy wywołań systemowych podanych przez dostawcę SYSCALL można znaleźć, wpisując polecenie dtrace.exe -l -P syscall w wierszu polecenia. Należy pamiętać, że nazwa sondy ma małe litery syscall. dtrace -ln syscall::: Polecenie wyświetli również listę wszystkich sond i ich parametrów dostępnych u dostawcy 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
...

Zwróć uwagę, że nie wszystkie dane wyjściowe ekranu są wyświetlane w tych przykładach. "..." służy do reprezentowania obciętej danych wyjściowych.

Aby przewinąć dane wyjściowe, użyj polecenia more:

dtrace -ln syscall:::|more

Dodaj opcję -v, aby wyświetlić więcej informacji o dostępnych sondach 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
...

ETW

Narzędzie DTrace obejmuje obsługę istniejących manifestowanych/tracelogged sond ETW. Zdarzenia ETW można rejestrować, filtrować i parsować synchronicznie w momencie uruchomienia zdarzeń. Ponadto narzędzie DTrace może służyć do łączenia różnych zdarzeń/stanów systemu w celu zapewnienia skonsolidowanego strumienia danych wyjściowych w celu ułatwienia debugowania złożonych sytuacji błędów.

dtrace -ln etw::: Polecenie wyświetli listę wszystkich sond i ich parametrów dostępnych u dostawcy 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
  ...

Aby uzyskać więcej informacji, zobacz DTrace ETW.

Śledzenie granic funkcji (FBT)

Dostawca śledzenia granic funkcji (FBT) udostępnia sondy związane z wejściem do większości funkcji i powrotem z nich w jądrze systemu Windows. Funkcja jest podstawową jednostką tekstu programu. Podobnie jak inni dostawcy DTrace, FBT nie ma efektu sondy, gdy nie jest jawnie włączony. Po włączeniu funkcja FBT wywołuje tylko efekt sondy w funkcjach sondowanych. FBT zostało zaimplementowane na platformach x86 i x64.

Dla każdego zestawu instrukcji istnieje niewielka liczba funkcji, które nie wywołuje innych funkcji i są wysoce zoptymalizowane przez kompilator (tzw funkcje liścia), których nie można instrumentować przez FBT. Sondy dla tych funkcji nie są obecne w DTrace.

dtrace -ln fbt:nt:: Polecenie wyświetli listę wszystkich sond i ich parametrów dostępnych dla modułu nt. Użyj polecenia lm debugera (List Loaded Modules), aby wyświetlić listę wszystkich dostępnych modułów.

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

Uwaga / Notatka

Ponieważ w nt są dostępne tysiące wywołań, nie byłoby dobrym pomysłem, aby pozostawić nazwę funkcji pustą podczas uruchamiania polecenia DTrace, które rejestruje dane. Zalecaną metodą uniknięcia możliwego wpływu na wydajność jest określenie co najmniej części nazwy funkcji, takiej jak fbt:nt:*Timer*:entry.

identyfikator PID

Dostawca DTrace PID umożliwia śledzenie wewnętrznego wykonywania procesów trybu użytkownika, takich jak przeglądarka internetowa lub baza danych. Możesz również załączyć DTrace przy starcie procesu, aby debugować problemy z jego uruchamianiem. W ramach definicji PID można określić funkcje zdefiniowane w procesie i określone przesunięcia (lub wszystkie przesunięcia przy użyciu symbolu wieloznakowego *) w funkcji. Dostawca PID wymaga, aby plik binarny był uruchomiony lub działał w momencie wykonywania skryptu.

To przykładowe polecenie wyświetla informacje o określonym wywołaniu w identyfikatorze PID skojarzonym z notepad.exe. Użyj polecenia lm debugera (List Loaded Modules), aby wyświetlić listę wszystkich dostępnych modułów.

C:\Windows\system32>dtrace -ln "pid$target:ntdll:RtlAllocateHeap:entry" -c notepad.exe
   ID   PROVIDER            MODULE                          FUNCTION NAME
 5102    pid6100             ntdll                   RtlAllocateHeap entry

Uwaga / Notatka

Podczas śledzenia funkcji napisanych w języku C++, nazwy funkcji mogą być zbyt długie lub przekształcone, aby być określone jako sondy w swojej pełnej formie. Typowym rozwiązaniem jest użycie wyrażenia, które jest unikatowo zgodne z funkcją docelową. Na przykład użyj 'String??Copy' jako części probefunc nazwy sondy, aby dopasować 'String::Copy()', lub '*GetPinnableReference', aby dopasować 'String::GetPinnableReference()'.

Architektura DTrace systemu Windows

Użytkownicy korzystają z DTrace za pośrednictwem polecenia DTrace, które służy jako interfejs do silnika DTrace. Skrypty D są kompilowane do formatu pośredniego (DIF) w przestrzeni użytkownika i wysyłane do składnika jądra DTrace do wykonania, czasami nazywanej maszyną wirtualną DIF. Jest to uruchamiane w sterowniku dtrace.sys.

Traceext.sys (rozszerzenie śledzenia) to sterownik rozszerzenia jądra systemu Windows, który umożliwia systemowi Windows udostępnianie funkcjonalności, z których korzysta DTrace do zapewnienia śledzenia. Jądro systemu Windows zapewnia wywołania zwrotne podczas przeglądu stosu lub dostępu do pamięci, które następnie są implementowane przez rozszerzenie śledzenia.

Diagram przedstawiający architekturę systemu Windows DTrace z dtrace.exe połączonym z biblioteką libtrace, która komunikuje się z DTrace.sysi wywołuje Traceext.sys.

Instalowanie narzędzia DTrace w systemie Windows

  1. Sprawdź, czy korzystasz z obsługiwanej wersji systemu Windows. Bieżące pobieranie narzędzia DTrace jest obsługiwane w kompilacjach niejawnych systemu Windows 20H1 po wersji 18980 i Windows Server Build 18975. Zainstalowanie tej wersji narzędzia DTrace w starszych wersjach systemu Windows może prowadzić do niestabilności systemu i nie jest zalecane. (Zarchiwizowana wersja DTrace dla wersji 19H1 nie jest już dostępna i nie jest już obsługiwana).

  2. Pobierz plik instalacyjny MSI (pobierz plik DTrace w systemie Windows) z Centrum pobierania Microsoft.

  3. Wybierz pozycję Ukończ instalację.

    Ważne

    Przed użyciem bcdedit do zmiany informacji rozruchowych może być konieczne tymczasowe zawieszenie funkcji zabezpieczeń systemu Windows, takich jak Patchguard, BitLocker i Bezpieczny rozruch na komputerze testowym. Włącz ponownie te funkcje zabezpieczeń podczas testowania i odpowiednio zarządzaj komputerem testowym, gdy funkcje zabezpieczeń są wyłączone.

  4. Zaktualizuj zmienną środowiskową PATH tak, aby zawierała C:\Program Files\DTrace

set PATH=%PATH%;"C:\Program Files\DTrace"
  1. Włącz funkcję DTrace na maszynie przy użyciu polecenia bcdedit.
bcdedit /set dtrace ON

Po zaktualizowaniu do nowej wersji Windows Insider należy ponownie ustawić opcję dtrace bcdedit.

Uwaga / Notatka

Jeśli używasz funkcji BitLocker, wyłącz ją podczas wprowadzania zmian w wartościach rozruchu. Jeśli tego nie zrobisz, może zostać wyświetlony monit o podanie klucza odzyskiwania funkcji BitLocker. Jednym ze sposobów odzyskiwania po tej sytuacji jest uruchomienie konsoli odzyskiwania i przywrócenie wartości bcdedit, bcdedit /set {default} dtrace on. Jeśli aktualizacja systemu operacyjnego usunęła wartość, a ty ją ponownie dodałeś, aby odzyskać system operacyjny, użyj bcdedit, aby usunąć wartość bcdedit /deletevalue {default} dtrace. Następnie wyłącz funkcję BitLocker i ponownie włącz funkcję dtrace, bcdedit /set dtrace ON.

Skonfiguruj program VSM (wirtualny tryb bezpieczny) na maszynie w celu włączenia śledzenia granic funkcji jądra (FBT), ustawiając wartość "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\EnableVirtualizationBasedSecurity" na wartość 1, aby włączyć program VSM i bezpieczne jądro.

Aby to zrobić, użyj polecenia REG Add, w następujący sposób:

REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\ /v EnableVirtualizationBasedSecurity /t REG_DWORD /d 1

Niektóre polecenia DTrace używają symboli systemu Windows. Aby użyć symboli systemu Windows, utwórz katalog symboli i ustaw ścieżkę symboli:

mkdir c:\symbols
set _NT_SYMBOL_PATH=srv*C:\symbols*https://msdl.microsoft.com/download/symbols

Aby uzyskać więcej informacji na temat ścieżek symboli, zobacz Ścieżka symboli dla debugerów systemu Windows.

Używanie funkcji DTrace wewnątrz maszyny wirtualnej

Jeśli na maszynie wirtualnej jest uruchomiona funkcja DTrace, włącz wirtualizację zagnieżdżona na maszynie obsługującej maszynę wirtualną, gdy maszyna wirtualna zostanie zatrzymana, używając następującego polecenia programu PowerShell. Podaj maszynę wirtualną <VMName>, w której uruchomiony jest DTrace. Otwórz okno programu PowerShell jako administrator.

Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true

Uruchom ponownie komputer obsługujący maszynę wirtualną.

Weryfikowanie instalacji narzędzia DTrace

Użyj opcji -l, aby wyświetlić listę aktywnych sond. Jeśli funkcja DTrace jest aktywna, wiele sond zostanie wyświetlonych dla zdarzeń etw i systemowych.

Otwórz wiersz polecenia systemu Windows jako administrator, aby wprowadzić polecenia 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

...

Jeśli na liście znajdują się tylko te trzy sondy, oznacza to problem z załadowaniem sterownika DTrace.sys.

C:\>  dtrace -l
   ID   PROVIDER            MODULE                          FUNCTION NAME
    1     dtrace                                                     BEGIN
    2     dtrace                                                     END
    3     dtrace                                                     ERROR

Wprowadzenie do DTrace — jednowierszowe polecenia

Rozpocznij pracę, uruchamiając te polecenia z poziomu wiersza polecenia administratora.

To polecenie wyświetla podsumowanie wywołań systemowych według programu na 5 sekund. Parametr tick-5sec określa okres. Polecenie exit(0); powoduje zakończenie działania i powrót do wiersza polecenia po jego wykonaniu. Dane wyjściowe są określane przy użyciu [pid,execname] = count(); polecenia Ten wyświetla identyfikator procesu (PID), nazwę pliku wykonywalnego i liczbę z ostatnich 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
...

To polecenie podsumowuje wywołania ustawienia/anulowania czasomierza dla 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
...  

Jednowierszowe polecenia używające symboli

To polecenie korzysta z symboli systemu Windows i wymaga, aby ścieżka symboli została ustawiona zgodnie z opisem w sekcji instalacji. Jak wspomniano wcześniej w instalacji, utwórz katalog i ustaw ścieżkę symboli przy użyciu tych poleceń.

C:\> mkdir c:\symbols
C:\> set _NT_SYMBOL_PATH=srv*C:\symbols*https://msdl.microsoft.com/download/symbols

To przykładowe polecenie wyświetla najważniejsze funkcje 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

To polecenie zrzutuje strukturę jądra 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 ]
    }
}

To polecenie wyświetla górny stos jądra w ciągu ostatnich 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
...

To polecenie wyświetla najważniejsze moduły wywoływane przez notepad.exe podczas uruchamiania. Opcja -c uruchamia określone polecenie (notepad.exe) i kończy się po zakończeniu.

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

Zobacz także