wt (Lacak dan Tonton Data)
Perintah wt berjalan melalui seluruh fungsi lalu menampilkan statistik, ketika Anda menjalankan perintah ini di awal panggilan fungsi.
wt [WatchOptions] [= StartAddress] [EndAddress]
Parameter
WatchOptions
Menentukan cara mengubah tampilan. Anda dapat menggunakan salah satu opsi berikut.
Opsi | Efek |
---|---|
-l Kedalaman |
(Mode pengguna saja) Menentukan kedalaman maksimum panggilan yang akan ditampilkan. Setiap panggilan yang setidaknya tingkat Kedalaman lebih dalam dari titik awal dijalankan secara diam-diam. |
Modul -m |
(Mode pengguna saja) Membatasi tampilan ke kode di dalam modul yang ditentukan, ditambah tingkat panggilan pertama yang dilakukan dari modul tersebut. Anda dapat menyertakan beberapa opsi -m untuk menampilkan kode dari beberapa modul dan tidak ada modul lain. |
Modul -i |
(Mode pengguna saja) Mengabaikan kode apa pun dalam modul yang ditentukan. Anda dapat menyertakan beberapa opsi -i untuk mengabaikan kode dari beberapa modul. Jika Anda menggunakan opsi -m, debugger mengabaikan semua opsi -i. |
-Ni |
(Mode pengguna saja) Tidak menampilkan entri apa pun ke dalam kode yang diabaikan karena opsi -m atau -i. |
-Nc |
Tidak menampilkan informasi panggilan individual. |
-Ns |
Tidak menampilkan informasi ringkasan. |
-Arah baratlaut |
Tidak menampilkan peringatan selama pelacakan. |
-Oa |
(Mode pengguna saja) Menampilkan alamat aktual situs panggilan. |
-or |
(Mode pengguna saja) Menampilkan nilai register pengembalian dari fungsi yang disebut, menggunakan radix default sebagai dasar. |
-atau |
(Mode pengguna saja) Menampilkan nilai register pengembalian dari fungsi yang disebut, dalam jenis yang sesuai untuk setiap nilai yang dikembalikan. |
StartAddress
Menentukan alamat tempat debugger memulai eksekusi. Jika Anda tidak menggunakan StartAddress, eksekusi dimulai pada instruksi yang ditunjuk penunjuk instruksi. Untuk informasi selengkapnya tentang sintaks, lihat Sintaks Alamat dan Rentang Alamat.
EndAddress
Menentukan alamat tempat pelacakan berakhir. Jika Anda tidak menggunakan EndAddress, satu instruksi atau panggilan fungsi dijalankan.
Lingkungan
Mode |
Mode pengguna, mode kernel |
Target |
Penelusuran kesalahan langsung saja |
Platform |
Mode pengguna: semua mode Kernel: hanya berbasis x86 |
Informasi Tambahan
Untuk informasi selengkapnya tentang mengeluarkan perintah wt dan gambaran umum perintah terkait, lihat Mengontrol Target.
Keterangan
Perintah wt berguna jika Anda menginginkan informasi tentang perilaku fungsi tertentu, tetapi Anda tidak ingin menelusuri fungsi. Sebagai gantinya, buka awal fungsi tersebut lalu keluarkan perintah wt .
Jika penghitung program berada pada titik yang sesuai dengan simbol (seperti awal fungsi atau titik entri ke dalam modul), perintah wt akan melacak hingga mencapai alamat pengembalian saat ini. Jika penghitung program berada pada instruksi panggilan , perintah wt akan dilacak hingga kembali ke lokasi saat ini. Pelacakan ini diprofilkan di jendela Perintah Debugger bersama dengan output yang menjelaskan berbagai panggilan yang ditemui perintah.
Jika perintah wt dikeluarkan di suatu tempat selain awal fungsi, perintah berulah seperti perintah p (Langkah). Namun, jika Anda menentukan EndAddress, eksekusi berlanjut hingga alamat tersebut tercapai, bahkan jika eksekusi ini melibatkan banyak langkah program dan panggilan fungsi.
Saat Anda menelusuri kesalahan dalam mode sumber, Anda harus melacak ke fungsi hanya ke titik di mana Anda melihat tanda kurung buka isi fungsi. Kemudian, Anda dapat menggunakan perintah wt . (Biasanya lebih mudah untuk menyisipkan titik henti di baris pertama fungsi, atau menggunakan Debug | Jalankan ke Kursor, lalu gunakan perintah wt .)
Karena output dari wt bisa panjang, Anda mungkin ingin menggunakan file log untuk merekam output Anda.
Contoh berikut menunjukkan file log umum.
0:000> l+ Source options set to show source lines
Source options are f:
1/t - Step/trace by source line
2/l - List source line for LN and prompt
4/s - List source code at prompt
8/o - Only show source code at prompt
0:000> p Not yet at the function call: use "p"
> 44: minorVariableOne = 12;
0:000> p
> 45: variableOne = myFunction(2, minorVariable);
0:000> t At the function call: now use "t"
MyModule!ILT+10(_myFunction):
0040100f e9cce60000 jmp MyModule!myFunction (0040f6e0)
0:000> t
> 231: {
0:000> wt At the function beginning: now use "wt"
Tracing MyModule!myFunction to return address 00401137
105 0 [ 0] MyModule!myFunction
1 0 [ 1] MyModule!ILT+1555(_printf)
9 0 [ 1] MyModule!printf
1 0 [ 2] MyModule!ILT+370(__stbuf)
11 0 [ 2] MyModule!_stbuf
1 0 [ 3] MyModule!ILT+1440(__isatty)
14 0 [ 3] MyModule!_isatty
50 15 [ 2] MyModule!_stbuf
17 66 [ 1] MyModule!printf
1 0 [ 2] MyModule!ILT+980(__output)
59 0 [ 2] MyModule!_output
39 0 [ 3] MyModule!write_char
111 39 [ 2] MyModule!_output
39 0 [ 3] MyModule!write_char
....
11 0 [ 5] kernel32!__SEH_epilog4
54 11675 [ 4] kernel32!ReadFile
165 11729 [ 3] MyModule!_read
100 11895 [ 2] MyModule!_filbuf
91 11996 [ 1] MyModule!fgets
54545 83789 [ 0] MyModule!myFunction
1 0 [ 1] MyModule!ILT+1265(__RTC_CheckEsp)
2 0 [ 1] MyModule!_RTC_CheckEsp
54547 83782 [ 0] MyModule!myFunction
112379 instructions were executed in 112378 events (0 from other threads)
Function Name Invocations MinInst MaxInst AvgInst
MyModule!ILT+1265(__RTC_CheckEsp) 1 1 1 1
MyModule!ILT+1440(__isatty) 21 1 1 1
MyModule!ILT+1540(__ftbuf) 21 1 1 1
....
ntdll!memcpy 24 1 40 19
ntdll!memset 2 29 29 29
23 system calls were executed
Calls System Call
23 ntdll!KiFastSystemCall
Dalam daftar jejak, angka pertama menentukan jumlah instruksi yang dijalankan, angka kedua menentukan jumlah instruksi yang dijalankan oleh proses turunan fungsi, dan angka ketiga (dalam tanda kurung) menentukan kedalaman fungsi dalam tumpukan (mengambil fungsi awal sebagai nol). Indentasi nama fungsi menunjukkan kedalaman panggilan.
Dalam contoh sebelumnya, MyModule!myFunction menjalankan 105 instruksi sebelum memanggil beberapa subroutine, termasuk printf dan fgets, dan kemudian menjalankan instruksi tambahan 54545 setelah memanggil fungsi tersebut, tetapi sebelum mengeluarkan beberapa panggilan lagi. Namun, dalam jumlah akhir, tampilan menunjukkan bahwa myFunction menjalankan 112.379 instruksi, karena jumlah ini mencakup semua instruksi yang dijalankan myFunction dan anak-anaknya. (Anak-anak myFunction adalah fungsi yang dipanggil dari myFunction, baik secara langsung maupun tidak langsung.)
Dalam contoh sebelumnya, perhatikan juga bahwa ILT+1440 (__isatty) dipanggil 21 kali. Dalam jumlah akhir, ringkasan perilaku fungsi ini menunjukkan berapa kali dipanggil, jumlah instruksi terkecil dalam eksekusi tunggal apa pun, jumlah instruksi terbesar dalam eksekusi tunggal apa pun, dan jumlah rata-rata instruksi per eksekusi.
Jika ada panggilan sistem yang dilakukan, panggilan tersebut muncul di penghitung dan dicantumkan lagi di akhir output perintah.