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

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

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

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.

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

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

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.

Diagram yang memperlihatkan arsitektur model data dengan pengumpanan UI ke dalam evaluator yang tersambung ke IDebugHost.

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.

Diagram yang memperlihatkan arsitektur model data dengan IModelObject yang terhubung ke konsumen NatVis, JavaScript, dan Kode asli.

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.

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

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

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, 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

IDataModelScriptManager

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)

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

IDataModelScriptProvider

IDataModelScript

IDataModelScriptClient

IDataModelScriptHostContext

IDataModelScriptTemplate

IDataModelScriptTemplateEnumerator

IDataModelNameBinder

Antarmuka Debugger Skrip

IDataModelScriptDebug

IDataModelScriptDebugClient

IDataModelScriptDebugStack

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

Objek C++ Model Data Debugger

Model Data Debugger C++ Antarmuka Tambahan

Konsep C++ Model Data Debugger

Pembuatan Skrip C++ Model Data Debugger