Gambaran Umum Model Data Debugger C++
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++.
Gambaran Umum Model Data Debugger C++
Antarmuka C++ Model Data Debugger
Model Data Debugger C++ Antarmuka Tambahan
Konsep C++ Model Data Debugger
Pembuatan Skrip C++ Model Data Debugger
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 ditulis ke API model data tersedia dalam evaluator ekspresi (dx) debugger yang lebih baru serta dari ekstensi JavaScript atau ekstensi 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 menyediakan output teks saja dengan cara non-standar. Output teks sulit digunakan, diformat, atau diperluas dan tata letak khusus untuk perintah ini.
Kontraskan 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 logis dan perluasan pada objek tertentu memungkinkan penemuan fungsionalitas ekstensi debugger.
Tip
Karena antarmuka Data Model C++ Object bisa 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, menunjukkan sebagian besar hal. 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 ini 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 NatVis, JavaScript, dan C++ debugger kustom.
Model Objek
Di tengah Model Data Debugger adalah representasi objek yang 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 menjelaskan 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, itu adalah model objek umum yang digunakan untuk memanipulasi objek.
- Di tengah adalah Key Store yang digunakan untuk menyimpan dan mengakses nilai.
- Di bagian bawah menunjukkan Konsep yang mendukung objek dengan fungsionalitas seperti kemampuan untuk mengonversi ke string yang dapat ditampilkan atau diindeks.
Model data: Tampilan Konsumen
Diagram berikutnya menunjukkan tampilan konsumen 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 menunjukkan tampilan produsen model data.
- Penyedia NatVis ditampilkan di sebelah kiri yang menggunakan XML yang menentukan 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 pengelolaan 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
Set 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, ini adalah entitas yang bertanggung jawab atas tinju 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 jenis yang mendasar dan ruang memori debugger diekspos secara rinci agar ekstensi dapat digunakan. 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 digunakan dan menentukan jembatan umum antara model data dan bahasa dinamis lainnya (biasanya lingkungan pembuatan skrip). Set antarmuka ini adalah bagaimana itu dicapai serta bagaimana antarmuka pengguna debugger dapat menggunakan skrip tersebut.
Antarmuka berikut didefinisikan untuk kategori ini:
Antarmuka Skrip Umum
IDataModelScriptTemplateEnumerator
Antarmuka Debugger Skrip
IDataModelScriptDebugStackFrame
IDataModelScriptDebugVariableSetEnumerator
IDataModelScriptDebugBreakpoint
IDataModelScriptDebugBreakpointEnumerator
Menggunakan Pustaka DbgModelClientEx
Gambaran Umum
Model Data C++ Object Interfaces ke model data bisa sangat verbose untuk diterapkan. Meskipun memungkinkan manipulasi penuh model data, mereka memerlukan implementasi sejumlah antarmuka kecil untuk memperluas model data (misalnya: implementasi IModelPropertyAccessor untuk setiap properti pengambilan 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::D ataModel::ClientEx - pembantu untuk konsumsi model data
Debugger::D ataModel::P roviderEx - pembantu untuk ekstensi 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 dari kelas penyedia yang menambahkan properti contoh baru "Halo" 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. Jauh lebih disukai untuk menulis ekstensi terhadap pustaka ini daripada COM ABI mentah karena volume (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 terhadap Model Data C++17 Client Library
COM - Versi yang ditulis terhadap COM ABI mentah (hanya menggunakan WRL untuk pembantu COM)
Lihat juga
Antarmuka C++ Model Data Debugger
Model Data Debugger C++ Antarmuka Tambahan
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk