Bagikan melalui


Gambaran Umum Debugger Data Model 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++.

Antarmuka C++ Model Data Debugger

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

Cuplikan layar jendela eksplorasi model data yang menampilkan proses dan utas.

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

Diagram yang memperlihatkan arsitektur model data dengan model objek umum di tengah dan penyedia di sebelah kanan.

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.

Diagram yang memperlihatkan arsitektur model data dengan IModelObject sebagai input dan penyimpanan kunci tuples.

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.

Diagram yang memperlihatkan arsitektur model data dengan UI diterima oleh evaluator yang terhubung ke IDebugHost.

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.

Diagram yang menunjukkan arsitektur model data dengan IModelObject yang terhubung ke konsumen NatVis, JavaScript, dan kode natif.

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.

Diagram yang memperlihatkan arsitektur model data dengan nama terdaftar yang diakses oleh manajer model data.

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

IHostDataModelAccess

Antarmuka Utama

IModelObject

IKeyStore

IModelIterator

IModelPropertyAccessor

IModelMethod

IKeyEnumerator

IRawEnumerator

IModelKeyReference / IModelKeyReference2

Antarmuka Konsep

IStringDisplayableConcept

IIterableConcept

IIndexableConcept

IPreferredRuntimeTypeConcept

IDataModelConcept

IDynamicKeyProviderConcept

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

IDataModelScriptManager

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)

IDebugHost

IDebugHostStatus

IDebugHostContext

IDebugHostMemory / IDebugHostMemory2

IDebugHostErrorSink

IDebugHostEvaluator / IDebugHostEvaluator2

IDebugHostExtensibility

Antarmuka Sistem Jenis Host (Debugger)

IDebugHostSymbols

IDebugHostSymbol / IDebugHostSymbol2

IDebugHostModule

IDebugHostType / IDebugHostType2

IDebugHostConstant

IDebugHostField

IDebugHostData

IDebugHostBaseClassIDebugHostPublic

IDebugHostModuleSignature

IDebugHostTypeSignature

Dukungan Host (Debugger) untuk Pembuatan Skrip

IDebugHostScriptHost

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

IDataModelScriptProvider

IDataModelScript

IDataModelScriptClient

IDataModelScriptHostContext

IDataModelScriptTemplate

IDataModelScriptTemplateEnumerator

IDataModelNameBinder

Antarmuka Penyelidik Kesalahan Skrip

IDataModelScriptDebug

IDataModelScriptDebugClient

IDataModelScriptDebugStack

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

Objek C++ Model Data Debugger

Debugger Data Model C++ Antarmuka Tambahan

Konsep C++ Model Data Debugger

Pembuatan Skrip Model Data Debugger C++