Bagikan melalui


DTrace di Windows

DTrace (DTrace.exe) adalah alat baris perintah yang menampilkan informasi dan peristiwa sistem. DTrace adalah platform pelacakan sumber terbuka yang di-port ke jendela. DTrace awalnya dikembangkan untuk sistem operasi Solaris. Ini menyediakan instrumentasi dinamis dari kedua fungsi pengguna/kernel, kemampuan untuk membuat skrip menggunakan bahasa D, pelacakan spekulatif. Selain itu, DTrace memiliki ekstensi khusus OS Windows seperti instrumentasi ETW, pembuatan peristiwa ETW, pemeriksaan panggilan sistem, dan kemampuan pengambilan cadangan langsung.

Catatan

DTrace didukung di build Insider Windows setelah versi 18980 dan Windows Server Build 18975.

Situs DTrace di Windows GitHub terletak di sini:

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

Buka Informasi DTrace

Untuk informasi terperinci tentang DTrace, lihat Spesifikasi OpenDTrace versi 1.0 di University Of Cambridge.

Situs GitHub utama terletak di https://github.com/opendtrace/.

Satu set skrip yang berguna tersedia di https://github.com/opendtrace/toolkit.

Sejumlah buku DTrace tersedia, seperti:

DTrace: Pelacakan Dinamis di Oracle Solaris, Mac OS X dan FreeBSD oleh Brendan Gregg dan Jim Mauro

Performa dan Alat Solaris: Teknik DTrace dan MDB untuk Solaris 10 dan OpenSolaris oleh Richard McDougall, Jim Mauro dan Brendan Gregg

Memberikan umpan balik tentang Windows DTrace

Gunakan hub umpan balik untuk meminta fitur baru atau untuk melaporkan masalah atau bug dengan Windows DTrace.

  1. Luncurkan hub umpan balik. Buka pencarian, masukkan umpan balik kata, lalu pilih Hub Umpan Balik.
  2. Pilih Sarankan fitur atau Laporkan masalah.
  3. Berikan deskripsi terperinci dan spesifik tentang masalah atau saran.

Ekstensi DTrace Windows

Berikut ini adalah beberapa penyedia yang tersedia di Windows dan instrumennya.

  • syscall – Panggilan sistem NTOS

  • fbt (Pelacakan Batas Fungsi) – Entri fungsi Kernel dan mengembalikan

  • pid (ID Proses) – Pelacakan proses mode pengguna. Seperti FBT mode kernel, tetapi juga memungkinkan instrumentasi offset fungsi arbitrer.

  • etw (Pelacakan Peristiwa untuk Windows) – Memungkinkan pemeriksaan didefinisikan untuk ETW Penyedia ini membantu memanfaatkan instrumentasi sistem operasi yang ada di DTrace.

SYSCALL

SYSCALL menyediakan sepasang pemeriksaan untuk setiap panggilan sistem: pemeriksaan entri yang diaktifkan sebelum panggilan sistem dimasukkan, dan pemeriksaan pengembalian yang diaktifkan setelah panggilan sistem selesai tetapi sebelum kontrol ditransfer kembali ke tingkat pengguna. Untuk semua pemeriksaan SYSCALL, nama fungsi diatur menjadi nama panggilan sistem berinstrumentasi dan nama modul adalah modul tempat fungsi berada. Nama panggilan sistem seperti yang disediakan oleh penyedia SYSCALL dapat ditemukan dengan mengetik perintah dtrace.exe -l -P syscall dari prompt perintah. Perhatikan bahwa nama probe adalah huruf kecil syscall. Perintah dtrace -ln syscall::: juga akan mencantumkan semua pemeriksaan dan parameternya yang tersedia dari penyedia 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
...

Perhatikan bahwa tidak semua output layar ditampilkan dalam contoh ini. "..." digunakan untuk mewakili output terpotong.

Untuk menggulir output, pipa ke perintah lainnya seperti ini:

dtrace -ln syscall:::|more

Tambahkan opsi v untuk menampilkan informasi selengkapnya tentang pemeriksaan syscall yang tersedia.

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 mencakup dukungan untuk pemeriksaan ETW yang dimanifestasikan/dilacak yang ada. Anda dapat melengkapi, memfilter, dan mengurai peristiwa ETW secara sinkron pada saat peristiwa menembak. Selain itu, DTrace dapat digunakan untuk menggabungkan berbagai peristiwa/status sistem untuk menyediakan aliran output terkonsolidasi untuk membantu men-debug situasi kesalahan yang kompleks.

Perintah dtrace -ln etw::: akan mencantumkan semua pemeriksaan dan parameternya yang tersedia dari penyedia 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
  ...

Untuk informasi selengkapnya, lihat DTrace ETW.

Pelacakan Batas Fungsi (FBT)

Penyedia Pelacakan Batas Fungsi (FBT) menyediakan pemeriksaan yang terkait dengan entri ke dan kembali dari sebagian besar fungsi di kernel Windows. Fungsi ini adalah unit dasar teks program. Mirip dengan penyedia DTrace lainnya, FBT tidak memiliki efek pemeriksaan ketika tidak diaktifkan secara eksplisit. Saat diaktifkan, FBT hanya menginduksi efek pemeriksaan dalam fungsi yang diselimuti. FBT telah diterapkan pada platform x86 dan x64.

Untuk setiap set instruksi, ada sejumlah kecil fungsi yang tidak memanggil fungsi lain dan sangat dioptimalkan oleh pengkompilasi (disebut fungsi daun) yang tidak dapat diinstrumentasikan oleh FBT. Pemeriksaan untuk fungsi-fungsi ini tidak ada di DTrace.

Perintah dtrace -ln fbt:nt:: akan mencantumkan semua pemeriksaan dan parameternya yang tersedia untuk modul nt. Gunakan perintah debugger lm (List Loaded Modules) untuk mencantumkan semua modul yang tersedia.

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

Catatan

Karena ada ribuan panggilan yang tersedia dalam nt, tidak ada baiknya untuk membiarkan nama fungsi kosong saat menjalankan perintah DTrace yang mencatat data. Pendekatan yang direkomendasikan untuk menghindari kemungkinan dampak performa adalah menentukan setidaknya bagian dari nama fungsi, seperti fbt:nt:*Timer*:entry.

PID

Penyedia DTrace PID memungkinkan Anda melacak eksekusi internal proses mode pengguna seperti browser web atau database. Anda juga dapat melampirkan DTrace pada saat peluncuran proses sehingga dapat men-debug masalah start-up proses. Sebagai bagian dari definisi PID, Anda menentukan fungsi yang ditentukan dalam proses dan offset tertentu (atau semua offset menggunakan wildcard *) dalam fungsi . Penyedia PID mengharuskan biner diluncurkan atau dijalankan pada saat eksekusi skrip.

Contoh perintah ini menampilkan informasi tentang panggilan tertentu di PID yang terkait dengan notepad.exe. Gunakan perintah debugger lm (List Loaded Modules) untuk mencantumkan semua modul yang tersedia.

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

Catatan

Saat melacak fungsi yang ditulis dalam C++, nama fungsi mungkin terlalu panjang atau didekorasi untuk ditentukan sebagai pemeriksaan dengan bentuk lengkapnya. Solusi umumnya adalah menggunakan ekspresi yang secara unik cocok dengan fungsi target Anda. Misalnya, gunakan 'String?? Salin' sebagai bagian 'probefunc' dari nama probe agar sesuai dengan 'String::Copy()', atau '*GetPinnableReference' agar sesuai dengan 'String::GetPinnableReference()'.

Arsitektur DTrace Windows

Pengguna berinteraksi dengan DTrace melalui perintah DTrace, yang berfungsi sebagai front-end ke mesin DTrace. Skrip D dikompilasi ke format menengah (DIF) di ruang pengguna dan dikirim ke komponen kernel DTrace untuk dieksekusi, kadang-kadang disebut sebagai Komputer Virtual DIF. Ini berjalan di driver dtrace.sys.

Traceext.sys (ekstensi pelacakan) adalah driver ekstensi kernel Windows, yang memungkinkan Windows mengekspos fungsionalitas yang diandalkan DTrace untuk menyediakan pelacakan. Kernel Windows menyediakan callout selama akses stackwalk atau memori yang kemudian diimplementasikan oleh ekstensi pelacakan.

Diagram yang menunjukkan Arsitektur Windows DTrace dengan dtrace.exe tersambung ke libtrace, yang berkomunikasi dengan DTrace.sys, dan memanggil Traceext.sys.

Menginstal DTrace di bawah Windows

  1. Periksa apakah Anda menjalankan versi Windows yang didukung. Unduhan DTrace saat ini didukung di build Insider 20H1 Windows setelah versi 18980 dan Windows Server Build 18975. Menginstal versi DTrace ini pada versi Windows yang lebih lama dapat menyebabkan ketidakstabilan sistem dan tidak disarankan. (Versi DTrace yang diarsipkan untuk 19H1 tidak lagi tersedia dan tidak lagi didukung.)

  2. Unduh file penginstalan MSI (Unduh DTrace di Windows) dari Pusat Unduhan Microsoft.

  3. Pilih Penginstalan lengkap.

    Penting

    Sebelum menggunakan bcdedit untuk mengubah informasi boot, Anda mungkin perlu menangguhkan sementara fitur keamanan Windows seperti Patchguard, BitLocker, dan Secure Boot pada PC pengujian. Aktifkan kembali fitur keamanan ini saat pengujian selesai dan kelola PC pengujian dengan tepat, saat fitur keamanan dinonaktifkan.

  4. Perbarui variabel lingkungan PATH untuk menyertakan C:\Program Files\DTrace

set PATH=%PATH%;"C:\Program Files\DTrace"
  1. Aktifkan DTrace pada komputer menggunakan perintah bcdedit.
bcdedit /set dtrace ON

Ketika Anda memperbarui ke build Windows Insider baru, Anda harus mengatur opsi dtrace bcdedit lagi.

Catatan

Jika Anda menggunakan BitLocker, nonaktifkan saat membuat perubahan pada nilai boot. Jika Anda tidak melakukan ini, Anda mungkin diminta untuk kunci pemulihan BitLocker. Salah satu cara untuk pulih dari situasi ini adalah dengan boot ke konsol pemulihan dan memulihkan nilai bcdedit, bcdedit /set {default} dtrace on. Jika pembaruan OS telah menghapus nilai dan Anda menambahkannya, untuk memulihkan OS, gunakan bcdedit untuk menghapus nilai , bcdedit /deletevalue {default} dtrace. Kemudian nonaktifkan BitLocker dan aktifkan kembali dtrace, bcdedit /set dtrace ON.

Konfigurasikan VSM (Mode Aman Virtual) pada komputer untuk mengaktifkan pelacakan batas fungsi kernel (FBT) dengan mengatur "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\EnableVirtualizationBasedSecurity" diatur ke 1 untuk mengaktifkan VSM dan Kernel Aman.

Untuk melakukan ini, gunakan perintah Tambahkan REG, seperti ini:

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

Beberapa perintah DTrace menggunakan simbol Windows. Untuk menggunakan simbol Windows, buat direktori simbol dan atur jalur simbol:

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

Untuk informasi selengkapnya tentang jalur simbol, lihat Jalur simbol untuk debugger Windows.

Menggunakan DTrace di dalam Komputer Virtual

Jika menjalankan DTrace pada VM, aktifkan Virtualisasi berlapis pada komputer yang mendukung VM, saat VM dihentikan, menggunakan perintah PowerShell berikut. <VMName> Berikan untuk VM tempat Anda menjalankan DTrace. Buka PowerShell Windows sebagai Administrator.

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

Reboot PC yang mendukung VM.

Memvalidasi penginstalan DTrace

Gunakan opsi -l untuk mencantumkan pemeriksaan aktif. Jika DTrace aktif banyak pemeriksaan harus dicantumkan untuk peristiwa etw dan sistem.

Buka perintah Windows sebagai administrator untuk memasukkan perintah 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

...

Jika hanya ketiga pemeriksaan ini yang tercantum, ada masalah dengan driver DTrace.sys yang dimuat.

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

Mulai menggunakan DTrace - Satu perintah baris

Mulailah dengan menjalankan perintah ini dari prompt perintah administrator.

Perintah ini menampilkan ringkasan syscall menurut program selama 5 detik. Parameter tick-5sec menentukan periode waktu. Pintu keluar(0); menyebabkan perintah keluar setelah selesai kembali ke prompt perintah. Output ditentukan menggunakan [pid,execname] = count(); Ini menampilkan ID Proses (PID), nama yang dapat dieksekusi dan hitungan selama 5 detik terakhir.

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

Perintah ini meringkas panggilan set/batal timer selama 3 detik:

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

Satu perintah baris yang menggunakan simbol

Perintah ini memanfaatkan simbol Windows dan mengharuskan jalur simbol diatur seperti yang dibahas di bagian penginstalan. Seperti disebutkan sebelumnya dalam penginstalan, buat direktori dan atur jalur simbol menggunakan perintah ini.

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

Contoh perintah ini menampilkan fungsi NT teratas.

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

Perintah ini mencadangkan struktur kernel 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 ]
    }
}

Perintah ini menampilkan tumpukan kernel teratas selama 10 detik terakhir.

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

Perintah ini menampilkan modul teratas yang dipanggil oleh notepad.exe selama peluncuran. Opsi -c menjalankan perintah yang ditentukan (notepad.exe) dan keluar setelah selesai.

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

Lihat juga

Pemrograman DTrace Windows

DTrace ETW

DTrace Live Dump

Sampel Kode Windows DTrace