Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Topik ini memberikan gambaran umum tentang cara menggunakan Antarmuka C++ Model Data Debugger untuk memperluas dan menyesuaikan kemampuan debugger.
Topik ini adalah bagian dari seri yang menjelaskan antarmuka yang dapat diakses dari C++, cara menggunakannya untuk membangun ekstensi debugger berbasis C++, dan cara menggunakan konstruksi model data lainnya (misalnya: JavaScript atau NatVis) dari ekstensi model data C++.
Antarmuka C++ Model Data Debugger
Debugger Data Model C++ Antarmuka Tambahan
Konsep C++ Model Data Debugger
Pembuatan Skrip Model Data Debugger C++
Gambaran Umum Antarmuka C++ Model Data Debugger
Model data debugger adalah model objek yang dapat diperluas yang merupakan pusat dari cara ekstensi debugger baru (termasuk yang ada di JavaScript, NatVis, dan C++) keduanya menggunakan informasi dari debugger dan menghasilkan informasi yang dapat diakses dari debugger serta ekstensi lainnya. Konstruksi yang diterapkan pada API model data tersedia di evaluator ekspresi (dx) debugger yang lebih baru dan juga dapat diakses melalui ekstensi JavaScript atau C++.
Untuk mengilustrasikan tujuan model data debugger, pertimbangkan perintah debugger tradisional ini.
0: kd> !process 0 0
PROCESS ffffe0007e6a7780
SessionId: 1 Cid: 0f68 Peb: 7ff7cfe7a000 ParentCid: 0f34
DirBase: 1f7fb9000 ObjectTable: ffffc001cec82780 HandleCount: 34.
Image: echoapp.exe
...
Perintah debugger menggunakan masker biner dan hanya menyediakan output teks dengan cara non-standar. Output teks sulit digunakan, diformat, atau diperluas dan tata letak khusus untuk perintah ini.
Kontras ini dengan perintah dx model data debugger (Ekspresi Model Objek Debugger Tampilan).
dx @$cursession.Processes.Where(p => p.Threads.Count() > 5)
Perintah ini menggunakan model data standar yang dapat ditemukan, dapat diperluas, dan dapat dikomposisikan dengan cara yang seragam.
Penspasian nama secara logis dan memperluas pada objek tertentu memungkinkan penemuan fungsionalitas ekstensi debugger.
Petunjuk / Saran
Karena antarmuka Data Model C++ Object dapat sangat verbose untuk mengimplementasikan pustaka pembantu C++ lengkap untuk model data yang menggunakan pengecualian C++ lengkap dan paradigma pemrograman templat disarankan. Untuk informasi selengkapnya, lihat Menggunakan Pustaka DbgModelClientEx nanti dalam topik ini.
Model data adalah cara WinDbg menampilkan sebagian besar informasi. Banyak elemen di UI baru dapat dikueri, diperluas, atau diskrip, karena didukung oleh model data. Untuk informasi selengkapnya, lihat WinDbg - Model Data.
Tampilan Arsitektur Model Data
Diagram berikut meringkas elemen utama arsitektur model data debugger.
- Di sisi kiri, elemen UI ditampilkan yang menyediakan akses ke objek dan mendukung fungsionalitas seperti kueri LINQ.
- Di sisi kanan diagram adalah komponen yang menyediakan data untuk men-debugger model data. Ini termasuk ekstensi model data debugger kustom untuk NatVis, JavaScript, dan C++.
Model Objek
Di tengah Model Data Debugger adalah representasi objek seragam di mana semuanya adalah instans antarmuka IModelObject. Meskipun objek tersebut dapat mewakili intrinsik (misalnya: nilai bilangan bulat) atau antarmuka model data lainnya, objek tersebut sering mewakili objek dinamis - kamus tuple kunci/nilai/metadata dan serangkaian konsep yang menggambarkan perilaku abstrak.
Diagram ini menunjukkan bagaimana IModelObject menggunakan Penyimpanan Kunci untuk berisi nilai yang dapat dibuat, didaftarkan, dan dimanipulasi oleh penyedia.
- Ini menunjukkan penyedia, yang menyediakan informasi ke model objek
- Di sebelah kiri menunjukkan IModelObject, itulah model objek umum yang digunakan untuk memanipulasi objek.
- Di tengah adalah Key Store yang digunakan untuk menyimpan dan mengakses nilai.
- Di bagian bawah menampilkan Konsep yang mendukung objek dengan fungsionalitas seperti kemampuan untuk mengonversi ke string yang dapat ditampilkan atau diindeks.
Model data: Tampilan Konsumen
Diagram berikutnya memperlihatkan pandangan konsumen terhadap model data. Dalam contoh perintah dx (Ekspresi Model Objek Debugger Tampilan) sedang digunakan untuk mengkueri informasi.
- Perintah Dx berkomunikasi melalui serializer ke antarmuka enumerasi objek.
- Objek IDebugHost* digunakan untuk mengumpulkan informasi dari mesin debugger.
- Evaluator ekspresi dan semantik digunakan untuk mengirim permintaan ke mesin debugger.
Model Data: Tampilan Produsen
Diagram ini memperlihatkan sudut pandang produsen dari model data.
- Penyedia NatVis ditampilkan di sebelah kiri yang menggunakan XML untuk mendefinisikan fungsionalitas tambahan.
- Penyedia JavaScript dapat memanfaatkan Konsep Penyedia Dinamis untuk memanipulasi informasi secara real time.
- Bagian bawah menunjukkan penyedia kode asli yang juga dapat menentukan fungsionalitas tambahan.
Manajer Model Data
Diagram ini menunjukkan peran pusat yang dimainkan manajer model data dalam manajemen objek.
- Manajer Model Data bertindak sebagai pencatat pusat untuk semua objek.
- Di sebelah kiri menunjukkan bagaimana elemen debugger standar seperti sesi dan proses didaftarkan.
- Blok namespace menunjukkan daftar pendaftaran pusat.
- Sisi kanan diagram menunjukkan dua penyedia, satu untuk NatVis di bagian atas, dan ekstensi C/C++ di bagian bawah.
Ringkasan Antarmuka Model Data Debugger
Ada banyak antarmuka C++ yang terdiri dari berbagai bagian model data. Untuk mendekati antarmuka ini secara konsisten dan mudah, antarmuka tersebut dipecah berdasarkan kategori umum. Area utama di sini:
Model Objek Umum
Sekumpulan antarmuka pertama dan terpenting menentukan cara mendapatkan akses ke model data inti dan cara mengakses dan memanipulasi objek. IModelObject adalah antarmuka yang mewakili setiap objek dalam model data (seperti objek C#). Ini adalah antarmuka utama yang menarik bagi konsumen dan produsen ke model data. Antarmuka lainnya adalah mekanisme untuk mengakses berbagai aspek objek. Antarmuka berikut didefinisikan untuk kategori ini:
Jembatan Antara DbgEng dan Model Data
Antarmuka Utama
IModelKeyReference / IModelKeyReference2
Antarmuka Konsep
IDynamicConceptProviderConcept
Manajemen Model Data dan Ekstensibilitas
Manajer Model Data adalah komponen inti yang mengelola bagaimana semua ekstensibilitas terjadi. Ini adalah repositori pusat dari sekumpulan tabel yang memetakan jenis asli ke titik ekstensi serta konstruksi sintetis ke titik ekstensi. Selain itu, entitas ini bertanggung jawab atas pembungkusan objek (konversi nilai ordinal atau string menjadi IModelObject).
Antarmuka berikut didefinisikan untuk kategori ini:
Akses Manajer Model Data Umum
IDataModelManager / IDataModelManager2
Manajemen Skrip
IDataModelScriptProviderEnumerator
Akses ke Sistem Jenis Debugger dan Ruang Memori
Sistem tipe yang mendasar dan ruang memori dari debugger dipaparkan secara rinci agar dapat dimanfaatkan oleh ekstensi. Antarmuka berikut didefinisikan untuk kategori ini:
Antarmuka Host Umum (Debugger)
IDebugHostMemory / IDebugHostMemory2
IDebugHostEvaluator / IDebugHostEvaluator2
Antarmuka Sistem Jenis Host (Debugger)
IDebugHostSymbol / IDebugHostSymbol2
IDebugHostType / IDebugHostType2
IDebugHostBaseClassIDebugHostPublic
Dukungan Host (Debugger) untuk Pembuatan Skrip
Penulisan dan Penggunaan Skrip
Model Data juga memiliki gagasan umum tentang apa itu skrip dan cara men-debugnya. Ekstensi debugger dapat hadir dan menentukan jembatan umum antara model data dan bahasa dinamis lainnya (biasanya lingkungan pembuatan skrip). Kumpulan antarmuka ini adalah cara mencapainya, serta bagaimana antarmuka pengguna debugger dapat menggunakan skrip tersebut.
Antarmuka berikut didefinisikan untuk kategori ini:
Antarmuka Skrip Umum
IDataModelScriptTemplateEnumerator
Antarmuka Penyelidik Kesalahan Skrip
IDataModelScriptDebugStackFrame
IDataModelScriptDebugVariableSetEnumerator
IDataModelScriptDebugBreakpoint
IDataModelScriptDebugBreakpointEnumerator
Menggunakan Pustaka DbgModelClientEx
Gambaran Umum
Antarmuka Objek C++ pada model data dapat sangat panjang lebar untuk diterapkan. Meskipun memungkinkan manipulasi penuh model data, mereka memerlukan implementasi sejumlah antarmuka kecil untuk memperluas model data (misalnya: implementasi IModelPropertyAccessor untuk setiap properti fetchable dinamis yang ditambahkan). Selain itu, model pemrograman berbasis HRESULT menambahkan sejumlah besar kode pelat boiler yang digunakan untuk pemeriksaan kesalahan.
Untuk meminimalkan beberapa pekerjaan ini, ada pustaka pembantu C++ lengkap untuk model data yang menggunakan pengecualian C++ lengkap dan paradigma pemrograman templat. Penggunaan pustaka ini memungkinkan kode yang lebih ringkas saat mengkonsumsi atau memperluas model data dan direkomendasikan.
Ada dua namespace penting di pustaka pembantu:
Debugger::DataModel::ClientEx - alat bantu untuk penggunaan model data
Debugger::DataModel::ProviderEx - bantuan untuk pengembangan model data
Untuk informasi tambahan tentang menggunakan pustaka DbgModelClientEx, lihat file readme di situs github ini:
https://github.com/Microsoft/WinDbg-Libraries/tree/master/DbgModelCppLib
Sampel HelloWorld C++
Untuk melihat bagaimana pustaka DbgModelClientEx dapat digunakan, tinjau sampel Data Model HelloWorld C++ di sini.
https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld
Sampel meliputi:
HelloProvider.cpp - Ini adalah implementasi kelas penyedia yang menambahkan properti contoh baru "Hello" ke gagasan debugger tentang proses.
SimpleIntroExtension.cpp - Ini adalah ekstensi debugger sederhana yang menambahkan properti contoh baru "Hello" ke gagasan debugger tentang proses. Ekstensi ini ditulis terhadap Pustaka Pembantu Model Data C++17. Lebih baik menulis ekstensi menggunakan pustaka ini daripada langsung dengan COM ABI mentah karena banyaknya (dan kompleksitas) kode lem yang diperlukan.
Sampel JavaScript dan COM
Untuk lebih memahami berbagai cara untuk menulis ekstensi debugger dengan model data, ada tiga versi ekstensi HelloWorld model data yang tersedia di sini:
https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld
JavaScript - Versi yang ditulis dalam JavaScript
C++17 - Versi yang ditulis berdasarkan Pustaka Klien Model Data C++17
COM - Versi yang ditulis terhadap COM ABI mentah (hanya menggunakan WRL untuk pembantu COM)
Lihat juga
Antarmuka C++ Model Data Debugger
Debugger Data Model C++ Antarmuka Tambahan