x (Periksa Simbol)
Perintah x menampilkan simbol dalam semua konteks yang cocok dengan pola yang ditentukan.
x [Options] Module!Symbol
x [Options] *
Parameter
Opsi Menentukan opsi pencarian simbol. Anda bisa menggunakan satu atau beberapa opsi berikut:
/0
Hanya menampilkan alamat setiap simbol.
/1
Hanya menampilkan nama setiap simbol.
/2
Hanya menampilkan alamat dan nama setiap simbol (bukan tipe data).
/D
Menampilkan output menggunakan Bahasa Markup Debugger.
/t
Menampilkan tipe data setiap simbol, jika tipe data diketahui.
/v
Menampilkan jenis simbol (lokal, global, parameter, fungsi, atau tidak diketahui) dari setiap simbol. Opsi ini juga menampilkan ukuran setiap simbol. Ukuran simbol fungsi adalah ukuran fungsi dalam memori. Ukuran simbol lain adalah ukuran jenis data yang diwakili simbol. Ukuran selalu diukur dalam byte dan ditampilkan dalam format heksadesimal.
Ukuran /s
Hanya menampilkan simbol yang ukurannya, dalam byte, sama dengan nilai Ukuran. Ukuran simbol fungsi adalah ukuran fungsi dalam memori. Ukuran simbol lain adalah ukuran tipe data yang diwakili simbol. Simbol yang ukurannya tidak dapat ditentukan selalu ditampilkan. Ukuran harus berupa bilangan bulat bukan nol.
/q
Menampilkan nama simbol dalam format yang dikutip.
/p
Menghilangkan spasi sebelum tanda kurung pembuka saat debugger menampilkan nama fungsi dan argumennya. Tampilan semacam ini dapat mempermudah jika Anda menyalin nama fungsi dan argumen dari tampilan x ke lokasi lain.
/f
Menampilkan ukuran data fungsi.
/d
Menampilkan ukuran data.
/sebuah
Mengurutkan tampilan menurut alamat, dalam urutan naik.
/Sebuah
Mengurutkan tampilan menurut alamat, dalam urutan turun.
/n
Mengurutkan tampilan menurut nama, dalam urutan naik.
/N
Mengurutkan tampilan menurut nama, dalam urutan turun.
/z
Mengurutkan tampilan menurut ukuran, dalam urutan naik.
/Z
Mengurutkan tampilan menurut ukuran, dalam urutan turun.
Modul
Menentukan modul yang akan dicari. Modul ini dapat menjadi file .exe, .dll, atau .sys. Modul dapat berisi berbagai karakter kartubebas dan penentu. Untuk informasi selengkapnya tentang sintaks, lihat Sintaks Wildcard String.
Lambang
Menentukan pola yang harus dimuat simbol. Simbol dapat berisi berbagai karakter kartubebas dan penentu. Untuk informasi selengkapnya tentang sintaks, lihat Sintaks Wildcard String.
Karena pola ini dicocokkan dengan simbol, kecocokan tidak peka huruf besar/kecil, dan satu garis bawah terkemuka (_) mewakili kuantitas garis bawah di depan. Anda dapat menambahkan spasi dalam Simbol, sehingga Anda dapat menentukan nama simbol yang berisi spasi (seperti "operator baru" atau "Templat<A, B>") tanpa menggunakan karakter kartubebas.
Lingkungan
Item | Deskripsi |
---|---|
Mode | Mode pengguna, mode kernel |
Target | Live, crash dump |
Platform | Semua |
Keterangan
Perintah berikut menemukan semua simbol di MyModule yang berisi string "spin".
0:000> x mymodule!*spin*
Perintah berikut dengan cepat menemukan simbol "DownloadMinor" dan "DownloadMajor" di MyModule.
0:000> x mymodule!downloadm??or
Anda juga dapat menampilkan semua simbol di MyModule dengan menggunakan perintah berikut.
0:000> x mymodule!*
Perintah sebelumnya juga memaksa debugger memuat ulang informasi simbol dari MyModule. Jika Anda ingin memuat ulang simbol dalam modul dengan tampilan minimal, gunakan perintah berikut.
0:000> x mymodule!*start*
Beberapa simbol selalu berisi string "start". Oleh karena itu, perintah sebelumnya selalu menampilkan beberapa output untuk memverifikasi bahwa perintah berfungsi. Tetapi perintah sebelumnya menghindari panjang tampilan x mymodule yang berlebihan!*.
Tampilan menunjukkan alamat awal setiap simbol dan nama simbol lengkap. Jika simbol adalah nama fungsi, tampilan juga menyertakan daftar jenis argumennya. Jika simbol adalah variabel global, nilainya saat ini ditampilkan.
Ada satu kasus khusus lainnya dari perintah x . Untuk menampilkan alamat dan nama semua variabel lokal untuk konteks saat ini, gunakan perintah berikut.
0:000> x *
Catatan Dalam kebanyakan kasus, Anda tidak dapat mengakses variabel lokal kecuali simbol privat telah dimuat. Untuk informasi selengkapnya tentang situasi ini, lihat dbgerr005: Simbol Privat Diperlukan. Untuk menampilkan nilai variabel lokal, gunakan perintah dv (Tampilkan Variabel Lokal).
Contoh berikut mengilustrasikan opsi /0, /1, dan /2 .
0:000:x86> x /0 MyApp!Add*
00b51410
00b513d0
0:000:x86> x /1 MyApp!Add*
MyApp!AddThreeIntegers
MyApp!AddTwoIntegers
0:000:x86> x /2 MyApp!Add*
00b51410 MyApp!AddThreeIntegers
00b513d0 MyApp!AddTwoIntegers
Opsi /0, /1, dan /2 berguna jika Anda ingin menggunakan output perintah x sebagai input ke perintah .foreach .
.foreach ( place { x /0 MyApp!*MySym*} ) { .echo ${place}+0x18 }
Contoh berikut menunjukkan sakelar /f saat digunakan untuk memfilter fungsi pada modul notepad.exe.
0:000> x /f /v notepad!*main*
prv func 00000001`00003340 249 notepad!WinMain (struct HINSTANCE__ *, struct HINSTANCE__ *, char *, int)
prv func 00000001`0000a7b0 1c notepad!WinMainCRTStartup$filt$0 (void)
prv func 00000001`0000a540 268 notepad!WinMainCRTStartup (void)
Saat Anda menggunakan opsi /v , kolom pertama tampilan menunjukkan jenis simbol (lokal, global, parameter, fungsi, atau tidak diketahui). Kolom kedua adalah alamat simbol . Kolom ketiga adalah ukuran simbol, dalam byte. Kolom keempat menunjukkan nama modul dan nama simbol. Dalam beberapa kasus, tampilan ini diikuti dengan tanda sama dengan (=) lalu jenis data simbol. Sumber simbol (informasi simbol publik atau lengkap) juga ditampilkan.
kd> x /v nt!CmType*
global 806c9e68 0 nt!CmTypeName = struct _UNICODE_STRING []
global 806c9e68 150 nt!CmTypeName = struct _UNICODE_STRING [42]
global 806c9e68 0 nt!CmTypeName = struct _UNICODE_STRING []
global 805bd7b0 0 nt!CmTypeString = unsigned short *[]
global 805bd7b0 a8 nt!CmTypeString = unsigned short *[42]
Dalam contoh sebelumnya, ukuran diberikan dalam format heksadesimal, sementara jenis data diberikan dalam format desimal. Oleh karena itu, di baris terakhir dari contoh sebelumnya, jenis data adalah array 42 pointer ke bilangan bulat pendek yang tidak ditandatangani. Ukuran array ini adalah 42*4 = 168, dan 168 ditampilkan dalam format heksadesimal sebagai 0xA8.
Anda dapat menggunakan opsi Ukuran /suntuk menampilkan hanya simbol yang ukurannya, dalam byte, adalah nilai tertentu. Misalnya, Anda dapat membatasi perintah dalam contoh sebelumnya ke simbol yang mewakili objek yang ukurannya 0xA8.
kd> x /v /s a8 nt!CmType*
global 805bd7b0 a8 nt!CmTypeString = unsigned short *[42]
Bekerja dengan tipe data
Opsi /t menyebabkan debugger menampilkan informasi tentang jenis data setiap simbol. Perhatikan bahwa untuk banyak simbol, informasi ini ditampilkan bahkan tanpa opsi /t . Saat Anda menggunakan /t, simbol tersebut memiliki informasi jenis data yang ditampilkan dua kali.
0:001> x prymes!__n*
00427d84 myModule!__nullstring = 0x00425de8 "(null)"
0042a3c0 myModule!_nstream = 512
Type information missing error for _nh_malloc
004021c1 myModule!MyStructInstance = struct MyStruct
00427d14 myModule!_NLG_Destination = <no type information>
0:001> x /t prymes!__n*
00427d84 char * myModule!__nullstring = 0x00425de8 "(null)"
0042a3c0 int myModule!_nstream = 512
Type information missing error for _nh_malloc
004021c1 struct MyStruct myModule!MyStructInstance = struct MyStruct
00427d14 <NoType> myModule!_NLG_Destination = <no type information>
Perintah x akan menampilkan instans jenis.
0:001> x foo!MyClassInstance
00f4f354 foo!MyClassInstance = 0x00f78768
Perintah x tidak menampilkan apa pun hanya berdasarkan nama jenis.
0:001> x foo!MyClass
0:001>
Untuk menampilkan informasi jenis menggunakan nama jenis, pertimbangkan untuk menggunakan dt (Jenis Tampilan), ini menyediakan informasi untuk jenis dan instans jenis:
0:001> dt foo!MyClass
+0x000 IntMemberVariable : Int4B
+0x004 FloatMemberVariable : Float
+0x008 BoolMemberVariable : Bool
+0x00c PtrMemberVariable : Ptr32 MyClass
Bekerja Dengan Templat
Anda dapat menggunakan kartubebas dengan perintah x untuk menampilkan kelas templat seperti yang ditunjukkan dalam sampel ini.
0:001> x Fabric!Common::ConfigEntry*TimeSpan?
000007f6`466a2f9c Fabric!Common::ConfigEntry<Common::TimeSpan>::ConfigEntry<Common::TimeSpan> (void)
000007f6`466a3020 Fabric!Common::ConfigEntry<Common::TimeSpan>::~ConfigEntry<Common::TimeSpan> (void)
Pertimbangkan untuk menggunakan perintah dt (Jenis Tampilan) saat bekerja dengan templat, karena perintah x tidak menampilkan item kelas templat individual.
0:001> dt foo!Common::ConfigEntry<Common::TimeSpan>
+0x000 __VFN_table : Ptr64
+0x008 componentConfig_ : Ptr64 Common::ComponentConfig
+0x010 section_ : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >
+0x038 key_ : std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >