Aracılığıyla paylaş


Hata Ayıklayıcı Veri Modeli C++ Genel Bakış

Bu konu başlığı altında, hata ayıklayıcının özelliklerini genişletmek ve özelleştirmek için Hata Ayıklayıcı Veri Modeli C++ Arabirimlerinin nasıl kullanılacağına ilişkin bir genel bakış sağlanır.

Bu konu, C++'tan erişilebilen arabirimleri, C++ tabanlı hata ayıklayıcı uzantısı oluşturmak için bunların nasıl kullanılacağını ve C++ veri modeli uzantısından diğer veri modeli yapılarının (örn. JavaScript veya NatVis) nasıl kullanılacağını açıklayan bir serinin parçasıdır.

Hata Ayıklayıcı Veri Modeli C++ Arabirimleri

Hata Ayıklayıcı Veri Modeli C++ Nesneleri

Hata Ayıklayıcı Veri Modeli C++ Ek Arayüzleri

Hata Ayıklayıcısı Veri Modeli C++ Kavramları

Hata Ayıklayıcısı Veri Modeli C++ Betiği Oluşturma


Hata Ayıklayıcı Veri Modeli C++ Arabirimine Genel Bakış

Hata ayıklayıcısı veri modeli, yeni hata ayıklayıcı uzantılarının (JavaScript, NatVis ve C++'dakiler dahil) hem hata ayıklayıcıdan bilgi tüketmesi hem de diğer uzantılardan erişilebilen bilgiler üretmesi için merkezi bir genişletilebilir nesne modelidir. Veri modeli API'lerine yazılan yapılar, hata ayıklayıcının daha yeni (dx) ifade değerlendiricisinde ve JavaScript uzantılarında veya C++ uzantılarında kullanılabilir.

Hata ayıklayıcısı veri modelinin hedeflerini göstermek için bu geleneksel hata ayıklayıcı komutunu göz önünde bulundurun.

0: kd> !process 0 0 
PROCESS ffffe0007e6a7780
    SessionId: 1  Cid: 0f68    Peb: 7ff7cfe7a000  ParentCid: 0f34
    DirBase: 1f7fb9000  ObjectTable: ffffc001cec82780  HandleCount:  34.
    Image: echoapp.exe
...

Hata ayıklayıcı komutu ikili maske kullanıyor ve yalnızca standart olmayan yollarla metin çıkışı sağlıyor. Metin çıkışını kullanmak, biçimlendirmek veya genişletmek zordur ve düzen bu komuta özgüdür.

Bunu hata ayıklayıcı veri modeli dx (Görüntü Hata Ayıklayıcısı Nesne Modeli İfadesi) komutuyla karşıtlık yapın.

dx @$cursession.Processes.Where(p => p.Threads.Count() > 5)

Bu komut, bulunabilir, genişletilebilir ve tekdüzen yollarla birleştirilebilir standart veri modeli kullanır.

Nesneleri mantıksal olarak adlandırma ve belirli nesnelere genişletme, hata ayıklayıcı uzantısı işlevselliğinin bulunmasına olanak tanır.

İpucu

Veri Modeli C++ Nesne Arayüzleri, veri modeli için kapsamlı bir C++ yardımcı kitaplığı uygulamak amacıyla çok ayrıntılı olabileceğinden, C++ istisna ve şablon programlama paradigması kullanılması önerilir. Daha fazla bilgi için bu konunun devamında yer alan DbgModelClientEx Kitaplığı'nı kullanma konusuna bakın.

Veri modeli, WinDbg'nin çoğu şeyi gösterdiği yoldur. Veri modeli tarafından desteklendikleri için yeni kullanıcı arabirimindeki birçok öğe sorgulanabilir, betik yazılabilir veya genişletilebilir. Daha fazla bilgi için bkz. WinDbg - Veri Modeli.

İşlemi ve iş parçacıklarını görüntüleyen veri modelini keşfetme penceresinin ekran görüntüsü.

Veri Modeli Mimari Görünümü

Aşağıdaki diyagramda hata ayıklayıcı veri modeli mimarisinin ana öğeleri özetlenmektedir.

  • Sol tarafta, nesnelere erişim sağlayan ve LINQ sorguları gibi işlevleri destekleyen kullanıcı arabirimi öğeleri gösterilir.
  • Diyagramın sağ tarafında hata ayıklayıcı veri modeline veri sağlayan bileşenler bulunur. Buna özel NatVis, JavaScript ve C++ hata ayıklayıcısı veri modeli uzantıları dahildir.

Ortak nesne modelinin merkezde ve sağlayıcıların sağda yer aldığı veri modeli mimarisini gösteren diyagram.

Nesne Modeli

Hata Ayıklayıcı Veri Modelinin merkezinde, her şeyin IModelObject arabiriminin bir örneği olduğu tekdüzen bir nesne gösterimi bulunur. Böyle bir nesne içsel (örneğin, bir tamsayı değeri) veya başka bir veri modeli arabirimini temsil edebilir, ancak genellikle dinamik bir nesneyi temsil eder; anahtar/değer/meta veri demetleri sözlüğü ve soyut davranışları açıklayan bir kavram kümesi.

Bu diyagramda, IModelObject'in bir sağlayıcının oluşturabileceği, kaydedebileceği ve işleyebileceği değerleri içermek için Anahtar Depolarını nasıl kullandığı gösterilir.

  • Nesne modeline bilgi sağlayan bir sağlayıcı gösterir
  • Sol tarafta, nesneleri işlemek için kullanılan ortak nesne modeli olan IModelObject'i gösterir.
  • Merkezde, değerleri depolamak ve değerlere erişmek için kullanılan Anahtar Deposu yer alır.
  • Alt kısımda, görüntülenebilir bir dizeye dönüştürme veya dizine alma gibi işlevlere sahip nesneleri destekleyen kavramlar gösterilir.

Veri modeli mimarisini, giriş olarak IModelObject ve bir tuple anahtar deposu ile gösteren diyagram.

Veri Modeli: Tüketici Görünümü

Sonraki diyagramda veri modelinin tüketici görünümü gösterilir. Örnekte, bilgileri sorgulamak için dx (Görüntü Hata Ayıklayıcısı Nesne Modeli İfadesi) komutu kullanılıyor.

  • Dx komutu, bir seri hale getirici aracılığıyla nesne numaralandırma arabirimiyle iletişim kurar.
  • IDebugHost* nesneleri, hata ayıklayıcı altyapısından bilgi toplamak için kullanılır.
  • İfade ve anlam değerlendiricileri, isteği hata ayıklayıcı altyapısına göndermek için kullanılır.

IDebugHost'a bağlanan değerlendiricilere kullanıcı arabirimi besleyen veri modeli mimarisini gösteren diyagram.

Veri Modeli: Üretici Görünümü

Bu diyagramda veri modelinin üretici görünümü gösterilir.

  • Sol tarafta ek işlevleri tanımlayan XML kullanan bir NatVis sağlayıcısı gösterilir.
  • JavaScript sağlayıcısı, bilgileri gerçek zamanlı olarak işlemek için Dinamik Sağlayıcı Kavramları'nın avantajlarından yararlanabilir.
  • Alt kısımda, ek işlevler tanımlayabilen yerel bir kod sağlayıcısı gösterilmektedir.

NatVis, JavaScript ve Yerel kod tüketicilerine bağlı IModelObject ile veri modeli mimarisini gösteren diyagram.

Veri Modeli Yöneticisi

Bu diyagram, veri modeli yöneticisinin nesnelerin yönetiminde oynadığı merkezi rolü gösterir.

  • Veri Modeli Yöneticisi, tüm nesneler için merkezi bir kayıt şirketi işlevi görür.
  • Sol tarafta oturumlar ve işlem gibi standart hata ayıklayıcı öğelerinin nasıl kaydedildiği gösterilir.
  • Ad alanı bloğu merkezi kayıt listesini gösterir.
  • Diyagramın sağ tarafında biri NatVis için olmak üzere iki sağlayıcı ve altta bir C/C++ uzantısı gösterilir.

Veri modeli yöneticisi tarafından erişilen kayıtlı adlara sahip veri modeli mimarisini gösteren diyagram.

Hata Ayıklayıcı Veri Modeli Arabirimlerinin Özeti

Veri modelinin farklı parçalarını oluşturan çok sayıda C++ arabirimi vardır. Bu arabirimlere tutarlı ve kolay bir şekilde yaklaşmak için genel kategoriye göre ayrılmıştır. Buradaki ana alanlar:

Genel Nesne Modeli

İlk ve en önemli arabirim kümesi, çekirdek veri modeline erişim elde etme ve nesnelere erişme ve nesneleri işlemeyi tanımlar. IModelObject, veri modelindeki her nesneyi temsil eden arabirimdir (C#'nin nesnesine çok benzer). Bu, hem tüketicilerin hem de üreticilerin veri modeli için ilgilendiği ana arabirimdir. Diğer arabirimler, nesnelerin farklı yönlerine erişmeye yönelik mekanizmalardır. Bu kategori için aşağıdaki arabirimler tanımlanmıştır:

DbgEng ile Veri Modeli Arasındaki Köprüler

IHostDataModelAccess

Ana Arabirimler

IModelObject

IKeyStore

IModelIterator

IModelPropertyAccessor

IModelMethod

IKeyEnumerator

IRawEnumerator

IModelKeyReference / IModelKeyReference2

Kavram Arabirimleri

IStringDisplayableConcept

IIterableConcept

IIndexableConcept

IPreferredRuntimeTypeConcept

IDataModelConcept

IDynamicKeyProviderConcept

IDynamicConceptProviderConcept

Veri Modellerinin yönetimi ve Genişletilebilirlik

Veri Modeli Yöneticisi, tüm genişletilebilirlik durumlarını yöneten temel bileşendir. Hem yerel türleri uzantı noktalarına hem de yapay yapıları uzantı noktalarına eşleyen bir tablo kümesinin merkezi deposudur. Buna ek olarak, nesnelerin kutulanmasından sorumlu olan varlıktır (sıralı değerlerin veya dizelerin IModelObject'lere dönüştürülmesi).

Bu kategori için aşağıdaki arabirimler tanımlanmıştır:

Genel Veri Modeli Yöneticisi Erişimi

IDataModelManager / IDataModelManager2

Betik Yönetimi

IDataModelScriptManager

IDataModelScriptProviderEnumerator

Hata Ayıklayıcının Tür Sistemine ve Bellek Alanlarına Erişim

Uzantıların yararlanabilmesi amacıyla hata ayıklayıcının altında yatan tür sistemi ve bellek alanları ayrıntılı olarak açığa çıkarılır. Bu kategori için aşağıdaki arabirimler tanımlanmıştır:

Genel Sunucu (Hata Ayıklayıcı) Arabirimleri

IDebugHost

IDebugHostStatus

IDebugHostContext

IDebugHostMemory / IDebugHostMemory2

IDebugHostErrorSink

IDebugHostEvaluator / IDebugHostEvaluator2

IDebugHostExtensibility

Konak (Hata Ayıklayıcı) Türü Sistem Arabirimleri

IDebugHostSymbols

IDebugHostSymbol / IDebugHostSymbol2

IDebugHostModule

IDebugHostType / IDebugHostType2

IDebugHostConstant

IDebugHostField

IDebugHostData

IDebugHostBaseClassIDebugHostPublic

IDebugHostModuleSignature

IDebugHostTypeSignature

Betik Oluşturma için Konak (Hata Ayıklayıcısı) Desteği

IDebugHostScriptHost

Betik Yazma ve Kullanma

Veri Modeli ayrıca betiğin ne olduğuna ve hata ayıklamaya ilişkin genel bir nota sahiptir. Bir hata ayıklayıcısı uzantısının ortaya çıkıp veri modeliyle başka bir dinamik dil (genellikle bir betik oluşturma ortamı) arasında genel bir köprü tanımlaması tamamen mümkündür. Bu arabirim kümesi, bunun nasıl gerçekleştirildiğinin yanı sıra hata ayıklayıcı kullanıcı arabiriminin bu tür betikleri nasıl kullanabileceğidir.

Bu kategori için aşağıdaki arabirimler tanımlanmıştır:

Genel Betik Arabirimleri

IDataModelScriptProvider

IDataModelScript

IDataModelScriptClient

IDataModelScriptHostContext

IDataModelScriptTemplate

IDataModelScriptTemplateEnumerator

IDataModelNameBinder

Betik Hata Ayıklayıcısı Arabirimleri

IDataModelScriptDebug

IDataModelScriptDebugClient

IDataModelScriptDebugStack

IDataModelScriptDebugStackFrame

IDataModelScriptDebugVariableSetEnumerator

IDataModelScriptDebugBreakpoint

IDataModelScriptDebugBreakpointEnumerator

DbgModelClientEx Kitaplığını Kullanma

Genel bakış

Veri modeline yönelik Veri Modeli C++ Nesne Arabirimlerinin uygulanması çok ayrıntılı olabilir. Veri modelinin tam olarak değiştirilmesine izin verirken, veri modelini genişletmek için bir dizi küçük arabirimin uygulanması gerekir (örn. eklenen her dinamik getirilebilir özellik için bir IModelPropertyAccessor uygulaması). Buna ek olarak, HRESULT tabanlı programlama modeli hata denetimi için kullanılan önemli miktarda kazan plakası kodu ekler.

Bazı işleri en aza indirmek için, veri modeli için tam bir C++ istisna ve şablon programlama paradigması kullanan bir C++ yardımcı kitaplığı bulunmaktadır. Bu kitaplığın kullanılması, veri modelini kullanırken veya genişletirken daha kısa kodlara olanak tanır ve önerilir.

Yardımcı kitaplığında iki önemli ad alanı vardır:

Debugger::DataModel::ClientEx - veri modelinin kullanımı için yardımcılar

Debugger::DataModel::ProviderEx - veri modelinin genişletilmesi için yardımcılar

DbgModelClientEx kütüphanesini kullanma hakkında ek bilgi için bu GitHub sitesindeki README dosyasına bakın.

https://github.com/Microsoft/WinDbg-Libraries/tree/master/DbgModelCppLib

HelloWorld C++ Örneği

DbgModelClientEx kitaplığının nasıl kullanılabileceğini görmek için burada HelloWorld C++ Veri Modeli örneğini gözden geçirin.

https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld

Örnek şunları içerir:

  • HelloProvider.cpp - Bu, hata ayıklayıcının işlem anlayışı için yeni bir örnek özellik "Hello" ekleyen bir sınıf sağlayıcı uygulamasıdır.

  • SimpleIntroExtension.cpp - Bu, hata ayıklayıcının işlem fikri için yeni bir örnek özellik "Hello" ekleyen basit bir hata ayıklayıcı uzantısıdır. Bu uzantı, Veri Modeli C++17 Yardımcı Kitaplığı'na göre yazılır. Gerekli olan bağlama kodunun hacmi (ve karmaşıklığı) nedeniyle bu kütüphaneye karşı uzantılar yazmak, ham COM ABI'ye nazaran çok daha tercih edilebilir.

JavaScript ve COM Örnekleri

Veri modeliyle hata ayıklayıcı uzantısı yazmanın çeşitli yollarını daha iyi anlamak için burada HelloWorld uzantısının üç sürümü vardır:

https://github.com/Microsoft/WinDbg-Samples/tree/master/DataModelHelloWorld

  • JavaScript - JavaScript ile yazılmış bir sürüm

  • C++17 - Veri Modeli C++17 İstemci Kitaplığı'na karşı yazılmış bir sürüm

  • COM - Doğrudan COM ABI'ye göre yazılmış bir sürüm (sadece COM yardımcıları için WRL kullanılarak)


Ayrıca bkz.

Hata Ayıklayıcı Veri Modeli C++ Arabirimleri

Hata Ayıklayıcı Veri Modeli C++ Nesneleri

Hata Ayıklayıcı Veri Modeli C++ Ek Arabirimleri

Hata Ayıklayıcısı Veri Modeli C++ Kavramları

Hata Ayıklayıcı Veri Modeli C++ Betiği