Aracılığıyla paylaş


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

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 genel bakış sağlanır.

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

Hata Ayıklayıcı Veri Modeli Ana Bilgisayarı

Hata Ayıklayıcı Veri Modeli, çeşitli bağlamlarda barındırılabilir bileşenleştirilmiş bir sistem olacak şekilde tasarlanmıştır. Normalde, Veri Modeli bir hata ayıklayıcı uygulaması bağlamında barındırılır. Veri modelinin bir konağı olmak için, hata ayıklayıcının temel yönlerini ortaya çıkarmak için bir dizi arabirimin uygulanması gerekir: hedeflemesi, bellek alanları, değerlendiricisi, sembolik ve tür sistemi vb... Bu arabirimler veri modelini barındırmak isteyen herhangi bir uygulama tarafından uygulanırken, hem çekirdek veri modeli hem de veri modeliyle birlikte çalıştırılan tüm uzantılar tarafından kullanılır.

Çekirdek arabirim kümesi şunlardır:

Arabirim Adı Açıklama
IDebugHost Hata ayıklama konağı için çekirdek arabirim.
IDebugHostStatus İstemcinin konağın durumunu sorgulamasına olanak sağlayan arabirim.
IDebugHostContext Konak içindeki bir bağlamın soyutlanması (örn. belirli bir hedef, belirli bir işlem, belirli bir adres alanı vb.)
IDebugHostErrorSink Çağıranlar tarafından konağın ve veri modelinin belirli bölümlerinden hata almak için uygulanan arabirim
IDebugHostEvaluator / IDebugHostEvaluator2 Hata ayıklama konağı ifade değerlendiricisi.
IDebugHostExtensibility Konağın veya bazı bölümlerinin (ifade değerlendiricisi gibi) özelliklerini genişletmeye yönelik bir arabirim.

Tür sistemi ve sembolik arabirimler şunlardır:

InterfaceName Açıklama
IDebugHostSymbols Sembollere erişim ve sembollerin çözülmesini sağlayan çekirdek arabirim
IDebugHostSymbol / IDebugHostSymbol2 Her türden tek bir simgeyi temsil eder. Özel simge, bu arabirimin türetilmesidir.
IDebugHostModule bir işlem içinde yüklenen modülü temsil eder. Bu bir çeşit sembol.
IDebugHostType / IDebugHostType2 Yerel/dil türünü temsil eder.
IDebugHostConstant Sembolik bilgiler içindeki bir sabiti temsil eder (ör. C++'da tür olmayan şablon bağımsız değişkeni)
IDebugHostField Bir yapı veya sınıf içindeki bir alanı temsil eder.
IDebugHostData Bir modül içindeki verileri temsil eder (bu bir yapı veya sınıf içinde olup olmadığı IDebugHostField olabilir)
IDebugHostBaseClass Bir temel sınıfı temsil eder.
IDebugHostPublic PDB'nin publics tablosundaki bir simgeyi temsil eder. Bu, kendisiyle ilişkilendirilmiş tür bilgilerine sahip değil. Bu bir ad ve adrestir.
IDebugHostModuleSignature Modül imzalarını temsil eder; bir modül kümesini ada ve/veya sürüme göre eşleştirecek bir tanımdır
IDebugHostTypeSignature Tür imzalarını temsil eder; modüle ve/veya ada göre bir tür kümesiyle eşleşecek bir tanımdır

Çekirdek Konak Arabirimini : IDebugHost

IDebugHost arabirimi, herhangi bir veri modeli ana bilgisayarının temel arabirimidir. Aşağıdaki gibi tanımlanır:

DECLARE_INTERFACE_(IDebugHost, IUnknown)
{
    STDMETHOD(GetHostDefinedInterface)(_COM_Outptr_ IUnknown** hostUnk) PURE;
    STDMETHOD(GetCurrentContext)(_COM_Outptr_ IDebugHostContext** context) PURE;
    STDMETHOD(GetDefaultMetadata)(_COM_Outptr_ IKeyStore** defaultMetadataStore) PURE;
}

GetHostDefinedInterface

GetHostDefinedInterface yöntemi, verilen konak için varsa konağın ana özel arabirimini döndürür. Windows için Hata Ayıklama Araçları için, burada döndürülen arabirim bir IDebugClient 'dır (IUnknown'a yayınlanır).

GetCurrentContext

GetCurrentContext yöntemi, hata ayıklayıcı konağın geçerli durumunu temsil eden bir arabirim döndürür. Bunun tam anlamı konağa bırakılır, ancak genellikle hata ayıklama konağı kullanıcı arabiriminde etkin olan oturum, işlem ve adres alanı gibi öğeleri içerir. Döndürülen bağlam nesnesi, çağıran için büyük ölçüde opaktır, ancak hata ayıklama konağına çağrılar arasında geçiş yapmak önemli bir nesnedir. Arayan, örneğin okuma belleği olduğunda, belleğin hangi işlemden ve adres alanından okunduğunu bilmek önemlidir. Bu not, bu yöntemden döndürülen bağlam nesnesinin bağlamında kapsüllenmiş.

GetDefaultMetadata

GetDefaultMetadata yöntemi, açık meta veriler geçirilmediğinde belirli işlemler (örneğin: dize dönüştürme) için kullanılabilecek bir varsayılan meta veri deposu döndürür. Bu, hata ayıklama ana bilgisayarının bazı verilerin sunulma şekli üzerinde biraz denetim sahibi olmasını sağlar. Örneğin, varsayılan meta veriler bir PreferredRadix anahtarı içerebilir ve konağın sıraların başka bir şekilde belirtilmemişse ondalık veya onaltılık olarak görüntülenmesi gerekip gerekmediğini belirtmesine olanak tanır.

Varsayılan meta veri deposundaki özellik değerlerinin el ile çözümlenmesi ve varsayılan meta verilerin sorgulandığı nesneyi geçirmesi gerektiğini unutmayın. GetKey yöntemi GetKeyValue yerine kullanılmalıdır.

Durum Arabirimini : IDebugHostStatus

IDebugHostStatus arabirimi, veri modelinin veya hata ayıklama ana bilgisayarının istemcisinin, hata ayıklama konağı durumunun belirli yönlerini sorgulamasına olanak tanır. Arabirim aşağıdaki gibi tanımlanır:

DECLARE_INTERFACE_(IDebugHostStatus, IUnknown)
{
    STDMETHOD(PollUserInterrupt)(_Out_ bool* interruptRequested) PURE;
}

PollUserInterrupt

PollUserInterrupt yöntemi, hata ayıklama konağı kullanıcısının geçerli işlemde kesinti isteyip istemediğini sorgulamak için kullanılır. Örneğin, veri modelindeki bir özellik erişimcisi rastgele koda çağrı yapabilir (örneğin: JavaScript yöntemi). Bu kod rastgele bir süre alabilir. Hata ayıklama ana bilgisayarının yanıt vermesini sağlamak için, rastgele bir süre alabilen bu tür kodlar bu yöntemi çağırarak kesme isteğini denetlemelidir. interruptRequested değeri true olarak geri gelirse, çağıranın hemen durdurması ve E_ABORT sonucunu döndürmesi gerekir.

bağlam arabirimini : IDebugHostContext

Bağlam, veri modelinin ve temel alınan hata ayıklama ana bilgisayarının en önemli yönlerinden biridir. Bir nesneyi tuttuğunuzda, bir nesnenin nereden geldiğini, hangi işlemde olduğunu, hangi adres alanıyla ilişkili olduğunu bilmek önemlidir. Bu bilgilerin bilinmesi, işaretçi değerleri gibi öğelerin doğru yorumlanmasını sağlar. IDebugHostContext türünde bir nesne, hata ayıklama konağındaki birçok yönteme geçirilmelidir. Bu arabirim çeşitli yollarla edinilebilir:

  • Hata ayıklayıcının geçerli bağlamını alarak: IDebugHost'un GetCurrentContext yöntemini çağırma
  • Bir nesnenin bağlamını alarak: IModelObject'in GetContext yöntemini çağırma
  • Simge bağlamını alarak: IDebugHostSymbol'un GetContext yöntemini çağırma

Buna ek olarak, veri modelinden döndürülen veya veri modeline geçirilen ya da ana bilgisayar yönteminde hata ayıklama yapan IDebugHostContext arabirimi bağlamında özel anlamı olan iki değer vardır:

nullptr: bağlam olmadığının göstergesidir. Bazı nesnelerin bağlamı olmaması son derece geçerlidir. Veri modelinin kök ad alanında bulunan Debugger nesnesi, belirli bir işlem veya adres alanı içindeki hiçbir şeye başvurmaz. Bağlamı yok.

USE_CURRENT_HOST_CONTEXT: Hata ayıklama konasının geçerli kullanıcı arabirimi bağlamını kullanması gerektiğini belirten bir sentinel değeri. Bu değer hiçbir zaman hata ayıklama konağından döndürülmeyecek. Ancak, IDebugHost'un GetCurrentContext yöntemini açıkça çağırmak yerine IDebugHostContext girişi alan herhangi bir hata ayıklama ana bilgisayar yöntemine geçirilebilir. USE_CURRENT_HOST_CONTEXT açıkça geçirmenin genellikle geçerli bağlamı açıkça almaktan daha yüksek performanslı olduğunu unutmayın.

Konak bağlamının bağlamları büyük ölçüde çağıran için opaktır. Çekirdek hata ayıklama konağı dışındaki bir çağıranın konak bağlamı ile gerçekleştirebileceği tek işlem, bunu başka bir konak bağlamıyla karşılaştırmaktır.

IDebugHostContext arabirimi aşağıdaki gibi tanımlanır:

DECLARE_INTERFACE_(IDebugHostContext, IUnknown)
{
    STDMETHOD(IsEqualTo)(_In_ IDebugHostContext *pContext, _Out_ bool *pIsEqual) PURE;
}

IsEqualTo

IsEqualTo yöntemi bir konak bağlamını başka bir konak bağlamı ile karşılaştırır. İki bağlam eşdeğerse, bunun bir göstergesi döndürülür. Bu karşılaştırmanın arabirim eşdeğerliği olmadığını unutmayın. Bu, bağlamın temel alınan opak içeriğini karşılaştırır.

Hata Havuzu : IDebugHostErrorSink

IDebugHostErrorSink, istemcinin belirli işlemler sırasında oluşan hataların bildirimlerini alabildiği ve bu hataları gerektiğinde yönlendirebildiği bir yoldur. Arabirim aşağıdaki gibi tanımlanır:

enum ErrorClass
{
    ErrorClassWarning,
    ErrorClassError
}
DECLARE_INTERFACE_(IDebugHostErrorSink, IUnknown)
{
    STDMETHOD(ReportError)(_In_ ErrorClass errClass, _In_ HRESULT hrError, _In_ PCWSTR message) PURE;
}

HataBildir

ReportError yöntemi, hata havuzu üzerinde bir hata oluştuğuna dair bildirimde bulunan ve havuzun hatayı uygun kullanıcı arabirimine veya mekanizmaya yönlendirmesine izin veren bir geri çağırma yöntemidir.

Konak Değerlendiricisi: IDebugHostEvaluator / IDebugHostEvaluator2

Hata ayıklama ana bilgisayarının istemcilere sağladığı en önemli işlev parçalarından biri, dil tabanlı ifade değerlendiricisine erişimdir. IDebugHostEvaluator ve IDebugHostEvaluator2 arabirimleri, hata ayıklama konağından bu işlevselliğe erişmenin araçlarıdır.

Arabirimler aşağıdaki gibi tanımlanır:

DECLARE_INTERFACE_(IDebugHostEvaluator2, IDebugHostEvaluator)
{
    //
    // IDebugHostEvaluator:
    //
    STDMETHOD(EvaluateExpression)(_In_ IDebugHostContext* context, _In_ PCWSTR expression, _In_opt_ IModelObject* bindingContext, _COM_Errorptr_ IModelObject** result, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
    STDMETHOD(EvaluateExtendedExpression)(_In_ IDebugHostContext* context, _In_ PCWSTR expression, _In_opt_ IModelObject* bindingContext, _COM_Errorptr_ IModelObject** result, _COM_Outptr_opt_result_maybenull_ IKeyStore** metadata) PURE;
    //
    // IDebugHostEvaluator2:
    //
    STDMETHOD(AssignTo)(_In_ IModelObject* assignmentReference, _In_ IModelObject* assignmentValue, _COM_Errorptr_ IModelObject** assignmentResult, _COM_Outptr_opt_result_maybenull_ IKeyStore** assignmentMetadata) PURE;
}

EvaluateExpression

EvaluateExpression yöntemi, hata ayıklama konağına bir dil (ör. C++) ifadesini değerlendirmesini ve IModelObject olarak kutulanmış ifade değerlendirmesinin sonuç değerini döndürmesini ister. Yöntemin bu özel değişkeni yalnızca dil yapılarına izin verir. Dilde mevcut olmayan hata ayıklama ana bilgisayarının ifade değerlendiricisinde sunulan ek işlevler (örneğin: LINQ sorgu yöntemleri) değerlendirme için kapatılır.

EvaluateExtendedExpression

EvaluateExtendedExpression yöntemi EvaluateExpression yöntemine benzer ancak belirli bir hata ayıklama konağı tarafından ifade değerlendiricisine eklemeyi seçtiği dil dışı ek işlevleri yeniden açar. Örneğin, Windows için Hata Ayıklama Araçları için bu, anonim türleri, LINQ sorgularını, modül niteleyicilerini, biçim tanımlayıcılarını ve C/C++ olmayan diğer işlevleri etkinleştirir.

IDebugHostEvaluator2

Ata

AssignTo yöntemi, hata ayıklanan dilin semantiğine göre atama gerçekleştirir.

Konak Genişletilebilirlik Arabirimini : IDebugHostExtensibility

Hata ayıklama ana bilgisayarının belirli işlevleri isteğe bağlı olarak genişletilebilirliğe tabidir. Bu, örneğin ifade değerlendiricisini içerebilir. IDebugHostExtensibility arabirimi, bu genişletilebilirlik noktalarına erişilen araçlardır. Arabirim aşağıdaki gibi tanımlanır:

DECLARE_INTERFACE_(IDebugHostExtensibility, IUnknown)
{
    STDMETHOD(CreateFunctionAlias)(_In_ PCWSTR aliasName, _In_ IModelObject *functionObject) PURE;
    STDMETHOD(DestroyFunctionAlias)(_In_ PCWSTR aliasName) PURE;
}

CreateFunctionAlias

CreateFunctionAlias yöntemi, bazı uzantılarda uygulanan bir yöntem için "hızlı diğer ad" olan "işlev diğer adı" oluşturur. Bu diğer adın anlamı konağa özgüdür. Konağın ifade değerlendiricisini işleviyle genişletebilir veya tamamen farklı bir şey yapabilir.

DestroyFunctionAlias

DestroyFunctionAlias yöntemi, CreateFunctionAlias yöntemine önceki bir çağrıyı geri alır. İşlev artık hızlı diğer ad altında kullanılamaz.

Veri Modeline Erişmeyi

Her şeyden önce, veri modeli genişletilebilirlik API'leri, veri modelinin konağı olarak görev yapan uygulamaya (genellikle bir hata ayıklayıcısı) nötr olacak şekilde tasarlanmıştır. Teoride, herhangi bir uygulama, uygulamanın hata ayıklama hedeflerinin ve yansıtılan nesnelerin türünü veri modelinin ad alanında hangi hedefler, işlemler, iş parçacıkları vb. hakkında kullanıma sunan bir konak API'leri kümesi sağlayarak veri modelini barındırabilir. hata ayıklama hedeflerindedir.

IDataModel, IDebugHostve IModelObject'in offshoot'larını başlatan veri modeli API'leri taşınabilir olacak şekilde tasarlanırken, "hata ayıklayıcı uzantısının" ne olduğunu tanımlamaz. Bugün, Windows için Hata Ayıklama Araçları'nı ve sağladığı altyapıyı genişletmek isteyen bir bileşenin veri modeline erişim elde etmek için bir altyapı uzantısı yazması gerekir. Bu altyapı uzantısının yalnızca içinde bir altyapı uzantısı olması gerekir; bu, uzantının yükleme ve önyükleme mekanizmasıdır. Bu nedenle, en düşük düzeyde bir uygulama şunları sağlar:

  • DebugExtensionInitialize: Veri modeline erişim elde etmek ve nesne modeli işlemelerini ayarlamak için oluşturulan bir IDebugClient kullanan yöntem.
  • DebugExtensionUninitialize: DebugExtensionInitialize içinde gerçekleştirilen nesne modeli işlemelerini geri alan bir yöntem.
  • DebugExtensionCanUnload: Uzantının kaldırılıp kaldırılamayacağını döndüren bir yöntem. Uzantıda hala canlı COM nesneleri varsa, bunu belirtmesi gerekir. Bu, hata ayıklayıcının COM DllCanUnloadNow ile eşdeğeridir. Bu, kaldırılamamasının S_FALSE göstergesini döndürürse, hata ayıklayıcısı daha sonra bir yüklemenin güvenli olup olmadığını veya DebugExtensionInitialize'ı yeniden çağırarak uzantıyı yeniden başlatıp başlatamadığını görmek için bunu sorgulayabilir. Uzantı her iki yolu da işlemeye hazır olmalıdır.
  • DebugExtensionUnload: DLL kaldırılmadan hemen önce gereken son temizleme işlemlerini yapan bir yöntem

Köprü Arabirimini : IHostDataModelAccess

Belirtildiği gibi DebugExtensionInitialize çağrıldığında bir hata ayıklama istemcisi oluşturur ve veri modeline erişim elde eder. Bu tür erişim, Windows için Hata Ayıklama Araçları'nın eski IDebug* arabirimleri ile veri modeli arasında bir köprü arabirimi tarafından sağlanır. Bu köprü arabirimi 'IHostDataModelAccess'tir ve aşağıdaki gibi tanımlanır:

DECLARE_INTERFACE_(IHostDataModelAccess, IUnknown)
{
   STDMETHOD(GetDataModel)(_COM_Outptr_ IDataModelManager** manager, _COM_Outptr_ IDebugHost** host) PURE;
}

GetDataModel

GetDataModel yöntemi, veri modelinin her iki tarafına da erişim sağlayan köprü arabirimindeki yöntemdir: Hata ayıklama konağı (hata ayıklayıcının alt kenarı), döndürülen IDebugHost arabirimi Veri modelinin ana bileşeni olan veri modeli yöneticisi, döndürülen IDataModelManager arabirimi tarafından ifade edilir

Hata Ayıklayıcı Veri Modeli Sistem Arabirimlerini

Veri Modeli Ana Bilgisayarı

Hata Ayıklayıcı Veri Modeli, çeşitli bağlamlarda barındırılabilir bileşenleştirilmiş bir sistem olacak şekilde tasarlanmıştır. Normalde, Veri Modeli bir hata ayıklayıcı uygulaması bağlamında barındırılır. Veri modelinin bir konağı olmak için, hata ayıklayıcının temel yönlerini ortaya çıkarmak için bir dizi arabirimin uygulanması gerekir: hedeflemesi, bellek alanları, değerlendiricisi, sembolik ve tür sistemi vb... Bu arabirimler veri modelini barındırmak isteyen herhangi bir uygulama tarafından uygulanırken, hem çekirdek veri modeli hem de veri modeliyle birlikte çalıştırılan tüm uzantılar tarafından kullanılır.

Tür sistemi ve sembolik arabirimler şunlardır:

Arabirim Adı Açıklama
IDebugHostSymbols Sembollere erişim ve sembollerin çözülmesini sağlayan çekirdek arabirim
IDebugHostSymbol / IDebugHostSymbol2 Her türden tek bir simgeyi temsil eder. Özel simge, bu arabirimin türetilmesidir.
IDebugHostModule bir işlem içinde yüklenen modülü temsil eder. Bu bir çeşit sembol.
IDebugHostType / IDebugHostType2 Yerel/dil türünü temsil eder.
IDebugHostConstant Sembolik bilgiler içindeki bir sabiti temsil eder (ör. C++'da tür olmayan şablon bağımsız değişkeni)
IDebugHostField Bir yapı veya sınıf içindeki bir alanı temsil eder.
IDebugHostData Bir modül içindeki verileri temsil eder (bu bir yapı veya sınıf içinde olup olmadığı IDebugHostField olabilir)
IDebugHostBaseClass Bir temel sınıfı temsil eder.
IDebugHostPublic PDB'nin publics tablosundaki bir simgeyi temsil eder. Bu, kendisiyle ilişkilendirilmiş tür bilgilerine sahip değil. Bu bir ad ve adrestir.
IDebugHostModuleSignature Modül imzalarını temsil eder; bir modül kümesini ada ve/veya sürüme göre eşleştirecek bir tanımdır
IDebugHostTypeSignature Tür imzalarını temsil eder; modüle ve/veya ada göre bir tür kümesiyle eşleşecek bir tanımdır

Diğer temel arabirimler şunlardır:

Arabirim Adı Açıklama
IDebugHost Hata ayıklama konağı için çekirdek arabirim.
IDebugHostStatus İstemcinin konağın durumunu sorgulamasına olanak sağlayan arabirim.
IDebugHostContext Konak içindeki bir bağlamın soyutlanması (örn. belirli bir hedef, belirli bir işlem, belirli bir adres alanı vb.)
IDebugHostErrorSink Çağıranlar tarafından konağın ve veri modelinin belirli bölümlerinden hata almak için uygulanan arabirim
IDebugHostEvaluator / IDebugHostEvaluator2 Hata ayıklama konağı ifade değerlendiricisi.
IDebugHostExtensibility Konağın veya bazı bölümlerinin (ifade değerlendiricisi gibi) özelliklerini genişletmeye yönelik bir arabirim.

Ana Sembolik Arabirimi : IDebugHostSymbols

IDebugHostSymbols arabirimi, hata ayıklama hedefindeki sembollere erişmek için ana başlangıç noktasıdır. Bu arabirim bir IDebugHost örneğinden sorgulanabilir ve aşağıdaki gibi tanımlanır:

DECLARE_INTERFACE_(IDebugHostSymbols, IUnknown)
{
    STDMETHOD(CreateModuleSignature)(_In_z_ PCWSTR pwszModuleName, _In_opt_z_ PCWSTR pwszMinVersion, _In_opt_z_ PCWSTR pwszMaxVersion, _Out_ IDebugHostModuleSignature** ppModuleSignature) PURE;
    STDMETHOD(CreateTypeSignature)(_In_z_ PCWSTR signatureSpecification, _In_opt_ IDebugHostModule* module, _Out_ IDebugHostTypeSignature** typeSignature) PURE;
    STDMETHOD(CreateTypeSignatureForModuleRange)(_In_z_ PCWSTR signatureSpecification, _In_z_ PCWSTR moduleName, _In_opt_z_ PCWSTR minVersion, _In_opt_z_ PCWSTR maxVersion, _Out_ IDebugHostTypeSignature** typeSignature) PURE;
    STDMETHOD(EnumerateModules)(_In_ IDebugHostContext* context, _COM_Outptr_ IDebugHostSymbolEnumerator** moduleEnum) PURE;
    STDMETHOD(FindModuleByName)(_In_ IDebugHostContext* context, _In_z_ PCWSTR moduleName, _COM_Outptr_ IDebugHostModule **module) PURE;
    STDMETHOD(FindModuleByLocation)(_In_ IDebugHostContext* context, _In_ Location moduleLocation, _COM_Outptr_ IDebugHostModule **module) PURE;
    STDMETHOD(GetMostDerivedObject)(_In_opt_ IDebugHostContext *pContext, _In_ Location location, _In_ IDebugHostType* objectType, _Out_ Location* derivedLocation, _Out_ IDebugHostType** derivedType) PURE;
}

CreateModuleSignature

CreateModuleSignature yöntemi, belirli bir modül kümesini ada ve isteğe bağlı olarak sürüme göre eşleştirmek için kullanılabilecek bir imza oluşturur. Modül imzası için üç bileşen vardır:

  • Ad: Eşleşen modülün, imzadaki ada karşı tam büyük/küçük harfe duyarsız bir eşleşme olan bir adı olmalıdır
  • En düşük sürüm: Belirtilirse, eşleşen modülün en az bu sürüm kadar yüksek bir en düşük sürüme sahip olması gerekir. Sürümler "A.B.C.D" biçiminde belirtilir ve sonraki bölümlerin her biri öncekinden daha az önemlidir. Yalnızca ilk segment zorunludur.
  • En yüksek sürüm: Belirtilirse, eşleşen modülün bu sürümden yüksek olmayan en yüksek sürümü olmalıdır. Sürümler "A.B.C.D" biçiminde belirtilir ve sonraki bölümlerin her biri öncekinden daha az önemlidir. Yalnızca ilk segment zorunludur.

CreateTypeSignature

CreateTypeSignature yöntemi, modül ve tür adı içererek bir dizi somut türü eşleştirmek için kullanılabilecek bir imza oluşturur. Tür adı imza dizesinin biçimi, hata ayıklanan dile (ve hata ayıklama konağına) özgüdür. C/C++ için imza dizesi NatVis Tür Belirtimine eşdeğerdir. Diğer bir ifadeyle, imza dizesi, şablon bağımsız değişkenleri için joker karakterlere (*olarak belirtilen) izin verilen bir tür adıdır.

CreateTypeSignatureForModuleRange

CreateTypeSignatureForModuleRange yöntemi, modül imzası ve tür adına göre bir dizi somut türü eşleştirmek için kullanılabilecek bir imza oluşturur. Bu, CreateTypeSignature yöntemine benzer ancak çağıran, imzayla eşleşecek belirli bir modülü geçirmek yerine modül imzası oluşturmak için gereken bağımsız değişkenleri geçirir (modül imzası CreateModuleSignature yöntemiyle oluşturulmuş gibi).

EnumerateModules

EnumerateModules yöntemi, belirli bir konak bağlamında kullanılabilen her modülü numaralandıracak bir numaralandırıcı oluşturur. Bu konak bağlamı bir işlem bağlamını veya Windows çekirdeği gibi bir şeyi kapsüller.

FindModuleByName

FindModuleByName yöntemi verilen konak bağlamını gözden geçirir ve belirtilen ada sahip bir modülü bulur ve bir arabirim döndürür. Dosya uzantısıyla veya dosya uzantısı olmadan modülü ada göre aramak yasaldır.

FindModuleByLocation

FindModuleByLocation yöntemi, verilen konak bağlamını gözden geçirir ve belirtilen konum tarafından verilen adresi hangi modülün içerdiğini belirler. Daha sonra bu modüle bir arabirim döndürür.

GetMostDerivedObject

GetMostDerivedObject, statik türünden bir nesnenin çalışma zamanı türünü belirlemek için hata ayıklayıcının tür sistemini kullanır. Bu yöntem, bu analizi gerçekleştirmek için yalnızca tür sistemi katmanında bulunan sembolik bilgileri ve buluşsal yöntemleri kullanır. Bu bilgiler C++ RTTI (çalışma zamanı türü bilgileri) veya nesnenin sanal işlev tablolarının şeklinin analizini içerebilir. IModelObject üzerinde tercih edilen çalışma zamanı türü kavramı gibi öğeleri içermez. Çözümleme bir çalışma zamanı türünü bulamazsa veya yönteme geçirilen statik türden farklı bir çalışma zamanı türü bulamazsa, giriş konumu ve türü geçirilebilir. Yöntemi bu nedenlerle başarısız olmaz.

Çekirdek Tek Simge Arabirimini : IDebugHostSymbol

Veri modeli konağından döndürülebilen her simge, IDebugHostSymbol'dan bir şekilde türetilir. Bu, sembol türünden bağımsız olarak her sembolün uyguladığı temel arabirimdir. Simgenin türüne bağlı olarak, belirli bir simge, bu arabirim tarafından temsil edilen belirli bir simge türüne daha benzersiz öznitelikler döndüren bir dizi başka arabirim uygulayabilir. IDebugHostSymbol2 / IDebugHostSymbol arabirimi aşağıdaki gibi tanımlanır:

DECLARE_INTERFACE_(IDebugHostSymbol2, IDebugHostSymbol)
{
    // 
    // IDebugHostSymbol:
    //
    STDMETHOD(GetContext)(_COM_Outptr_ IDebugHostContext** context) PURE;
    STDMETHOD(EnumerateChildren)(_In_ SymbolKind kind, _In_opt_z_ PCWSTR name, _Out_ IDebugHostSymbolEnumerator **ppEnum) PURE;
    STDMETHOD(GetSymbolKind)(_Out_ SymbolKind *kind) PURE;
    STDMETHOD(GetName)(_Out_ BSTR* symbolName) PURE;
    STDMETHOD(GetType)(_Out_ IDebugHostType** type) PURE;
    STDMETHOD(GetContainingModule)(_Out_ IDebugHostModule **containingModule) PURE;
    STDMETHOD(CompareAgainst)(_In_ IDebugHostSymbol *pComparisonSymbol, _In_ ULONG comparisonFlags, _Out_ bool *pMatches) PURE;
    //
    // IDebugHostSymbol2
    //
    STDMETHOD(EnumerateChildrenEx)(_In_ SymbolKind kind, _In_opt_z_ PCWSTR name, _In_opt_ SymbolSearchInfo* searchInfo, _Out_ IDebugHostSymbolEnumerator **ppEnum) PURE;
}

Bu arabirimin, aşağıdaki değerlere sahip SymbolKind sabit listesiyle ayrılmış birçok simge türünü temsil ettiğini unutmayın:

Numaralandırıcı Anlamı
Sembol Belirtilmemiş simge türü
SymbolModule Sembol bir modüldür ve IDebugHostModule için sorgulanabilir
SymbolType Simge bir türdür ve IDebugHostType için sorgulanabilir
SymbolField Simge bir alan (bir yapı veya sınıf içindeki veri üyesi) ve IDebugHostField için sorgulanabilir
SymbolConstant Simge sabit bir değerdir ve IDebugHostConstant için sorgulanabilir
SymbolData Sembol, bir yapı veya sınıfın üyesi olmayan ve IDebugHostData için sorgulanabilir verilerdir
SymbolBaseClass Simge bir temel sınıftır ve IDebugHostBaseClass için sorgulanabilir
SymbolPublic Sembol, modülün publics tablosundaki bir girdidir (tür bilgisi yoktur) ve IDebugHostPublic için sorgulanabilir
SymbolFunction Simge bir işlevdir ve IDebugHostData için sorgulanabilir

GetContext

GetContext yöntemi, sembolün geçerli olduğu bağlamı döndürür. Bu, simgenin bulunduğu hata ayıklama hedefi ve işlem/adres alanı gibi öğeleri temsil etse de, diğer araçlardan alınan bağlam kadar belirli olmayabilir (örneğin: IModelObject).

EnumerateChildren

EnumerateChildren yöntemi, belirli bir simgenin tüm alt öğelerini numaralandıracak bir numaralandırıcı döndürür. Örneğin, bir C++ türü için temel sınıflar, alanlar, üye işlevleri ve benzerlerinin tümü tür simgesinin alt öğeleri olarak kabul edilir.

Modül Arabirimini : IDebugHostModule

Hata ayıklayıcının bazı adres alanına yüklenen modüller, veri modelinde iki farklı şekilde gösterilir: IDebugHostModule arabirimi aracılığıyla tür sistemi düzeyinde. Burada modül bir semboldür ve modülün temel öznitelikleri Debugger.Models.Module veri modeli aracılığıyla veri modeli düzeyinde Yansıtılan arabirim yöntemi çağrılarıdır. Bu, bir modülün IDebugHostModule tür sisteminin genişletilebilir bir kapsüllemesidir.

IDebugHostModule arabirimi aşağıdaki gibi tanımlanır (IDebugHostSymbol için genel olan yöntemler yoksayılır):

DECLARE_INTERFACE_(IDebugHostModule, IDebugHostSymbol)
{
    //
    // IDebugHostModule:
    //
    STDMETHOD(GetImageName)(_In_ bool allowPath, _Out_ BSTR* imageName) PURE;
    STDMETHOD(GetBaseLocation)(_Out_ Location* moduleBaseLocation) PURE;
    STDMETHOD(GetVersion)(_Out_opt_ ULONG64* fileVersion, _Out_opt_ ULONG64* productVersion) PURE;
    STDMETHOD(FindTypeByName)(_In_z_ PCWSTR typeName, _Out_ IDebugHostType** type) PURE;
    STDMETHOD(FindSymbolByRVA)(_In_ ULONG64 rva, _Out_ IDebugHostSymbol** symbol) PURE;
    STDMETHOD(FindSymbolByName)(_In_z_ PCWSTR symbolName, _Out_ IDebugHostSymbol** symbol) PURE;
}

GetImageName

GetImageName yöntemi modülün görüntü adını döndürür. allowPath bağımsız değişkeninin değerine bağlı olarak, döndürülen görüntü adı resmin tam yolunu içerebilir veya içermeyebilir.

GetBaseLocation

GetBaseLocation yöntemi, modülün temel yük adresini konum yapısı olarak döndürür. Modülün döndürülen konum yapısı genellikle bir sanal adrese başvurur.

GetVersion

GetVersion yöntemi modül hakkındaki sürüm bilgilerini döndürür (bu tür bilgilerin üst bilgilerden başarıyla okunabileceği varsayılır). Belirli bir sürüm istenirse (nullpr olmayan bir çıkış işaretçisi aracılığıyla) ve okunamazsa, yöntem çağrısından uygun bir hata kodu döndürülür.

FindTypeByName

FindTypeByName yöntemi, modül içinde tür adına göre tanımlanan bir tür bulur ve bunun için bir tür simgesi döndürür. Bu yöntem, modülün alt öğelerinin açık özyinelemesi yoluyla hiçbir zaman döndürülmeyecek geçerli bir IDebugHostType döndürebilir. Hata ayıklama konağı, modül içinde hiç kullanılmayan ancak türlerden türetilen türler olan türev türlerin oluşturulmasına izin verebilir. Örneğin, MyStruct yapısı modülün simgelerinde tanımlanıyorsa ancak MyStruct ** türü hiçbir zaman kullanılmıyorsa, FindTypeByName yöntemi, modülün simgelerinde hiçbir zaman açık bir şekilde görünmese de, FindTypeByName yöntemi MyStruct ** için geçerli bir tür simgesi döndürebilir.

FindSymbolByRVA

FindSymbolByRVA yöntemi, modül içindeki verilen göreli sanal adreste tek bir eşleşen simge bulur. Sağlanan RVA'da tek bir simge yoksa (örneğin: birden çok eşleşme varsa), bu yöntem tarafından bir hata döndürülür. Bu yöntemin publics tablosundaki bir simge yerine özel bir simge döndürmeyi tercih edeceğine dikkat edin.

FindSymbolByName

FindSymbolByName yöntemi modülde verilen adın tek bir genel simgesini bulur. Verilen adla eşleşen tek bir simge yoksa, bu yöntem tarafından bir hata döndürülür. Bu yöntemin publics tablosundaki bir simge yerine özel bir simge döndürmeyi tercih edeceğine dikkat edin.

Tür Sistemine Erişimi: IDebugHostType2 / IDebugHostType

Belirli bir dil/yerel tür, IDebugHostType2 veya IDebugHostType arabirimleri tarafından açıklanır. Bu arabirimlerdeki yöntemlerden bazılarının yalnızca belirli tür türleri için geçerli olduğunu unutmayın. Belirli bir tür simgesi, TypeKind sabit listesi tarafından açıklandığı gibi aşağıdaki türlerden birine başvurabilir:

Tür Türü Açıklama
TypeUDT Kullanıcı tanımlı bir tür (yapı, sınıf, birleşim vb.). Türü TypeUDT olan yerel türe sahip bir model nesnesi, türün her zaman ilgili IModelObject içinde tutulduğu ObjectTargetObject'in kurallı bir gösterimine sahiptir.
TypePointer İşaretçi. Türü TypePointer olan yerel türe sahip bir model nesnesi, işaretçinin değerinin sıfır olduğu objectIntrinsic'in kurallı bir gösterimine sahiptir; burada işaretçinin değeri VT_UI8 genişletilir ve bu 64 bit biçiminde iç veri olarak tutulur. TypePointer'ın herhangi bir tür simgesi, işaretçinin işaret ettiği türden bir temel türe (GetBaseType yöntemi tarafından döndürülen şekilde) sahiptir.
TypeMemberPointer Sınıf üyesine bir işaretçi. Türü TypeMemberPointer olan yerel bir türe sahip model nesnesi, içsel (işaretçi değeriyle aynı olan değer) kurallı bir gösterime sahiptir. Bu değerin tam anlamı derleyici/hata ayıklama konağına özgüdür.
TypeArray Bir dizi. Türü TypeArray olan yerel türe sahip bir model nesnesi ObjectTargetObject'in kurallı bir gösterimine sahiptir. Dizinin temel adresi nesnenin konumudur (GetLocation yöntemiyle alınır) ve dizi türü her zaman tutulur. TypeArray'nin herhangi bir tür simgesi, dizinin dizisi olduğu türden bir temel türe (GetBaseType yöntemi tarafından döndürülen şekilde) sahiptir.
TypeFunction Bir işlev.
TypeTypedef Bir tür tanımı. Türü TypeTypedef olan yerel bir türe sahip model nesnesi, tür tanımına temel alınan son türün kurallı gösterimiyle aynı kurallı bir gösterime sahiptir. Bu, IDebugHostType2'nin açık tür tanımı yöntemleri tür tanımı bilgilerini sorgulamak için kullanılmadığı veya typedef'e kayıtlı açık bir veri modeli olmadığı sürece nesnenin son kullanıcısına ve tür bilgilerine tamamen saydam görünür. GetTypeKind yönteminin hiçbir zaman TypeTypedef döndürmeyeceğini unutmayın. Her yöntem, tür tanımında temel alınan son türün döndüreceği değeri döndürür. IDebugHostType2'de typedef'e özgü bilgileri almak için kullanılabilecek typedef'e özgü yöntemler vardır.
TypeEnum Sabit listesi. Türü TypeEnum olan yerel türe sahip bir model nesnesi, iç değerin ve türünün sabit listesi değeriyle aynı olduğu ObjectIntrinsic'in kurallı bir gösterimine sahiptir.
TypeIntrinsic bir iç (temel tür). Türü TypeIntrinsic olan yerel türe sahip bir model nesnesi ObjectIntrinsic'in kurallı gösterimine sahiptir. Tür bilgileri tutulabilir veya tutulamayabilir; özellikle de temel alınan tür, IModelObject içinde depolanan iç verilerin değişken veri türü (VT_*) tarafından tam olarak açıklanıyorsa

Genel IDebugHostType2 / IDebugHostType arabirimi aşağıdaki gibi tanımlanır (IDebugHostSymbol yöntemleri hariç):

DECLARE_INTERFACE_(IDebugHostType2, IDebugHostType)
{
    //
    // IDebugHostType:
    //
    STDMETHOD(GetTypeKind)(_Out_ TypeKind *kind) PURE;
    STDMETHOD(GetSize)(_Out_ ULONG64* size) PURE;
    STDMETHOD(GetBaseType)(_Out_ IDebugHostType** baseType) PURE;
    STDMETHOD(GetHashCode)(_Out_ ULONG* hashCode) PURE;
    STDMETHOD(GetIntrinsicType)(_Out_opt_ IntrinsicKind *intrinsicKind, _Out_opt_ VARTYPE *carrierType) PURE;
    STDMETHOD(GetBitField)(_Out_ ULONG* lsbOfField, _Out_ ULONG* lengthOfField) PURE;
    STDMETHOD(GetPointerKind)(_Out_ PointerKind* pointerKind) PURE;
    STDMETHOD(GetMemberType)(_Out_ IDebugHostType** memberType) PURE;
    STDMETHOD(CreatePointerTo)(_In_ PointerKind kind, _COM_Outptr_ IDebugHostType** newType) PURE;
    STDMETHOD(GetArrayDimensionality)(_Out_ ULONG64* arrayDimensionality) PURE;
    STDMETHOD(GetArrayDimensions)(_In_ ULONG64 dimensions, _Out_writes_(dimensions) ArrayDimension *pDimensions) PURE;
    STDMETHOD(CreateArrayOf)(_In_ ULONG64 dimensions, _In_reads_(dimensions) ArrayDimension *pDimensions, _COM_Outptr_ IDebugHostType** newType) PURE;
    STDMETHOD(GetFunctionCallingConvention)(_Out_ CallingConventionKind* conventionKind) PURE;
    STDMETHOD(GetFunctionReturnType)(_COM_Outptr_ IDebugHostType** returnType) PURE;
    STDMETHOD(GetFunctionParameterTypeCount)(_Out_ ULONG64* count) PURE;
    STDMETHOD(GetFunctionParameterTypeAt)(_In_ ULONG64 i, _Out_ IDebugHostType** parameterType) PURE;
    STDMETHOD(IsGeneric)(_Out_ bool* isGeneric) PURE;
    STDMETHOD(GetGenericArgumentCount)(_Out_ ULONG64* argCount) PURE;
    STDMETHOD(GetGenericArgumentAt)(_In_ ULONG64 i, _Out_ IDebugHostSymbol** argument) PURE;
    //
    // IDebugHostType2:
    //
    STDMETHOD(IsTypedef)(_Out_ bool* isTypedef) PURE;
    STDMETHOD(GetTypedefBaseType)(_Out_ IDebugHostType2** baseType) PURE;
    STDMETHOD(GetTypedefFinalBaseType)(_Out_ IDebugHostType2** finalBaseType) PURE;
    STDMETHOD(GetFunctionVarArgsKind)(_Out_ VarArgsKind* varArgsKind) PURE;
}

IDebugHostType2/IDebugHostType Genel Yöntemleri

Aşağıdaki IDebugHostType yöntemleri, GetTypeKind yönteminden ne tür döndürülürse döndürülsün her tür için geneldir:

STDMETHOD(GetTypeKind)(_Out_ TypeKind *kind) PURE;
STDMETHOD(GetSize)(_Out_ ULONG64* size) PURE;
STDMETHOD(GetBaseType)(_Out_ IDebugHostType** baseType) PURE;
STDMETHOD(GetHashCode)(_Out_ ULONG* hashCode) PURE;

GetTypeKind

GetTypeKind yöntemi, simgenin başvurduğu tür türünü (işaretçi, dizi, iç vb.) döndürür.

GetSize

GetSize yöntemi türün boyutunu döndürür (C++'da sizeof(tür) yapılmış gibi).

GetBaseType

Tür başka bir tek türün türeviyse (örneğin: MyStruct * MyStruct'dan türetildiğinden), GetBaseType yöntemi türetmenin temel türünü döndürür. İşaretçiler için bu, işaret edilen türü döndürür. Diziler için bu, dizinin dizisinin ne olduğunu döndürür. Tür böyle bir türev türü değilse, bir hata döndürülür.

GetHashCode

GetHashCode yöntemi, türü için 32 bit karma kodu döndürür. Genel eşleşme (örneğin: konak tarafından izin verilirse her şeyle eşleşen * ile eşdeğer bir tür imzası) dışında, belirli bir tür imzasıyla eşleşebilen her tür örneği aynı karma kodu döndürmelidir. Bu yöntem, tür imzalarını tür örnekleriyle eşleştirmek için tür imzalarıyla birlikte kullanılır.

IDebugHostType2/IDebugHostType İç Yöntemleri

Aşağıdaki IDebugHostType yöntemleri, iç türlere (veya sabit listeleri gibi iç verileri tutan türlere) özeldir:

STDMETHOD(GetIntrinsicType)(_Out_opt_ IntrinsicKind *intrinsicKind, _Out_opt_ VARTYPE *carrierType) PURE;

GetIntrinsicType

GetIntrinsicType yöntemi, türün ne tür bir iç değer olduğu hakkında bilgi döndürür. Bu yöntemden iki değer döndürülür:

  • İç tür genel türü gösterir (örneğin: tamsayı, işaretsiz, kayan nokta) ancak türün boyutunu (örneğin: 8 bit, 16 bit, 32 bit, 64 bit) değil
  • Taşıyıcı türü, iç türün VARIANT yapısına nasıl paketlediğini gösterir. Bu bir VT_* sabitidir.

İki değerin birleşimi, iç bilgiler hakkında tam bilgi kümesini sağlar.

IDebugHostType2/IDebugHostType Bitfield Yöntemleri

Aşağıdaki IDebugHostType yöntemleri, verileri bit alanlarında depolayan türlere özeldir. Bir iç içindeki bit alanı yerleşimi hakkındaki bilgiler, konumun özniteliği olmak yerine veri modelindeki tür simgesinin bir parçası olarak depolanır.

STDMETHOD(GetBitField)(_Out_ ULONG* lsbOfField, _Out_ ULONG* lengthOfField) PURE;

GetBitField

Veri yapısının belirli bir üyesi bir bit alanı (örneğin: ULONG MyBits:8) ise, alanın tür bilgileri bit alanı yerleşimi hakkındaki bilgilerle birlikte taşır. GetBitField yöntemi bu bilgileri almak için kullanılabilir. Bu yöntem bit alanı olmayan herhangi bir türde başarısız olur. Yöntemin başarısız olmasının tek nedeni budur. Yalnızca bu yöntemi çağırmak ve bit alanını bit olmayan bir alandan ayırt etmek için başarıya/başarısızlığa bakmak yeterlidir. Verilen bir türün bit alanı olması durumunda, alan konumları yarı açık küme (lsbOfField + lengthOfField : lsbOfField]

IDebugHostType2/IDebugHostType İşaretçisi İlgili Yöntemleri

Aşağıdaki IDebugHostType yöntemleri işaretçi türlerine özeldir. GetTypeKind'in TypePointer veya TypeMemberPointer' döndürdüğü türler şunlardır:

STDMETHOD(GetPointerKind)(_Out_ PointerKind* pointerKind) PURE;
STDMETHOD(GetMemberType)(_Out_ IDebugHostType** memberType) PURE;

GetPointerKind

İşaretçi olan türler için GetPointerKind yöntemi işaretçi türünü döndürür. Bu, PointerKind numaralandırması tarafından tanımlanır.

GetMemberType

Üye işaretçisi olan türler için (typeMemberPointer türüyle gösterildiği gibi), GetMemberType yöntemi işaretçinin işaretçiden üyeye olduğu sınıfı döndürür.

IDebugHostType2/IDebugHostType Dizisiyle İlgili Yöntemler

Diziler, GetTypeKind'in TypeArray döndürdüğü türlerdir. Hata ayıklama konağı tür sistemi tarafından tanımlanan dizilerin, C'nin kullandığı tek boyutlu, sıfır dizin tabanlı, paketlenmiş doğrusal tek boyutlu dizilerle aynı olmadığını unutmayın. C stili diziler tanıma sığar, ancak bir dizinin genel kapsamı IDebugHostType içinde daha geniştir. Hata ayıklama konağındaki bir dizi çok boyutlu olabilir ve dizideki her boyut ArrayDimension Olarak bilinen bir tanımlayıcı tarafından tanımlanırBu tanımlayıcı aşağıdaki alanlara sahiptir:

Saha Anlamı
LowerBound dizinin imzalı 64 bit değer olarak temel dizini. C stili bir dizi için bu her zaman sıfır olur. Olması gerekmiyor. Bir dizinin tek bir boyutu, herhangi bir 64 bit dizinden başlayıp negatif bir dizinden bile başlayabileceğiniz düşünülebilir.
Uzunluk dizi boyutunun imzasız 64 bit değer olarak uzunluğu. Dizinin dizinleri yarı açık kümeye [LowerBound, LowerBound + Length) yayılmıştır.
Adım Dizi boyutunun adımını tanımlar. Bu boyutun dizininde bir (N'den N + 1'e) artış için, bellekte kaç bayt ileriye doğru ilerleyebileceği gösterilir. C stili bir dizi için bu, dizinin her öğesinin boyutu olabilir. Olması gerekmez. Öğeler arasındaki doldurma, her bir öğenin boyutundan daha büyük bir adım olarak ifade edilebilir. Çok boyutlu diziler için bu değer, boyutun tamamının nasıl ileriye taşınacağını gösterir. M x N matrisi düşünün. Bu, satır ana biçiminde iki boyut olarak açıklanabilir:
{ [LowerBound: 0, Length: M, Stride: N \* sizeof(element)], [LowerBound: 0, Length: N, Stride: sizeof(element)]} 

veya alternatif olarak sütun ana biçiminde iki boyut olarak açıklanabilir:

{ [LowerBound: 0, Length: M, Stride: sizeof(element)], [LowerBound: 0, Length: N, Stride: M \* sizeof(element)]} 

ArrayDimension kavramı bu düzeyde esneklik sağlar.

Aşağıdaki IDebugHostType yöntemleri dizi türlerine özeldir.

STDMETHOD(GetArrayDimensionality)(\_Out_ ULONG64\* arrayDimensionality) PURE; 
STDMETHOD(GetArrayDimensions)(\_In_ ULONG64 dimensions, \_Out_writes_(dimensions) ArrayDimension \*pDimensions) PURE;

GetArrayDimensionality

GetArrayDimensionality yöntemi, dizinin dizinine eklendiği boyut sayısını döndürür. C stili diziler için burada döndürülen değer her zaman 1 olur.

GetArrayDimensions

GetArrayDimensions yöntemi, GetArrayDimensionality yöntemi tarafından gösterildiği gibi dizinin her boyutu için bir tanımlayıcı kümesi döndürür. Her tanımlayıcı, her dizi boyutunun başlangıç dizinini, uzunluğunu ve ileri adımlarını açıklayan bir ArrayDimension yapısıdır. Bu, C türü sisteminde izin verilenden çok daha güçlü dizi yapılarının açıklamalarına izin verir.

C stili diziler için, burada her zaman şu değerlere sahip tek bir dizi boyutu döndürülür:

  • LowerBound = 0
  • Uzunluk = ARRAYSIZE(dizi)
  • Stride = sizeof(elementType)

IDebugHostType2/IDebugHostType İşlevi ile İlgili Yöntemler

TypeFunction türü aracılığıyla işlev türleri olduğunu belirten türler, hem IDebugHostType hem de IDebugHostType2'de aşağıdaki yöntemleri destekler.

//
// IDebugHostType:
//
STDMETHOD(GetFunctionCallingConvention)(_Out_ CallingConventionKind* conventionKind) PURE;
STDMETHOD(GetFunctionReturnType)(_COM_Outptr_ IDebugHostType** returnType) PURE;
STDMETHOD(GetFunctionParameterTypeCount)(_Out_ ULONG64* count) PURE;
STDMETHOD(GetFunctionParameterTypeAt)(_In_ ULONG64 i, _Out_ IDebugHostType** parameterType) PURE;
//
// IDebugHostType2:
//
STDMETHOD(GetFunctionVarArgsKind)(_Out_ VarArgsKind* varArgsKind) PURE;

getFunctionCallingConvention

GetFunctionCallingConvention yöntemi işlevin çağırma kuralını döndürür. Bu, CallingConventionKind sabit listesi üyesi olarak döndürülür.

GetFunctionReturnType

GetFunctionReturnType yöntemi işlevin dönüş türünü döndürür.

GetFunctionParameterTypeCount

GetFunctionParameterTypeCount yöntemi, işlevin aldığı bağımsız değişken sayısını döndürür. C/C++ üç nokta tabanlı değişken bağımsız değişken işaretçisinin bu sayı içinde dikkate alınmadığını unutmayın. Böyle bir varlığı GetFunctionVarArgsKind yöntemiyle algılanmalıdır. Bu yalnızca üç noktadan önceki bağımsız değişkenleri içerir.

getFunctionParameterTypeAt

GetFunctionParameterTypeAt yöntemi, işlevin i. bağımsız değişkeninin türünü döndürür.

GetFunctionVarArgsKind yöntemi, belirli bir işlevin değişken bağımsız değişken listesi kullanıp kullanmadığını ve kullanıyorsa hangi değişken bağımsız değişken stilini kullanıp kullanmadığını döndürür. Bu, VarArgsKind numaralandırmasının aşağıdaki gibi tanımlanan bir üyesi tarafından tanımlanır:

Numaralandırıcı Anlamı
VarArgsNone İşlev herhangi bir değişken bağımsız değişkeni almaz.
VarArgsCStyle İşlev, C stili bir varargs işlevidir (returnType(arg1, arg2, ...)). İşlev tarafından bildirilen bağımsız değişkenlerin sayısı üç nokta bağımsız değişkenini içermez. Herhangi bir değişken bağımsız değişkeni geçirme işlemi, GetFunctionParameterTypeCount yöntemi tarafından döndürülen bağımsız değişken sayısından sonra gerçekleşir.

IDebugHostType2 GetFunctionVarArgsKind

GetFunctionVarArgsKind yöntemi, belirli bir işlevin değişken bağımsız değişken listesi kullanıp kullanmadığını ve kullanıyorsa hangi değişken bağımsız değişken stilini kullanıp kullanmadığını döndürür. Bu, VarArgsKind numaralandırmasının aşağıdaki gibi tanımlanan bir üyesi tarafından tanımlanır:

IDebugHostType2/IDebugHostType Typedef İlgili Yöntemler

Tür tanımı olan herhangi bir tür, tür, typedef'in temel aldığı son tür gibi davranır. Bu, GetTypeKind gibi yöntemlerin türün bir tür tanımı olduğunu belirtmeyeceği anlamına gelir. Benzer şekilde, GetBaseType tanımın başvurduğu türü döndürmez. Bunun yerine tür tanımına temel alınan son tanımda çağrılmışlar gibi davrandıklarını gösterirler. Örnek olarak:

typedef MYSTRUCT *PMYSTRUCT;
typedef PMYSTRUCT PTRMYSTRUCT;

'PMYSTRUCT veya PTRMYSTRUCT için bir IDebugHostType aşağıdaki bilgileri bildirecektir:

  • GetTypeKind yöntemi TypePointer döndürür. Son temel alınan MYSTRUCT * türü gerçekten de bir işaretçidir.
  • 'GetBaseType yöntemi MYSTRUCT için bir tür döndürür. MYSTRUCT * öğesinin temel türü MYSTRUCT'dır.

Buradaki tek fark, IDebugHostType2'de typedef'e özgü yöntemlerin davranışıdır. Bu yöntemler şunlardır:

STDMETHOD(IsTypedef)(_Out_ bool* isTypedef) PURE;
STDMETHOD(GetTypedefBaseType)(_Out_ IDebugHostType2** baseType) PURE;
STDMETHOD(GetTypedefFinalBaseType)(_Out_ IDebugHostType2** finalBaseType) PURE;

Bu örnekte:

  • IsTypedef yöntemi hem PMYSTRUCT hem de PTRMYSTRUCT için true döndürür
  • GetTypedefBaseType yöntemi, PMYSTRUCT için MYSTRUCT * ve PTRMYSTRUCT için PMYSTRUCT döndürür
  • GetTypedefFinalBaseType yöntemi her iki tür için MYSTRUCT * döndürür

IsTypedef

IsTypedef yöntemi, türün tür tanımı olup olmadığını görebilen tek yöntemdir. GetTypeKind yöntemi, temel alınan türde çağrılır gibi davranır.

GetTypedefBaseType

GetTypedefBaseType yöntemi typedef'in anında tanımını döndürür. Belgelerde açıklanan örneklerde:

typedef MYSTRUCT *PMYSTRUCT;
typedef PMYSTRUCT PTRMYSTRUCT;

bu yöntem, PTRMYSTRUCT için PMYSTRUCT ve PMYSTRUCT için MYSTRUCT * döndürür.

GetTypedefFinalBaseType

GetTypedefFinalBaseType yöntemi, typedef'in tanım olduğu son türü döndürür. Tür tanımı başka bir tür tanımının tanımıysa, bu, tür tanımı olmayan bir türe ulaşana kadar tanım zincirini izlemeye devam eder ve bu tür döndürülür. Belgelerde açıklanan örneklerde:

typedef MYSTRUCT *PMYSTRUCT;
typedef PMYSTRUCT PTRMYSTRUCT;

bu yöntem, PMYSTRUCT veya PTRMYSTRUCT üzerinde çağrıldığında MYSTRUCT * döndürür.

IDebugHostType2/IDebugHostType Tür Oluşturma Yöntemleri

STDMETHOD(CreatePointerTo)(_In_ PointerKind kind, _COM_Outptr_ IDebugHostType** newType) PURE;
STDMETHOD(CreateArrayOf)(_In_ ULONG64 dimensions, _In_reads_(dimensions) ArrayDimension *pDimensions, _COM_Outptr_ IDebugHostType** newType) PURE;

Sabit Simge Değerleri: IDebugHostConstant

Sembolik bilgilerde sabit değerlerin bulunduğu konumlar için (belirli bir değer sabit değer olabilecek veya olmayan bir simgedir), IDebugHostConstant arabirimi böyle bir sabitin düşüncesini ifade eder. Bu genellikle, belirli bir bağımsız değişkenin genellikle bir tür olduğu, ancak bunun yerine tür olmayan bir şablon bağımsız değişkeni (örneğin: sabit) olabileceği şablon bağımsız değişkenleri gibi yerlerde kullanılır.

IDebugHostConstant arabirimi aşağıdaki gibi tanımlanır (IDebugHostSymbol tarafından uygulanan genel yöntemler yoksayılır):

DECLARE_INTERFACE_(IDebugHostConstant, IDebugHostSymbol)
{
    STDMETHOD(GetValue)(_Out_ VARIANT* value) PURE;
}

GetValue

GetValue yöntemi, VARIANT içine paketlenmiş sabitin değerini döndürür. IDebugHostSymbol üzerindeki GetType yönteminin sabit için belirli bir tür simgesi döndürebileceğini unutmayın. Bu gibi durumlarda, tür simgesi tarafından tanımlanan sabit değerin paketlemesi, burada GetValue yöntemi tarafından döndürülen paketleme ile aynı olur.

Veri Üyesi Erişimi: IDebugHostField

IDebugHostField sınıfı, bir sınıfın, yapının, birleşimin veya başka bir tür yapısının veri üyesi olan bir simgeyi temsil eder. Ücretsiz verileri (ör. genel veriler) temsil etmez. Arabirim aşağıdaki gibi tanımlanır (IDebugHostSymbol için genel yöntemler yoksayılır):

DECLARE_INTERFACE_(IDebugHostField, IDebugHostSymbol)
{
    STDMETHOD(GetLocationKind)(_Out_ LocationKind *locationKind) PURE;
    STDMETHOD(GetOffset)(_Out_ ULONG64* offset) PURE;
    STDMETHOD(GetLocation)(_Out_ Location* location) PURE;
    STDMETHOD(GetValue)(_Out_ VARIANT* value) PURE;
}

GetLocationKind

GetLocationKind yöntemi, LocationKind numaralandırmasına göre sembolün ne tür bir konumda olduğunu döndürür. Bu tür bir numaralandırma aşağıdaki değerlerden biri olabilir:

Numaralandırıcı Anlamı
LocationMember alanı, bir sınıf, yapı, birleşim veya başka bir tür yapısının normal veri üyesidir. İçeren tür yapısının temel adresine göre bir uzaklığı vardır. Bu tür temel adres genellikle bu işaretçi tarafından temsil edilir. Alanın uzaklığı GetOffset yöntemiyle alınabilir. GetLocation ve GetValue yöntemleri, LocationMember olan bir alan için başarısız olur.
LocationStatic Alan statiktir ve kendi adresine sahiptir. GetLocation yöntemi statik alanın soyut konumunu (örn. adres) döndürür. GetOffset ve GetValue yöntemleri LocationStatic olan bir alan için başarısız olur.
LocationConstant Alan bir sabittir ve bir değere sahiptir. GetValue yöntemi sabitin değerini döndürür. GetOffset ve GetLocation yöntemleri LocationConstant olan bir alan için başarısız olur
LocationNone Alanın konumu yok. Derleyici tarafından iyileştirilmiş olabilir veya bildirilen ancak hiç tanımlanmayan statik bir alan olabilir. Böyle bir alanın nasıl olduğuna bakılmaksızın, fiziksel varlığı veya değeri yoktur. Yalnızca sembollerde bulunur. LocationNone olan bir alan için tüm alma yöntemleri (GetOffset, GetLocation ve GetValue) başarısız olur.

GetOffset

Uzaklığı olan alanlar için (örneğin: konum türü LocationMember'ı gösteren alanlar), GetOffset yöntemi, alan için verilerin içerdiği türün (bu işaretçi) temel adresinden uzaklığı döndürür. Bu tür uzaklıklar her zaman işaretsiz 64 bit değerler olarak ifade edilir. Verilen alanın, içeren türün temel adresinden uzaklık olan bir konumu yoksa, GetOffset yöntemi başarısız olur.

GetLocation

Belirli bir tür örneğinden bağımsız olarak adresi olan alanlar için (örneğin, konum türü LocationStatic olan alanlar), GetLocation yöntemi alanın soyut konumunu (adresi) döndürür. Verilen alanın statik konumu yoksa GetLocation yöntemi başarısız olur.

GetValue

Sembolik bilgiler içinde tanımlanmış sabit bir değere sahip alanlar için (örneğin, konum türü LocationConstant değerini gösteren alanlar), GetValue yöntemi alanın sabit değerini döndürür. Verilen alanın sabit değeri yoksa, GetValue yöntemi başarısız olur.

Ücretsiz Veri Erişimi: IDebugHostData

Başka bir türün üyesi olmayan modüllerdeki veriler IDebugHostData arabirimi tarafından temsil edilir. Bu arabirim aşağıdaki gibi tanımlanır (IDebugHostSymbol için genel yöntemler yoksayılır):

DECLARE_INTERFACE_(IDebugHostData, IDebugHostSymbol)
{
    STDMETHOD(GetLocationKind)(_Out_ LocationKind *locationKind) PURE;
    STDMETHOD(GetLocation)(_Out_ Location* location) PURE;
    STDMETHOD(GetValue)(_Out_ VARIANT* value) PURE;
}

Bu yöntemlerin tümü, IDebugHostField'daki eşdeğerlerine benzer şekilde eşdeğerdir. Tek fark, GetLocationKind yönteminin hiçbir zaman ücretsiz veriler için LocationMember döndürmemesidir.

GetLocationKind

GetLocationKind yöntemi, LocationKind numaralandırmasına göre sembolün ne tür bir konumda olduğunu döndürür. Bu numaralandırmanın açıklaması IDebugHostField belgelerinde bulunabilir.

GetLocation

Adresi olan veriler için GetLocation yöntemi alanın soyut konumunu (adresi) döndürür. Verilen verilerin statik konumu yoksa GetLocation yöntemi başarısız olur.

GetValue

Sembolik bilgiler içinde tanımlanmış sabit bir değere sahip olan veriler için (örneğin, konum türü LocationConstant değerini gösteren veriler), GetValue yöntemi alanın sabit değerini döndürür. Verilen verilerin sabit bir değeri yoksa, GetValue yöntemi başarısız olur.

Temel Sınıfları: IDebugHostBaseClass

Belirli bir türün devralma hiyerarşisi, bir tür simgesinin alt öğeleri aracılığıyla ifade edilir. Belirli bir tür bir veya daha fazla türden türetilirse (devralma açısından), tür için tür simgesinde bir veya daha fazla SymbolBaseClass alt öğe olacaktır. Bu SymbolBaseClass sembollerinin her biri, belirli bir türe ait anında devralmayı temsil gelir. Temel sınıfın adı hem SymbolBaseClass simgesinin adı hem de temel sınıf için tür simgesinin adıdır. SymbolBaseClass simgesindeki GetType yöntemi, temel sınıfın kendisi için tür simgesini almak için kullanılabilir. Tam devralma hiyerarşisi, SymbolBaseClass alt simgeleri özyinelemeli olarak keşfedilerek geçirilebilir. Bu temel sınıf simgelerinin her biri, aşağıdaki gibi tanımlanan IDebugHostBaseClass arabirimi tarafından ifade edilir (IDebugHostSymbol için genel yöntemler yoksayılır):

DECLARE_INTERFACE_(IDebugHostBaseClass, IDebugHostSymbol)
{
    STDMETHOD(GetOffset)(_Out_ ULONG64* offset) PURE;
}

GetOffset

GetOffset yöntemi, türetilmiş sınıfın temel adresinden temel sınıfın uzaklığını döndürür. Bu tür bir uzaklık sıfır veya pozitif işaretsiz 64 bit değer olabilir.

ortak simgeleri : IDebugHostPublic

Ortak simgeler, bir sembol dosyası içindeki ortak tablodaki öğeleri temsil eden simgelerdir. Bunlar, aslında dışarı aktarma adresleridir. Genel simgeyle ilişkilendirilmiş tür bilgisi yok; yalnızca bir adres. Arayan tarafından açıkça ortak bir simge istenmediği sürece, hata ayıklama ana bilgisayarı her sorgu için özel simgeler döndürmeyi tercih eder. Genel simge, aşağıdaki gibi tanımlanan IDebugHostPublic arabirimi tarafından ifade edilir (IDebugHostSymbol için genel olan yöntemler yoksayılır):

DECLARE_INTERFACE_(IDebugHostPublic, IDebugHostSymbol)
{
    STDMETHOD(GetLocationKind)(_Out_ LocationKind *locationKind) PURE;
    STDMETHOD(GetLocation)(_Out_ Location* location) PURE;
}

Bu yöntemlerin tümü, IDebugHostField'daki eşdeğerlerine benzer şekilde eşdeğerdir. Tek fark, GetLocationKind yönteminin bu simgeler için hiçbir zaman LocationMember veya LocationConstant döndürmemesidir.

GetLocationKind

GetLocationKind yöntemi, LocationKind numaralandırmasına göre sembolün ne tür bir konumda olduğunu döndürür. Bu numaralandırmanın açıklaması IDebugHostField belgelerinde bulunabilir.

GetLocation

Adresi olan veriler için GetLocation yöntemi alanın soyut konumunu (adresi) döndürür. Verilen genelin statik konumu yoksa GetLocation yöntemi başarısız olur.

Modül İmzaları ve Sürüm Eşleştirme: IDebugHostModuleSignature

Modül imzaları, belirli bir modülün adlandırma ve sürüm oluşturmayla ilgili ölçüt kümesini karşılayıp karşılamadığını denetlemeye yönelik bir aracı temsil eder. IDebugHostSymbols üzerinde CreateModuleSignature yöntemi aracılığıyla bir modül imzası oluşturulur. Modül adıyla ve modül için isteğe bağlı bir sürüm numarası aralığıyla eşleşebilir. Böyle bir imza oluşturulduktan sonra istemci aşağıdaki gibi tanımlanan bir IDebugHostModuleSignature arabirimi alır:

DECLARE_INTERFACE_(IDebugHostModuleSignature, IUnknown)
{
    STDMETHOD(IsMatch)(_In_ IDebugHostModule* pModule, _Out_ bool* isMatch) PURE;
}

IsMatch

IsMatch yöntemi, belirli bir modülü (IDebugHostModule simgesi tarafından verilen) imzayla karşılaştırır ve modül adını ve sürümünü imzada belirtilen ad ve sürüm aralığıyla karşılaştırır. Verilen modül simgesinin imzayla eşleşip eşleşmediğini gösteren bir gösterge döndürülür.

Tür İmzaları ve Tür Eşleştirme: IDebugHostTypeSignature

Tür imzaları, belirli bir tür örneğinin türün adı, türün genel bağımsız değişkenleri ve türün içinde bulunduğu modül hakkındaki ölçüt kümesini karşılayıp karşılamadığını denetlemeye yönelik bir aracı temsil eder. IDebugHostSymbols üzerinde CreateTypeSignature yöntemi aracılığıyla bir tür imzası oluşturulur. Böyle bir imza oluşturulduktan sonra istemci, aşağıdaki gibi tanımlanan bir IDebugHostTypeSignature arabirimi alır:

DECLARE_INTERFACE_(IDebugHostTypeSignature, IUnknown)
{
    STDMETHOD(GetHashCode)(_Out_ ULONG* hashCode) PURE;
    STDMETHOD(IsMatch)(_In_ IDebugHostType* type, _Out_ bool* isMatch, _COM_Outptr_opt_ IDebugHostSymbolEnumerator** wildcardMatches) PURE;
    STDMETHOD(CompareAgainst)(_In_ IDebugHostTypeSignature* typeSignature, _Out_ SignatureComparison* result) PURE;
}

GetHashCode

GetHashCode yöntemi, tür imzası için 32 bit karma kodu döndürür. Hata ayıklama konağı, tür örnekleri için döndürülen karma kodu ile tür imzaları için döndürülen karma kod arasında uygulamada eşitleme olduğunu garanti eder. Genel eşleşme dışında, bir tür örneği bir tür imzası ile eşleşiyorsa, her ikisi de aynı 32 bit karma koduna sahip olur. Bu, bir tür örneği ile veri modeli yöneticisine kaydedilen tür imzalarının bol olduğu bir ilk hızlı karşılaştırmaya ve eşleşmeye olanak tanır.

IsMatch

IsMatch yöntemi, belirli bir tür örneğinin tür imzasında belirtilen ölçütle eşleşip eşleşmediğini gösteren bir gösterge döndürür. Döndürülürse, bunun bir göstergesinin yanı sıra tür imzasında joker karakterlerle eşleşen tür örneğinin belirli bölümlerini (semboller olarak) gösteren bir numaralandırıcı döndürülür.

CompareAgainst

CompareAgainst yöntemi, tür imzasını başka bir tür imzası ile karşılaştırır ve iki imzanın karşılaştırmasını döndürür. Döndürülen karşılaştırma sonucu, aşağıdaki gibi tanımlanan SignatureComparison numaralandırmasının bir üyesidir:

Numaralandırıcı Anlamı
Alakasız karşılaştırılan iki imza veya tür arasında ilişki yoktur.
Belirsiz Bir imza veya tür, belirsiz bir şekilde diğerini karşılaştırır. İki tür imza için bu, her iki imzayı da eşit derecede iyi eşleştirebilecek olası tür örnekleri olduğu anlamına gelir. Örneğin, aşağıda gösterilen iki tür imza belirsizdir. İmza 1: std::pair<*, int> İmza 2: std::pair<int,*> çünkü tür örneği std::pair<int, int> biri eşit derecede iyi eşleşir (her ikisi de bir somut ve bir joker karakter eşleşmesine sahiptir).
LessSpecific Bir imza veya tür, diğerinden daha az özeldir. Bu genellikle, daha az belirli imzanın, daha belirgin olanın somut bir türe sahip olduğu bir joker karaktere sahip olduğu anlamına gelir. Örneğin, aşağıdaki ilk imza ikincisinden daha az özeldir. İmza 1: std::pair<*, int> İmza 2: std::pair<int, int> çünkü ikincisinde somut bir tür (int) olan joker karakter (*) vardır.
MoreSpecific Bir imza veya tür diğerinden daha belirgindir. Bu genellikle, daha belirli bir imzanın daha az özel olanın joker karaktere sahip olduğu somut bir türe sahip olduğu anlamına gelir. Örneğin, aşağıdaki ilk imza ikinci imzadan daha belirgindir. İmza 1: std::pair<int, int> İmza 2: std::pair<*, int> çünkü ikincisinde joker karakter (*) bulunan somut bir tür (int) vardır.
Aynı İki imza veya tür aynıdır.

Ayrıca bkz.

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ısı Veri Modeli C++ Genel Bakış

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

Hata Ayıklayıcısı Veri Modeli C++ Ek Arabirimler

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

Hata Ayıklayıcısı Veri Modeli C++ Betik oluşturma