Aracılığıyla paylaş


Windows'da DTrace

DTrace (DTrace.exe), sistem bilgilerini ve olaylarını görüntüleyen bir komut satırı aracıdır. DTrace, Windows'a taşınabilir bir açık kaynak izleme platformudur. DTrace başlangıçta Solaris işletim sistemi için geliştirilmiştir. Hem kullanıcı/çekirdek işlevlerinin dinamik izlemesini, D dilini kullanarak betik oluşturma özelliğini hem de tahmini izlemeyi sağlar. Ayrıca, DTrace'de ETW enstrümantasyonu, ETW olay oluşturma, sistem çağrı sondalamaları ve canlı döküm yakalama özellikleri gibi Windows işletim sistemine özgü uzantılar bulunur.

Uyarı

DTrace, Sürüm 18980 ve Windows Server Derlemesi 18975'in ardından Windows'un Insider derlemelerinde desteklenir.

Windows GitHub sitesindeki DTrace burada bulunur:

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

DTrace Bilgilerini Açma

DTrace hakkında ayrıntılı bilgi için University Of Cambridge'de OpenDTrace Specification sürüm 1.0'a bakın.

Birincil GitHub sitesi konumundadır https://github.com/opendtrace/.

https://github.com/opendtrace/toolkit adresinde yararlı betikler bulunur.

Aşağıda gösterildiği gibi bir dizi DTrace kitabı mevcuttur:

DTrace: Oracle Solaris, Mac OS X ve FreeBSD'de Dinamik İzleme Brendan Gregg ve Jim Mauro

Solaris Performans ve Araçları: Solaris 10 ve OpenSolaris için DTrace ve MDB Teknikleri Richard McDougall, Jim Mauro ve Brendan Gregg tarafından

Windows DTrace hakkında geri bildirim sağlama

Yeni özellikler istemek veya Windows DTrace ile ilgili sorunları veya hataları bildirmek için Geri Bildirim Merkezi'ni kullanın.

  1. Windows'da Geri Bildirim Merkezi'ni başlatmak için Aramaya gidin, geri bildirim sözcüğünü girin ve Geri Bildirim Merkezi'ni seçin.
  2. Özellik önerin veya Sorun bildirin'i seçin.
  3. Sorunun ayrıntılı, belirli bir açıklamasını veya önerisini sağlayın.

DTrace Windows Uzantıları

Aşağıda, Windows'ta kullanılabilen Dtrace sağlayıcılarından bazıları ve neleri kullandıkları belirtilmiştir.

  • syscall – NTOS sistem çağrıları.

  • fbt (İşlev Sınırı İzleme) – Çekirdek işlevi giriş ve çıkışları.

  • pid (İşlem Kimliği) – Kullanıcı modu işlem izleme. Çekirdek modu FBT gibi, ama aynı zamanda rastgele işlev kaydırmalarının enstrümantasyonuna da izin verir.

  • etw (Windows için Olay İzleme) – ETW için yoklamaların tanımlanmasına izin verir. Bu sağlayıcı, DTrace'te mevcut işletim sistemi araçlarından yararlanmaya yardımcı olur.

SYSCALL – NTOS sistem çağrıları

SYSCALL, her sistem çağrısı için bir çift yoklama sağlar: sistem çağrısı girilmeden önce tetiklenen bir giriş yoklaması ve sistem çağrısı tamamlandıktan sonra ancak denetim kullanıcı düzeyine geri aktarilmeden önce tetiklenen bir dönüş yoklaması. Tüm SYSCALL yoklamaları için işlev adı, izlemeli sistem çağrısının adı olarak ayarlanır ve modül adı işlevin bulunduğu modüldür. SYSCALL sağlayıcısı tarafından sağlanan sistem çağrılarının adları, komut isteminden komutu dtrace.exe -l -P syscall yazarak bulunabilir. Prob adının küçük harfle yazılan syscall olduğunu unutmayın. Komut dtrace -ln syscall::: ayrıca syscall sağlayıcısından kullanılabilen tüm yoklamaları ve parametrelerini de listeler.

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

Tüm ekran çıkışının bu örneklerde gösterilmediğini unutmayın. "..." kesilmiş çıkışı temsil etmek için kullanılır.

Çıktıyı kaydırmak için aşağıdaki gibi daha fazla komutu kullanın:

dtrace -ln syscall:::|more

Kullanılabilir syscall yoklamaları hakkında daha fazla bilgi görüntülemek için v seçeneğini ekleyin.

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

DTrace, mevcut bildirimli/izlenmiş ETW yoklamaları için destek içerir. ETW olaylarını olay tetiklenirken eşzamanlı olarak filtreleyebilir, ayrıştırabilir ve izleyebilirsiniz. Ayrıca DTrace, karmaşık hata durumlarında hata ayıklamaya yardımcı olmak üzere birleştirilmiş bir çıkış akışı sağlamak üzere çeşitli olayları/sistem durumlarını birleştirmek için kullanılabilir.

komutu dtrace -ln etw::: , syscall sağlayıcısından kullanılabilen tüm yoklamaları ve parametrelerini listeler.

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

Daha fazla bilgi için bkz. DTrace ETW.

İşlev Sınırı İzleme (FBT)

İşlev Sınır İzleme (FBT) sağlayıcısı, Windows çekirdeğindeki çoğu işleve giriş ve çıkışla ilişkili sondalar sağlar. işlevi, program metninin temel birimidir. Diğer DTrace sağlayıcılarına benzer şekilde, FBT açıkça etkinleştirilmediğinde yoklama etkisine sahip değildir. Etkinleştirildiğinde, FBT yalnızca yoklanan işlevlerde bir yoklama etkisine neden olur. FBT, x86 ve x64 platformlarında uygulanmıştır.

Her komut seti için, diğer fonksiyonları çağırmayan ve derleyici tarafından yüksek düzeyde optimize edilmiş, FBT ile izlenemeyen az sayıda fonksiyon (bunlar yaprak fonksiyonlar olarak adlandırılır) vardır. Bu işlevler için yoklamalar DTrace'te mevcut değildir.

komutu dtrace -ln fbt:nt:: , nt modülü için kullanılabilen tüm yoklamaları ve parametrelerini listeler. Tüm kullanılabilir modülleri listelemek için hata ayıklayıcı lm (Yüklenen Modülleri Listele) komutunu kullanın.

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

Uyarı

Nt'de binlerce çağrı olduğundan, verileri günlüğe kaydeden bir DTrace komutu çalıştırırken işlev adını boş bırakmak iyi bir fikir değildir. Olası bir performans etkisinden kaçınmak için önerilen yaklaşım, işlev adının en az bir kısmını (gibi) fbt:nt:*Timer*:entrybelirtmektir.

PID

DTrace PID sağlayıcısı, web tarayıcısı veya veritabanı gibi kullanıcı modu işlemlerinin iç yürütmesini izlemenizi sağlar. İşlem başlatma sorunlarının hatalarını ayıklamak için işlem başlatma sırasında DTrace de ekleyebilirsiniz. PID tanımının bir parçası olarak, süreçte tanımlanan işlevleri ve işlevin içindeki belirli ofsetleri (ya da * joker karakteriyle tüm ofsetleri) belirtirsiniz. PID sağlayıcısı, betik yürütme sırasında ikilinin başlatılmasını veya çalıştırılmasını gerektirir.

Bu örnek komut, notepad.exeile ilişkilendirilmiş PID'de belirli bir çağrı hakkındaki bilgileri görüntüler. Tüm kullanılabilir modülleri listelemek için hata ayıklayıcı lm (Yüklenen Modülleri Listele) komutunu kullanın.

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

Uyarı

C++ ile yazılan işlevleri izlediğinizde, işlev adları tam biçimleriyle bir yoklama olarak belirtilemeyecek kadar uzun veya süslü olabilir. Yaygın bir çözüm, hedef işlevinizle benzersiz bir şekilde eşleşen bir ifade kullanmaktır. Örneğin, 'String??Copy' adını 'String::Copy()' ile eşleştirmek için yoklama adının 'probefunc' bölümü olarak veya 'String::GetPinnableReference()' ile eşleştirmek için '*GetPinnableReference' olarak kullanın.

DTrace Windows mimarisi

Kullanıcılar DTrace altyapısının ön ucu olarak görev yapan DTrace komutu aracılığıyla DTrace ile etkileşim kurar. Kullanıcı alanında derlenerek bir ara biçime (DIF) dönüşen D betikleri, yürütülmek üzere DTrace çekirdek bileşenine gönderilir ve bazen DIF Sanal Makinesi olarak adlandırılır. Bu, dtrace.sys sürücüsünde çalışır.

Traceext.sys (izleme uzantısı), Windows'un DTrace'in izleme sağlamak için bağlı olduğu işlevselliği kullanıma sunmasına olanak tanıyan bir Windows çekirdek uzantısı sürücüsüdür. Windows çekirdeği, stackwalk veya bellek erişimleri sırasında geri aramalar sağlar ve bunlar daha sonra izleme genişletmesi tarafından uygulanır.

DTrace.sysile iletişim kuran ve Traceext.sysçağıran, libtrace'e bağlı dtrace.exe ile DTrace Windows Mimarisi'ni gösteren diyagram.

Windows altında DTrace'i yükleme

  1. Windows'un desteklenen bir sürümünü çalıştırdığınızı denetleyin. DTrace'in geçerli indirmesi, sürüm 18980 ve Windows Server Derlemesi 18975'in ardından 20H1 Windows'un Insider derlemelerinde desteklenir. DTrace'in bu sürümünün Windows'un eski sürümlerine yüklenmesi sistem kararlılığının oluşmasına neden olabilir ve önerilmez. (19H1 için DTrace'in arşivlenmiş sürümü artık kullanılamıyor ve artık desteklenmiyor.)

  2. MSI yükleme dosyasını (Windows'da DTrace'i İndir) Microsoft İndirme Merkezi'nden indirin.

  3. Yüklemeyi tamamla'yı seçin.

    Önemli

    Önyükleme bilgilerini değiştirmek için bcdedit'i kullanmadan önce test bilgisayarında Patchguard, BitLocker ve Secure Boot gibi Windows güvenlik özelliklerini geçici olarak askıya almanız gerekebilir. Test tamamlandığında bu güvenlik özelliklerini yeniden etkinleştirin ve güvenlik özellikleri devre dışı bırakıldığında test bilgisayarını uygun şekilde yönetin.

  4. PATH ortam değişkenini C:\Program Files\DTrace içerecek şekilde güncelleştirin

set PATH=%PATH%;"C:\Program Files\DTrace"
  1. bcdedit komutunu kullanarak makinede DTrace'i etkinleştirin.
bcdedit /set dtrace ON

Yeni bir Windows Insider derlemesine güncelleştirdiğinizde dtrace bcdedit seçeneğini yeniden ayarlamanız gerekir.

Uyarı

BitLocker kullanıyorsanız, önyükleme değerlerinde değişiklik yaparken devre dışı bırakın. Bunu yapmazsanız BitLocker kurtarma anahtarı istenebilir. Bu durumdan kurtarmanın bir yolu kurtarma konsoluna önyükleme yapmak ve bcdedit değerini bcdedit /set {default} dtrace ongeri yüklemektir. bir işletim sistemi güncelleştirmesi değeri kaldırdıysa ve siz de bu değeri eklediyseniz, işletim sistemini kurtarmak için bcdedit komutunu kullanarak değerini bcdedit /deletevalue {default} dtracekaldırın. Ardından BitLocker'ı devre dışı bırakın ve dtrace öğesini bcdedit /set dtrace ONyeniden etkinleştirin.

VSM'yi ve Güvenli Çekirdeği etkinleştirmek için "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\EnableVirtualizationBasedSecurity" ayarını 1 olarak ayarlayarak çekirdek işlevi sınır izlemesini (FBT) etkinleştirmek için makinedeki VSM'yi (Sanal Güvenli Mod) yapılandırın.

Bunu yapmak için REG Add komutunu kullanın, örneğin:

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

Bazı DTrace komutları Windows sembollerini kullanır. Windows simgelerini kullanmak için bir sembol dizini oluşturun ve sembollerin yolunu ayarlayın:

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

Sembol yolları hakkında daha fazla bilgi için bkz. Windows hata ayıklayıcıları için sembol yolu.

Sanal Makinenin içinde DTrace kullanma

Bir VM'de DTrace çalıştırıyorsanız, aşağıdaki PowerShell komutunu kullanarak VM durdurulduğunda VM'yi destekleyen makinede iç içe Sanallaştırma'yı açın. VM'de DTrace'i çalıştırdığınız <VMName> öğesini sağlayın. PowerShell Windows'larını Yönetici olarak açın.

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

VM'yi destekleyen bilgisayarı yeniden başlatın.

DTrace yüklemesini doğrulama

Etkin yoklamaları listelemek için -l seçeneğini kullanın. DTrace etkinse, etw ve sistem olayları için birçok prob listeleniyor olmalıdır.

DTrace komutlarını girmek için yönetici olarak bir Windows komut istemi açın.

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

...

Yalnızca bu üç prob listeleniyorsa, DTrace.sys sürücüsünün yüklenmesiyle ilgili bir sorun vardır.

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

DTrace ile çalışmaya başlama - Tek satırlık komutlar

Bu komutları bir yönetici komut isteminden çalıştırarak başlayın.

Bu komut, bir programa göre sistem çağrısı özetini 5 saniye boyunca görüntüler. tick-5sec parametresi zaman aralığını belirtir. Çıkış(0); komutun tamamlandıktan sonra komut istemine geri dönmesine neden olur. Çıkış, [pid,execname] = count(); kullanılarak belirtilir ve bu, İşlem Kimliği (PID), yürütülebilir dosya adı ve son 5 saniye için bir sayaç görüntüler.

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

Bu komut zamanlayıcı ayarlama/kaldırma çağrılarını 3 saniye boyunca özetler.

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

Semboller kullanan tek satırlı komutlar

Bu komut, Windows simgelerinden yararlanarak sembol yolunun yükleme bölümünde açıklandığı gibi ayarlanmasını gerektirir. Yüklemede daha önce belirtildiği gibi, bu komutları kullanarak bir dizin oluşturun ve sembol yolunu ayarlayın.

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

Bu örnek komut üst NT işlevlerini görüntüler.

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

Bu komut SystemProcess çekirdek yapısının dökümünü alır.

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 ]
    }
}

Bu komut, son 10 saniyenin en üst çekirdek yığınını görüntüler.

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

Bu komut, başlatma sırasında notepad.exe tarafından çağrılan en iyi modülleri görüntüler. -c seçeneği belirtilen komutu (notepad.exe) çalıştırır ve tamamlandıktan sonra çıkar.

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

Ayrıca bakınız