Aracılığıyla paylaş


JavaScript Uzantılarında Yerel Hata Ayıklayıcı Nesneleri - Hata Ayıklayıcı Nesne Ayrıntıları

Bu konuda, JavaScript uzantılarında yerel hata ayıklayıcı nesnelerini kullanma hakkında ek ayrıntılar açıklanmaktadır.

Yerel hata ayıklayıcı nesneleri, hata ayıklayıcı ortamının çeşitli yapılarını ve davranışlarını temsil eder. Nesneler, hata ayıklayıcının durumunu değiştirmek için JavaScript uzantılarına geçirilebilir (veya içinde edinilebilir).

Hata Ayıklayıcı nesnesi JavaScript uzantıları hakkında bilgi için bkz. JavaScript Uzantılarında Yerel Hata Ayıklayıcı Nesneleri.

JavaScript ile çalışma hakkında genel bilgi için bkz. JavaScript Hata Ayıklayıcısı Betiği Oluşturma.

Örneğin, JavaScript betikleri ve uzantıları için hata ayıklayıcı ekibi, https://github.com/Microsoft/WinDbg-Samples konumunda bir GitHub deposu barındırıyor.

JavaScript Uzantılarında Hata Ayıklayıcı Nesneleri

Yerel Nesneleri Geçirme

Hata ayıklayıcı nesneleri JavaScript uzantılarına çeşitli yollarla geçirilebilir veya bu uzantılardan edinilebilir.

  • JavaScript işlevlerine veya yöntemlerine geçirilebilirler
  • JavaScript prototipinin örnek nesnesi olabilir (örneğin görselleştirici olarak)
  • Yerel hata ayıklayıcı nesneleri oluşturmak üzere tasarlanmış ana yöntemlerden döndürülebilirler.
  • Hata ayıklayıcı yerel nesneleri oluşturmak için tasarlanmış ana bilgisayar yöntemlerinden döndürülebilirler.

JavaScript uzantısına geçirilen hata ayıklayıcısı nesnelerinin bu bölümde açıklanan bir işlev kümesi vardır.

  • Özellik Erişimi
  • Öngörülen Adlar
  • Doğal Hata Ayıklayıcı Nesneleriyle İlgili Özel Türler
  • Ek Öznitelikler

Özellik Erişimi

JavaScript sağlayıcısı tarafından buraya yerleştirilen nesneler üzerinde bazı özellikler olsa da, JavaScript'e giren yerel bir nesnedeki özelliklerin çoğu veri modeli tarafından sağlanır. Bu, object.propertyName veya object[propertyName] --- özellik erişimi için aşağıdakilerin gerçekleşeceği anlamına gelir.

  • PropertyName, JavaScript sağlayıcısı tarafından nesneye yansıtılan bir özelliğin adıysa, önce bu çözümlenir; yoksa
  • propertyName, veri modeli (başka bir Görselleştirici) tarafından nesneye yansıtılan bir anahtarın adıysa, bu ad ikinci olarak çözümlenir; yoksa
  • propertyName yerel nesnenin bir alanının adıysa, bu ad üçüncü olarak çözümlenir; yoksa
  • Nesne bir işaretçiyse, işaretçi çözülür ve yukarıdaki döngü devam eder (çözülmüş nesnenin yansıtılan özelliği ve ardından bir anahtar ve ardından yerel bir alan)

JavaScript'te (object.propertyName ve object[propertyName] ) özellik erişiminin normal yöntemi, hata ayıklayıcıda 'dx' komutunun erişeceği kadar nesnenin temel alınan yerel alanlarına erişecektir.

Öngörülen Adlar

Aşağıdaki özellikler (ve yöntemler) JavaScript'e giren yerel nesnelere yansıtılır.

Yöntem İmza Açıklama
hostContext Mülkiyet Nesnenin içinde bulunduğu bağlamı temsil eden bir nesne döndürür (adres alanı, hata ayıklama hedefi vb.)
targetLocation (hedefKonum) Mülkiyet Nesnenin bir adres alanı içinde bulunduğu yerin soyutlaması olan bir nesne döndürür (sanal adres, kayıt, alt kayıt vb.)
hedef boyutu Mülkiyet Nesnenin boyutunu döndürür (etkili bir şekilde: sizeof(<TYPE OF OBJECT>)
addParentModel .addParentModel(nesne) Nesneye, bir JavaScript prototipine benzer şekilde, fakat veri modeli tarafında yer alan yeni bir üst model ekler.
ebeveynModeliKaldır .removeParentModel(nesne) Nesneden belirli bir üst modeli kaldırır
çalışma zamanı tür nesnesi Mülkiyet Nesne üzerinde analiz gerçekleştirir ve bunu çalışma zamanı (en çok türetilen) türüne dönüştürmeye çalışır
hedef türü Mülkiyet JavaScript uzantıları, temel alınan dilin tür sistemine doğrudan erişime sahiptir. Bu erişim, tür nesneleriyle ifade edilir. Daha fazla bilgi için bkz. JavaScript Uzantılarında Yerel Hata Ayıklayıcı Nesneleri - Tür Nesneleri

Nesne bir işaretçiyse, aşağıdaki özellikler (ve yöntemler) JavaScript'e giren işaretçiye yansıtılır:

Özellik Adı İmza Açıklama
ekle .add(değer) İşaretçi ile belirtilen değer arasında bir matematiksel toplama işlemi gerçekleştirir.
adres Mülkiyet İşaretçinin adresini 64 bit sıralı nesne (kitaplık türü) olarak döndürür
Başvuru .dereference() İşaretçiyi başvuru dışı bırakır ve temel nesneyi döndürür
isNull Mülkiyet İşaretçi değerinin nullptr olup olmadığını döndürür (0)

Yerel Hata Ayıklayıcı Nesneleriyle ilgili Özel Türler

Konum Nesneleri

Yerel bir nesnenin targetLocation özelliğinden döndürülen konum nesnesi aşağıdaki özellikleri (ve yöntemlerini) içerir.

Özellik Adı İmza Açıklama
ekle .add(değer) Konuma mutlak bayt uzaklığı ekler.
çıkarmak .subtract(değer) Konumdan mutlak bayt uzaklığını çıkarır.

Ek Öznitelikler

Yinelenebilirlik

Veri modeli tarafından yinelenebilir olarak anlaşılan herhangi bir nesne (yerel bir dizi veya NatVis ya da başka bir şekilde yinelenebilir hale getiren bir görselleştiriciye sahip ise) üzerinde, ES6 standart Symbol.iterator ile dizinlenen bir yineleyici işlevi bulunur. Bu, JavaScript'te yerel bir nesneyi aşağıdaki gibi yineleyebileceğiniz anlamına gelir.

function iterateNative(nativeObject)
{
    for (var val of nativeObject)
    {
        // 
        // val will contain each element iterated from the native object.  This would be each element of an array,
        // each element of an STL structure which is made iterable through NatVis, each element of a data structure
        // which has a JavaScript iterator accessible via [Symbol.iterator], or each element of something
        // which is made iterable via support of IIterableConcept in C/C++.
        //
    }
}

Dizinlenebilirlik

Sıralar aracılığıyla tek boyutta dizinlenebilir olarak anlaşılan nesneler (ör. yerel diziler), standart özellik erişim işleci (object[index]) aracılığıyla JavaScript'te dizinlenebilir. Bir nesne ada göre dizinlenebilirse veya birden fazla boyutta dizinlenebilirse, JavaScript kodunun dizin oluşturucuyu kullanabilmesi için getValueAt ve setValueAt yöntemleri nesneye yansıtılır.

function indexNative(nativeArray)
{
    var first = nativeArray[0];
}

Dize Dönüştürme

IStringDisplayableConcept veya NatVis DisplayString öğesinin desteğiyle görüntüleme dizesi dönüştürmesi olan tüm yerel nesneler, bu dize dönüştürmeye standart JavaScript toString yöntemiyle erişilebilir.

function stringifyNative(nativeObject)
{
    var myString = nativeObject.toString();
}

Yerel Hata Ayıklayıcı Nesneleri Oluşturma

Belirtildiği gibi, JavaScript betiği yerel nesnelere çeşitli yollardan biriyle JavaScript'e geçirerek erişebilir veya bunları konak kitaplığına yapılan çağrılar aracılığıyla oluşturabilir. Yerel hata ayıklayıcı nesneleri oluşturmak için aşağıdaki işlevleri kullanın.

Yöntem İmza Açıklama

host.getModuleSymbol

getModuleSymbol(modülAdı, sembolAdı, [bağlamMirasçısı])

getModuleSymbol(moduleName, symbolName, [typeName], [contextInheritor])

Belirli bir modül içindeki genel simgenin nesnesini döndürür. Modül adı ve simge adı dizelerdir.

İsteğe bağlı contextInheritor argümanı sağlandığında, modül ve simge, sağlanan nesneyle aynı adres alanında ve hata ayıklama hedefinde aranacaktır. Bağımsız değişken sağlanmazsa, modül ve sembol hata ayıklayıcının geçerli bağlamında aranacaktır. Tek seferlik test betiği olmayan bir JavaScript uzantısı her zaman açık bir bağlam sağlamalıdır.

İsteğe bağlı typeName bağımsız değişkeni sağlanırsa, simgenin geçirilen türde olduğu varsayılır ve sembollerde belirtilen tür yoksayılır. Bir modül için ortak semboller üzerinde çalışması beklenen her çağıranın her zaman açık bir tür adı sağlaması gerektiğini unutmayın.

host.modülüSembolİçerenModülüGetir

getModuleContainingSymbol(location, [contextInheritor])

Verilen adresi içeren simgeyi (örn. işlev veya veriler) döndürür. Bunun yalnızca verilen adresi içeren modül için özel simgeler varsa işe yarayacağını unutmayın.

Eğer isteğe bağlı contextInheritor bağımsız değişkeni sağlanırsa, modül ve simge, verilen nesnenin bulunduğu aynı bağlamda (adres alanı, hata ayıklama hedefi) aranacaktır. Bağımsız değişken verilmediyse, modül ve simge hata ayıklayıcının geçerli bağlamında aranacaktır. Tek seferlik test betiği olmayan bir JavaScript uzantısı her zaman açık bir bağlam sağlamalıdır.

host.createPointerObject

createPointerObject(adres, modülAdı, tipAdı, [contextInheritor])

Belirtilen adreste veya konumda bir işaretçi nesnesi oluşturur. Modül adı ve tür adı dizelerdir.

İsteğe bağlı contextInheritor bağımsız değişkeni sağlanırsa, modül ve simge, aktarılmış nesneyle aynı bağlamda (adres alanı, hata ayıklama hedefi) aranacaktır. Argüman sağlanmazsa, modül ve simge hata ayıklayıcının mevcut bağlamında aranacaktır. Tek seferlik test betiği olmayan bir JavaScript uzantısı her zaman açık bir bağlam sağlamalıdır.

host.createTypedObject

createTypedObject(location, moduleName, typeName, [contextInheritor])

Belirtilen konumdaki bir hata ayıklama hedefinin adres alanı içinde yerel türü belirtilmiş bir nesneyi temsil eden bir nesne oluşturur. Modül adı ve tür adı dizelerdir.

İsteğe bağlı contextInheritor bağımsız değişkeni sağlanırsa, modül ve simge, gönderilen nesneyle aynı bağlamda (adres alanı, hata ayıklama hedefi) aranacaktır. Bağımsız değişken sağlanmazsa, modül ve simge hata ayıklayıcının geçerli bağlamında aranacaktır. Tek seferlik test betiği olmayan bir JavaScript uzantısı her zaman açık bir bağlam sağlamalıdır.

JavaScript Uzantıları için Konak API'leri

JavaScript sağlayıcısı, yüklediği her betiğin genel ad alanına host adlı bir nesne ekler. Bu nesne hem betik için kritik işlevlere hem de hata ayıklayıcının ad alanına erişim sağlar. İki aşamada ayarlanır.

  • 1. Aşama: Herhangi bir betik yürütülmeden önce, konak nesnesi yalnızca bir betiğin kendisini başlatması ve genişletilebilirlik noktalarını (üretici ve tüketici olarak) kaydetmesi için gereken en düşük işlevsellik kümesini içerir. Kök ve başlatma kodu, hata ayıklama hedefinin durumunu değiştirmeye veya karmaşık işlemler gerçekleştirmeye yönelik değildir. Bu nedenle, initializeScript yöntemi dönene kadar konak tam olarak yüklenmez.

  • 2. Aşama: initializeScript döndürdükten sonra konak nesnesi, hata ayıklama hedeflerinin durumunu değiştirmek için gereken her şeyle doldurulur.

Konak Nesne Düzeyi

Birkaç önemli işlev parçası doğrudan konak nesnesinin altındadır. Geri kalanı alt ad alanıdır. Ad alanları aşağıdakileri içerir.

Namespace Açıklama
Tanılama Komut dosyası kodunun teşhis edilmesi ve hata ayıklanmasında yardımcı olacak işlevsellik
hafıza Hata ayıklama hedefi içinde bellek okumayı ve yazmayı etkinleştirme işlevselliği

Kök Düzeyi

Doğrudan konak nesnesi içinde aşağıdaki özellikler, yöntemler ve oluşturucular bulunabilir.

İsim İmza Mevcut Aşama Açıklama
createPointerObject

createPointerObject(address, moduleName, typeName, [contextInheritor])

2 Belirtilen adreste veya konumda bir işaretçi nesnesi oluşturur. Modül adı ve tür adı dizelerdir. İsteğe bağlı contextInheritor bağımsız değişkeni, getModuleSymbol ile aynı şekilde işlevini görür.
createTypedObject (Türü Belirli Nesne Oluştur)

createTypedObject(location, moduleName, typeName, [contextInheritor])

2 Belirtilen konumdaki bir hata ayıklama hedefinin adres alanı içinde yerel türü belirtilmiş bir nesneyi temsil eden bir nesne oluşturur. Modül adı ve tür adı dizelerdir. İsteğe bağlı contextInheritor bağımsız değişkeni getModuleSymbol ile çalışır.
mevcut işlem

Mülkiyet

2 Hata ayıklayıcının geçerli işlemini temsil eden nesneyi döndürür
mevcutOturum

Mülkiyet

2 Hata ayıklayıcının (hedef, döküm vb.) geçerli oturumunu temsil eden nesneyi döndürür.
currentThread

Mülkiyet

2 Hata ayıklayıcının geçerli iş parçacığını temsil eden nesneyi döndürür
evaluateExpression

evaluateExpression(ifade, [contextInheritor])

2 Bu, yalnızca hata ayıklama hedefinin dilini kullanarak bir ifadeyi değerlendirmek için hata ayıklama konağına çağrır. İsteğe bağlı contextInheritor bağımsız değişkeni sağlanırsa, ifade bağımsız değişkenin bağlamında (örneğin: adres alanı ve hata ayıklama hedefi) değerlendirilir; aksi takdirde, hata ayıklayıcının geçerli bağlamında değerlendirilir
evaluateExpressionInContext

evaluateExpressionInContext(context, expression)

2 Bu, yalnızca hata ayıklama hedefinin dilini kullanarak bir ifadeyi değerlendirmek için hata ayıklama konağına çağrır. Bağlam bağımsız değişkeni, bu işaretçinin değerlendirme için kullanılacak örtük değerini gösterir. İfade, context argümanı tarafından belirtilen bağlamda (örneğin, adres alanı ve hata ayıklama hedefi) değerlendirilir.
getModuleSymbol

getModuleSymbol(moduleName, symbolName, [contextInheritor])

2 Belirli bir modül içindeki genel simgenin nesnesini döndürür. Modül adı ve simge adı dizelerdir. İsteğe bağlı contextInheritor bağımsız değişkeni sağlanırsa, modül ve simge geçirilen nesneyle aynı bağlamda (adres alanı, hata ayıklama hedefi) aranacaktır. Bağımsız değişken sağlanmadığında, modül ve simge hata ayıklayıcının mevcut bağlamında aranacaktır. Tek seferlik bir betik olmayan bir JavaScript uzantısı her zaman açık bir bağlam sağlamalıdır
getNamedModel

getNamedModel(modelName)

2 Verilen bir ada karşı kaydedilen veri modelini döndürür. Henüz kayıtlı olmayan bir isme başvurmanın tamamen yasal olduğunu unutmayın. Bunu yaptığınızda bu ad için bir saplama oluşturulur ve kayıt sonrasında saplamanın üzerinde yapılan değişiklikler, gerçek ve asıl nesneye uygulanır.
indeksliDeğer

new indexedValue(değer, dizinler)

2 Yinelenen değere varsayılan dizin kümesi atamak için JavaScript yineleyicisinden döndürülebilen bir nesnenin oluşturucusu. Dizin kümesi JavaScript dizisi olarak ifade edilmelidir.
Int64

new Int64(value, [highValue])

1 Bu, bir kitaplık Int64 türü oluşturur. Tek bağımsız değişkenli sürüm, dönüştürme olmadan Int64'e sığacak herhangi bir değeri alır ve bunu Int64 olarak yerleştirir. İsteğe bağlı bir ikinci bağımsız değişken sağlanırsa, ilk bağımsız değişkenin dönüşümü alt 32 bit'e paketlenir ve ikinci bağımsız değişkenin dönüştürülmesi üst 32 bit olarak paketlenir.
namedModelParent

new namedModelParent(nesne, ad)

1 InitializeScript'ten döndürülen diziye yerleştirilmesi amaçlanan bir nesnenin oluşturucusunun, veri modelinin veri modeli üst uzantısı olarak verilen ada sahip bir JavaScript prototipi veya ES6 sınıfını kullanmayı temsil eder
adlandırılmışModelKaydı

new namedModelRegistration(object, name)

1 initializeScript'ten döndürülen bir diziye yerleştirilmesi amaçlanan bir nesnenin oluşturucusu, diğer uzantıların bulup genişletebilmesi için bilinen bir ad aracılığıyla bir JavaScript prototipinin veya ES6 JavaScript sınıfının veri modeli olarak kaydedilmesini temsil eder.
isim alanı

Mülkiyet

2 Hata ayıklayıcının kök ad alanına doğrudan erişim verir. Örneğin, host.namespace.Debugger.Sessions.First() aracılığıyla ilk hata ayıklama hedefinin işlem listesine erişebilirsiniz. Bu özelliği kullanan işlemler
adlandırılmışModelKaydet

registerNamedModel(object, modelName)

2 Bu, verilen ad altında bir JavaScript prototipini veya ES6 sınıfını veri modeli olarak kaydeder. Böyle bir kayıt, prototipin veya sınıfın diğer betikler veya diğer hata ayıklayıcı uzantıları tarafından bulunmasına ve genişletilmesine olanak tanır. Betiğin bunu kesin olarak yapmak yerine initializeScript yönteminden namedModelRegistration nesnesini döndürmeyi tercih etmesi gerektiğini unutmayın. Kesin olarak değişiklik yapan tüm betiklerin temizlenmesi için bir initializeScript yöntemine sahip olması gerekir.
registerExtensionForTypeSignature

registerExtensionForTypeSignature(objek, tipİmzası)

2 Bu, sağlanan tür imzası tarafından verilen yerel bir tür için uzantı veri modeli olarak bir JavaScript prototipi veya ES6 sınıfı kaydeder. Betiğin bunu kesin olarak yapmak yerine initializeScript yönteminden typeSignatureExtension nesnesi döndürmeyi tercih etmesi gerektiğini unutmayın. Kesin olarak değişiklik yapan tüm betiklerin temizlenmesi için bir initializeScript yöntemine sahip olması gerekir.
RegisterPrototypeForTypeSignature

registerPrototypeForTypeSignature(object, typeSignature)

2 Bu, sağlanan tür imzasıyla belirtilen yerel bir tür için JavaScript prototipi veya ES6 sınıfını standart veri modeli (ör. görselleştirici) olarak kaydeder. Betiğin bunu kesin olarak yapmak yerine initializeScript yönteminden typeSignatureRegistration nesnesini döndürmeyi tercih etmesi gerektiğini unutmayın. Kesin olarak değişiklik yapan tüm betiklerin temizlenmesi için uninitializeScriptyöntemine sahip olması gerekir.
parseInt64

parseInt64(string, [radix])

1 Bu yöntem, bunun yerine bir kitaplık Int64 türü döndürmesi dışında standart JavaScript parseInt yöntemine benzer şekilde davranır. Bir radiks sağlanırsa ayrıştırma, belirtildiği gibi 2, 8, 10 veya 16 tabanında gerçekleşir.
typeSignatureExtension

new typeSignatureExtension(object, typeSignature, [moduleName], [minVersion], [maxVersion])

1 InitializeScript'ten döndürülen diziye yerleştirilmesi amaçlanan bir nesnenin oluşturucusu, JavaScript prototipi veya ES6 sınıfı tarafından tür imzası aracılığıyla açıklanan yerel bir türün uzantısını temsil eder. Bu tür bir kayıt, imzayla eşleşen herhangi bir türün hata ayıklayıcıdaki görselleştirmesine "alanlar ekler," imzayı tamamen devralmak yerine. İsteğe bağlı bir modül adı ve sürümü kaydı kısıtlayabilir. Sürümler "1.2.3.4" stil dizeleri olarak belirtilir.
tipİmzaKaydı

new typeSignatureRegistration(object, typeSignature, [moduleName], [minVersion], [maxVersion])

1 initializeScript'ten döndürülen diziye yerleştirilmesi amaçlanan bir nesne için bir oluşturucu olup, bu JavaScript prototipi veya ES6 sınıfının yerel tür imzasına karşı kurallı kaydını temsil eder. Böyle bir kayıt, hata ayıklayıcının yalnızca imzayı genişletmek yerine imzayla eşleşen herhangi bir türdeki görselleştirmesini "devralır". İsteğe bağlı bir modül adı ve sürümü kaydı kısıtlayabilir. Sürümler "1.2.3.4" stil dizeleri olarak belirtilir.
adlandırılmışModeliKaydıSil

unregisterNamedModel(modelName)

2 Bu, registerNamedModel tarafından gerçekleştirilen tüm işlemleri geri alarak verilen ada göre bir veri modelinin arama kaydını kaldırır
unregisterExtensionForTypeSignature işlevi

unregisterExtensionForTypeSignature(öğe, türİmzası, [modülAdı], [minVersiyon], [maxVersiyon])

2 Bu, sağlanan tür imzasına göre bir yerel tür için uzantı veri modeli olarak kullanılan bir JavaScript prototipinin veya ES6 sınıfının kaydını kaldırır. registerExtensionForTypeSignature'ın mantıksal geri alma işlemidir. Betiğin bunu kesin olarak yapmak yerine initializeScript yönteminden typeSignatureExtension nesnesi döndürmeyi tercih etmesi gerektiğini unutmayın. Kesin olarak değişiklik yapan tüm betiklerin temizlenmesi için bir initializeScript yöntemine sahip olması gerekir. İsteğe bağlı bir modül adı ve sürümü kaydı kısıtlayabilir. Sürümler "1.2.3.4" stil dizeleri olarak belirtilir.
Tip İmzası İçin Prototipi Kayıttan Sil

Tip İmzası için Prototipi Kayıttan Çıkar(object, typeSignature, [moduleName], [minVersion], [maxVersion])

2 Bu, sağlanan tür imzasına göre yerel bir tür için kurallı veri modeli (ör. görselleştirici) olarak kullanılan bir JavaScript prototipini veya ES6 sınıfını kayıttan çıkarır. RegisterPrototypeForTypeSignature'ın mantıksal geri alma işlemidir. Betiğin bunu kesin olarak yapmak yerine initializeScript yönteminden typeSignatureRegistration nesnesini döndürmeyi tercih etmesi gerektiğini unutmayın. Zorunlu olarak değişiklik yapan tüm betiklerin temizlenebilmesi için bir uninitializeScript yöntemine sahip olması gerekir. İsteğe bağlı bir modül adı ve sürümü kaydı kısıtlayabilir. Sürümler "1.2.3.4" stil dizeleri olarak belirtilir.

Tanılama İşlevselliği

Ana makine nesnesinin diagnostik alt alanı şunları içerir.

İsim İmza Mevcut Aşama Açıklama
debugLog debugLog(nesne...) 1 Bu, bir betik uzantısına printf tarzı hata ayıklama yeteneği kazandırır. Şu anda debugLog çıkışı hata ayıklayıcının çıkış konsoluna yönlendirilir. Sonraki bir noktada, bu çıkışı yönlendirme konusunda esneklik sağlama planları vardır. NOT: Bu, kullanıcı çıktısını konsola yazdırma aracı olarak kullanılmamalıdır. Gelecekte oraya yönlendirilmeyebilir.

Bellek İşlevselliği

Konak nesnesinin bellek alt ad alanı aşağıdakileri içerir.

İsim İmza Mevcut Aşama Açıklama
readMemoryValues

readMemoryValues(bellekKonumunuOku, elemanSayisi, [elemanBoyutu], [isaretliMi], [baglamMirascisi])

2 Bu, hata ayıklama hedefinin adres alanından ham bir değer dizisini okur ve bu belleğin görünümünün üzerine yazılan bir dizi yerleştirir. Sağlanan konum bir adres (64 bit değer), konum nesnesi veya yerel işaretçi olabilir. Dizinin boyutu numElements bağımsız değişkeniyle gösterilir. Dizinin her öğesinin boyutu (ve türü), isteğe bağlı elementSize ve isSigned bağımsız değişkenleri tarafından verilir. Böyle bir bağımsız değişken sağlanmazsa, varsayılan bayttır (imzasız / 1 bayt). İsteğe bağlı contextInheritor bağımsız değişkeni sağlanırsa, bellek bağımsız değişken tarafından belirtilen bağlamda (örneğin, adres alanı ve hata ayıklama hedefi) okunur; aksi takdirde, hata ayıklayıcının geçerli bağlamından okunur. Bu yöntemin 8, 16 ve 32 bit değerlerde kullanılması, hızlı yazılan bir görünümün okuma belleğine yerleştirilmesiyle sonuçlandığını unutmayın. Bu yöntemin 64 bit değerlerde kullanılması, 64 bit kitaplık türlerinin bir dizisinin oluşturulduğuna ve bunun çok daha pahalı olmasına neden olur!
readString

readString(location, [contextInheritor])

readString(location, [length], [contextInheritor])

2 Bu işlem hata ayıklama hedefinin adres alanından dar (geçerli kod sayfası) dizesini okur, UTF-16'ya dönüştürür ve sonucu JavaScript dizesi olarak döndürür. Bellek okunamadıysa bir istisna fırlatabilir. Sağlanan konum bir adres (64 bit değer), konum nesnesi veya yerel karakter olabilir. İsteğe bağlı contextInheritor bağımsız değişkeni sağlanırsa, bellek bağımsız değişken tarafından belirtilen bağlamda (örneğin, adres alanı ve hata ayıklama hedefi) okunur; aksi takdirde, hata ayıklayıcının geçerli bağlamından okunur. İsteğe bağlı uzunluk bağımsız değişkeni sağlanırsa, okuma dizesi belirtilen uzunlukta olur.
readWideString

readWideString(location, [contextInheritor])

readWideString(location, [length], [contextInheritor])

2 Bu, bir hata ayıklama hedefinin adres alanından wide(UTF-16) dizesini okur ve sonucu JavaScript dizesi olarak döndürür. Bellek okunamadıysa bir istisna fırlatabilir. Sağlanan konum bir adres (64 bit değer), konum nesnesi veya yerel bir wchar_t olabilir. İsteğe bağlı contextInheritor bağımsız değişkeni sağlanırsa, bellek bağımsız değişken tarafından belirtilen bağlamda (örneğin, adres alanı ve hata ayıklama hedefi) okunur; aksi takdirde, hata ayıklayıcının geçerli bağlamından okunur. İsteğe bağlı uzunluk bağımsız değişkeni sağlanırsa, okuma dizesi belirtilen uzunlukta olur.

JavaScript'te Veri Modeli Kavramları

Veri Modeli Eşleme

Aşağıdaki veri modeli kavramları JavaScript ile ilişkilidir.

Konsept Yerel Arabirim JavaScript Eşdeğeri
Dize Dönüştürme IStringDisplayableConcept (Dize Olarak Görüntülenebilir Kavram) standart: toString(...){...}
Yinelenebilirlik IIterableConcept standard: [Symbol.iterator](){...}
Dizinlenebilirlik IIndexableConcept protocol: getDimensionality(...) / getValueAt(...) / setValueAt(...)
Çalışma Zamanı Türü Dönüştürme TercîhEdilenÇalışmaZamanıTürüKavramı protocol: getPreferredRuntimeTypedObject(...)

Dize Dönüştürme

Dize dönüştürme kavramı (IStringDisplayableConcept), standart JavaScript toString yöntemine doğrudan çevrilir . Tüm JavaScript nesnelerinin dize dönüştürmesi olduğundan (başka bir yerde sağlanmadıysa Object.prototype tarafından sağlanır), veri modeline döndürülen her JavaScript nesnesi bir görüntü dizesine dönüştürülebilir. Dize dönüştürmesini geçersiz kılmanız için kendi toString'inizi uygulamanız yeterlidir.

class myObject
{
    //
    // This method will be called whenever any native code calls IStringDisplayableConcept::ToDisplayString(...)
    //
    toString()
    { 
        return "This is my own string conversion!";
    }
}

Yinelenebilirlik

Veri modelinin bir nesnenin yinelenebilir olup olmadığı kavramı, bir nesnenin yinelenebilir olup olmadığına ilişkin doğrudan ES6 protokolüne eşlenir. [Symbol.iterator] yöntemi olan tüm nesneler yinelenebilir olarak kabul edilir. Böyle bir uygulama, nesneyi yinelenebilir hale getirir.

Yalnızca yinelenebilir bir nesnenin aşağıdaki gibi bir uygulaması olabilir.

class myObject
{
    //
    // This method will be called whenever any native code calls IIterableConcept::GetIterator
    //
    *[Symbol.iterator]()
    {
        yield "First Value";
        yield "Second Value";
        yield "Third Value";
    }
}

Üzerinde hem yinelenebilen hem de dizinlenebilen nesneler için özel özen gösterilmesi gerekmektedir, çünkü yineleyici tarafından döndürülen nesneler hem dizini hem değeri içermelidir ve bu özel bir dönüş türü aracılığıyla sağlanmalıdır.

Yinelenebilir ve Dizinlenebilir

Yinelenebilir ve dizinlenebilir bir nesne, yineleyiciden özel bir dönüş değeri gerektirir. Yineleyici, değerlerin yerine indexedValue örneklerini verir. İndeksler, IndexedValue oluşturucusunun ikinci bağımsız değişkeninde bir dizi olarak geçirilir. Bunlar çok boyutlu olabilir, ancak dizin oluşturucu protokolünde döndürülen boyutsallık ile eşleşmelidir.

Bu kod örnek bir uygulama gösterir.

class myObject
{
    //
    // This method will be called whenever any native code calls IIterableConcept::GetIterator
    //
    *[Symbol.iterator]()
    {
        //
        // Consider this a map which mapped 42->"First Value", 99->"Second Value", and 107->"Third Value"
        //
        yield new host.indexedValue("First Value", [42]);
        yield new host.indexedValue("Second Value", [99]);
        yield new host.indexedValue("Third Value", [107]);
    }
}

Dizinlenebilirlik

JavaScript'in aksine, veri modeli özellik erişimi ve dizin oluşturma arasında çok açık bir ayrım yapar. Veri modelinde kendisini dizinlenebilir olarak sunmak isteyen herhangi bir JavaScript nesnesi, dizin oluşturucunun boyutsallığını döndüren bir getDimensionality yönteminden ve sağlanan dizinlerde nesnenin okuma ve yazma işlemlerini gerçekleştiren isteğe bağlı getValueAt ve setValueAt yöntemlerinden oluşan bir protokol uygulamalıdır. Nesne salt okunur veya salt yazılır olduğunda getValueAt veya setValueAt yöntemlerinin atlanması kabul edilebilir.

class myObject
{
    //
    // This method will be called whenever any native code calls IIndexableConcept::GetDimensionality or IIterableConcept::GetDefaultIndexDimensionality
    //
    getDimensionality()
    {
        //
        // Pretend we are a two dimensional array.
        //
        return 2;
    } 

    //
    // This method will be called whenever any native code calls IIndexableConcept::GetAt
    //
    getValueAt(row, column)
    {
        return this.__values[row * this.__columnCount + column];
    }

    //
    // This method will be called whenever any native code calls IIndexableConcept::SetAt
    //
    setValueAt(value, row, column)
    {
        this.__values[row * this.__columnCount + column] = value;
    }
}

Çalışma Zamanı Türü Dönüştürme

Bu yalnızca tür sistemi (yerel) türlerine göre kaydedilen JavaScript prototipleri/sınıfları için geçerlidir. Hata ayıklayıcı genellikle kodda ifade edilen statik bir türden nesnenin gerçek çalışma zamanı türünü belirlemek için analiz (örneğin Run-Time Tür Bilgileri (RTTI) / v-tablo analizi) gerçekleştirebilir. Yerel bir türe kayıtlı bir veri modeli, IPreferredRuntimeTypeConcept uygulamasını kullanarak bu davranışı geçersiz kılabilir. Benzer şekilde, yerel bir nesneye kayıtlı bir JavaScript sınıfı veya prototip, getPreferredRuntimeTypedObject yönteminden oluşan bir protokolün uygulanması yoluyla kendi uygulamasını sağlayabilir.

Unutmayın ki bu yöntem teknik olarak herhangi bir şeyi döndürebilir, ancak çalışma zamanı tipi veya türetilmiş bir tip olmayan bir şey döndürmesi uygun olmayan bir davranış olarak kabul edilir. Bu, hata ayıklayıcı kullanıcıları için önemli bir karışıklığa neden olabilir. Ancak bu yöntemin geçersiz kılınması, C stili başlık+nesne uygulama stilleri gibi şeyler için değerli olabilir.

class myNativeModel
{
    //
    // This method will be called whenever the data model calls IPreferredRuntimeTypeConcept::CastToPreferredRuntimeType
    //
    getPreferredRuntimeTypedObject()
    {
        var loc = this.targetLocation;

        //
        // Perform analysis...
        //
        var runtimeLoc = loc.Add(runtimeObjectOffset);
  
        return host.createTypedObject(runtimeLoc, runtimeModule, runtimeTypeName);
    }
}

Ayrıca bkz.

JavaScript Uzantılarında Yerel Debugger Nesneleri

JavaScript Uzantılarında Yerel Hata Ayıklayıcı Nesneleri - Tasarım ve Test Konuları

JavaScript Hata Ayıklama Betiği

JavaScript Hata Ayıklayıcısı Örnek Betikleri