Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
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.
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: 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.
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.
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.
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
Ana Arabirimler
IModelKeyReference / IModelKeyReference2
Kavram Arabirimleri
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
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
IDebugHostMemory / IDebugHostMemory2
IDebugHostEvaluator / IDebugHostEvaluator2
Konak (Hata Ayıklayıcı) Türü Sistem Arabirimleri
IDebugHostSymbol / IDebugHostSymbol2
IDebugHostType / IDebugHostType2
IDebugHostBaseClassIDebugHostPublic
Betik Oluşturma için Konak (Hata Ayıklayıcısı) Desteği
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
IDataModelScriptTemplateEnumerator
Betik Hata Ayıklayıcısı Arabirimleri
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ı