Delen via


Ingebouwde Debugger-objecten in JavaScript-extensies - Details van Debugger-objecten

In dit onderwerp worden aanvullende informatie beschreven over het gebruik van de systeemeigen foutopsporingsprogrammaobjecten in JavaScript-extensies.

Systeemeigen foutopsporingsprogrammaobjecten vertegenwoordigen verschillende constructies en gedrag van de foutopsporingsprogramma-omgeving. De objecten kunnen worden doorgegeven aan (of verkregen in) JavaScript-extensies om de status van het foutopsporingsprogramma te manipuleren.

Zie Systeemeigen foutopsporingsprogrammaobjecten in JavaScript-extensies voor informatie over JavaScript-extensies voor foutopsporingsprogramma's.

Zie JavaScript Debugger Scripting voor algemene informatie over het werken met JavaScript.

Bijvoorbeeld JavaScript-scripts en -extensies, het foutopsporingsprogramma-team fungeert als host voor een GitHub-opslagplaats op https://github.com/Microsoft/WinDbg-Samples.

Debugger-objecten in JavaScript-extensies

Systeemeigen objecten doorgeven

Foutopsporingsprogrammaobjecten kunnen op verschillende manieren worden doorgegeven aan of verkregen in JavaScript-extensies.

  • Ze kunnen worden doorgegeven aan JavaScript-functies of -methoden
  • Zij kunnen het exemplaar van een object zijn voor een JavaScript-prototype (bijvoorbeeld als visualisator)
  • Ze kunnen worden geretourneerd van hostmethoden die zijn ontworpen om systeemeigen foutopsporingsprogrammaobjecten te maken
  • Ze kunnen worden geretourneerd van hostmethoden die zijn ontworpen om systeemeigen objecten voor foutopsporingsprogramma's te maken

Foutopsporingsprogrammaobjecten die worden doorgegeven aan een JavaScript-extensie, hebben een set functies die in deze sectie worden beschreven.

  • Eigenschapstoegang
  • Geprojecteerde Namen
  • Speciale typen met betrekking tot native debugger objecten
  • Aanvullende kenmerken

Eigenschapstoegang

Hoewel er enkele eigenschappen zijn voor objecten die daar door de JavaScript-provider zelf worden geplaatst, worden de meeste eigenschappen op een systeemeigen object dat JavaScript invoert, geleverd door het gegevensmodel. Dit betekent dat voor toegang tot een eigenschap --- object.propertyName of object[propertyName], het volgende gebeurt.

  • Als propertyName de naam is van een eigenschap die naar het object wordt geprojecteerd door de JavaScript-provider zelf, wordt dit eerst omgezet; anders
  • Als propertyName de naam is van een sleutel die door het gegevensmodel (een andere visualisator) op het object wordt geprojecteerd, zal deze als tweede naar deze naam verwijzen; anders
  • Als propertyName de naam is van een veld van het systeemeigen object, zal het in de derde plaats naar deze naam worden opgelost; anders
  • Als het object een pointer is, wordt de pointer gedereferenceerd en wordt de bovenstaande cyclus voortgezet (een geprojecteerde eigenschap van het gedereferenceerde object gevolgd door een sleutel gevolgd door een native veld)

De normale middelen voor eigenschapstoegang in JavaScript -- object.propertyName en object[propertyName] - hebben toegang tot de onderliggende systeemeigen velden van een object, net zoals de opdracht 'dx' in het foutopsporingsprogramma zou doen.

Verwachte Namen

De volgende eigenschappen (en methoden) worden geprojecteerd op systeemeigen objecten die JavaScript invoeren.

Methode Handtekening Beschrijving
hostContext Vastgoed Retourneert een object dat de context vertegenwoordigt waarin het object zich bevindt (de adresruimte, het doel voor foutopsporing, enzovoort...)
doellocatie Vastgoed Hiermee wordt een object geretourneerd dat een abstractie is van waar het object zich in een adresruimte bevindt (virtueel adres, register, subregister, enzovoort...)
doelgrootte Vastgoed Retourneert de grootte van het object (effectief: sizeof(<TYPE OBJECT>)
voegOuderModelToe .addParentModel(object) Voegt een nieuw bovenliggend model toe (vergelijkbaar met een JavaScript-prototype, maar aan de zijde van het gegevensmodel) aan het object
removeParentModel .removeParentModel(object) Verwijdert een bepaald bovenliggend model uit het object
runtimeTypedObject Vastgoed Voert een analyse uit op het object en probeert het te converteren naar het runtime-type (meest afgeleid)
doeltype Vastgoed JavaScript-extensies hebben directe toegang tot het type systeem van de onderliggende taal. Deze toegang wordt uitgedrukt via het begrip van typeobjecten. Zie Systeemeigen foutopsporingsprogrammaobjecten in JavaScript-extensies - Type-objecten voor meer informatie

Als het object een aanwijzer is, worden de volgende eigenschappen (en methoden) geprojecteerd op de aanwijzer die JavaScript invoert:

Naam van propertie Handtekening Beschrijving
toevoegen .add(value) Hiermee wordt de wiskundige toevoeging van de aanwijzer tussen de aanwijzer en de opgegeven waarde uitgevoerd
adres Vastgoed Retourneert het adres van de aanwijzer als een 64-bits ordinaal object (een bibliotheektype)
dereferentie .dereference() Dereferentieert de pointer en retourneert het onderliggende object
isNull Vastgoed Geeft als resultaat of de aanwijzerwaarde nullptr (0) is

Speciale typen met betrekking tot systeemeigen foutopsporingsprogrammaobjecten

Locatieobjecten

Het locatieobject dat wordt geretourneerd vanuit de eigenschap targetLocation van een systeemeigen object bevat de volgende eigenschappen (en methoden).

Naam van propertie Handtekening Beschrijving
toevoegen .add(value) Hiermee voegt u een absolute byte-offset toe aan de locatie.
aftrekken .aftrekken(waarde) Hiermee trekt u een absolute byte-offsetwaarde af van de locatie.

Aanvullende kenmerken

Iterabiliteit

Elk object dat als itereerbaar wordt beschouwd door het gegevensmodel (het is een native array of het heeft een visualisatie (NatVis of anderszins) waardoor het itereerbaar is) heeft een iteratorfunctie (volgens de ES6-standaard van Symbol.iterator). Dit betekent dat u als volgt een systeemeigen object in JavaScript kunt herhalen.

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++.
        //
    }
}

Indexeerbaarheid

Objecten die in één dimensie kunnen worden geïndexeerd via ordinalen (bijvoorbeeld arrays), kunnen in JavaScript worden geïndexeerd via de standaard eigenschapstoegangsoperator -- object[index]. Als een object kan worden geïndexeerd op naam of in meer dan één dimensie kan worden geïndexeerd, worden de methoden getValueAt en setValueAt naar het object geprojecteerd, zodat JavaScript-code de indexeerfunctie kan gebruiken.

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

Tekenreeksconversie

Elk systeemeigen object dat een weergavetekenreeksconversie heeft via ondersteuning van IStringDisplayableConcept of een NatVis DisplayString-element, heeft die tekenreeksconversie toegankelijk via de standaard JavaScript toString-methode.

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

Native debuggerobjecten maken

Zoals vermeld, kan een JavaScript-script toegang krijgen tot systeemeigen objecten door ze op een van verschillende manieren door te geven aan JavaScript of door middel van aanroepen naar de hostbibliotheek. Gebruik de volgende functies om systeemeigen foutopsporingsprogrammaobjecten te maken.

Methode Handtekening Beschrijving

host.getModuleSymbol

getModuleSymbol(moduleName, symbolName, [contextInheritor])

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

Retourneert een object voor een globaal symbool binnen een bepaalde module. De modulenaam en symboolnaam zijn tekenreeksen.

Als het optionele argument contextInheritor wordt opgegeven, worden de module en het symbool opgezoekd binnen dezelfde context (adresruimte, doel voor foutopsporing) als het doorgegeven object. Als het argument niet is opgegeven, worden de module en het symbool opgezoekd in de huidige context van het foutopsporingsprogramma. Een JavaScript-extensie die geen eenmalig testscript is, moet altijd een expliciete context opgeven.

Als het optionele argument TypeName wordt opgegeven, wordt ervan uitgegaan dat het symbool van het doorgegeven type is en het type dat wordt aangegeven in symbolen, wordt genegeerd. Houd er rekening mee dat elke beller die verwacht te werken op openbare symbolen voor een module altijd een expliciete typenaam moet opgeven.

host.getModuleContainingSymbol

getModuleContainingSymbol(location, [contextInheritor])

Retourneert het symbool (bijvoorbeeld functie of gegevens) dat het opgegeven adres bevat. Houd er rekening mee dat dit alleen werkt als er privé-symbolen zijn voor de module die het opgegeven adres bevat.

Als het optionele argument contextInheritor wordt opgegeven, worden de module en het symbool opgezoekd binnen dezelfde context (adresruimte, doel voor foutopsporing) als het doorgegeven object. Als het argument niet is opgegeven, worden de module en het symbool opgezoekd in de huidige context van het foutopsporingsprogramma. Een JavaScript-extensie die geen eenmalig testscript is, moet altijd een expliciete context opgeven.

host.createPointerObject

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

Hiermee maakt u een aanwijzerobject op het opgegeven adres of de opgegeven locatie. De modulenaam en typenaam zijn tekenreeksen.

Als het optionele argument contextInheritor wordt opgegeven, worden de module en het symbool opgezoekd binnen dezelfde context (adresruimte, doel voor foutopsporing) als het doorgegeven object. Als het argument niet is opgegeven, worden de module en het symbool opgezoekd in de huidige context van het foutopsporingsprogramma. Een JavaScript-extensie die geen eenmalig testscript is, moet altijd een expliciete context opgeven.

host.createTypedObject

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

Hiermee maakt u een object dat een systeemeigen getypt object vertegenwoordigt binnen de adresruimte van een foutopsporingsdoel op de opgegeven locatie. De modulenaam en typenaam zijn tekenreeksen.

Als het optionele argument contextInheritor wordt opgegeven, worden de module en het symbool opgezoekd binnen dezelfde context (adresruimte, doel voor foutopsporing) als het doorgegeven object. Als het argument niet is opgegeven, worden de module en het symbool opgezoekd in de huidige context van het foutopsporingsprogramma. Een JavaScript-extensie die geen eenmalig testscript is, moet altijd een expliciete context opgeven.

Host-API's voor JavaScript-extensies

De JavaScript-provider voegt een object met de naam host in de globale naamruimte in van elk script dat wordt geladen. Dit object biedt toegang tot kritieke functionaliteit voor het script en toegang tot de naamruimte van het foutopsporingsprogramma. Het wordt in twee fasen ingesteld.

  • Fase 1: Voordat een script wordt uitgevoerd, bevat het hostobject alleen de minimale set functionaliteit die nodig is voor een script om zichzelf te initialiseren en de uitbreidbaarheidspunten te registreren (zowel als producent als consument). De hoofd- en initialisatiecode is niet bedoeld om de status van een foutopsporingsdoel te manipuleren of complexe bewerkingen uit te voeren. De host is daarom pas volledig ingevuld nadat de initializeScript-methode is geretourneerd.

  • Fase 2: Nadat initializeScript is geretourneerd, wordt het hostobject gevuld met alles wat nodig is om de status van foutopsporingsdoelen te manipuleren.

Hostobjectniveau

Enkele belangrijke onderdelen van de functionaliteit bevinden zich direct onder het hostobject. De rest zijn subnaamruimtes. Namespaces omvatten het volgende.

Namespace Beschrijving
diagnostische gegevens Functionaliteit om te helpen bij de diagnose en foutopsporing van scriptcode
geheugen Functionaliteit om geheugen lezen en schrijven in te schakelen binnen een foutopsporingsdoel

Hoofdniveau

Direct binnen het hostobject vindt u de volgende eigenschappen, methoden en constructors.

Naam Handtekening Aanwezige fase Beschrijving
createPointerObject

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

2 Hiermee maakt u een aanwijzerobject op het opgegeven adres of de opgegeven locatie. De modulenaam en typenaam zijn tekenreeksen. Het optionele argument contextInheritor werkt net als bij getModuleSymbol.
createTypedObject

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

2 Hiermee maakt u een object dat een systeemeigen getypt object vertegenwoordigt binnen de adresruimte van een foutopsporingsdoel op de opgegeven locatie. De modulenaam en typenaam zijn tekenreeksen. Het optionele argument contextInheritor werkt net als bij getModuleSymbol.
currentProcess

Vastgoed

2 Retourneert het object dat het huidige proces van het foutopsporingsprogramma vertegenwoordigt
huidigeSessie

Vastgoed

2 Retourneert het object dat de huidige sessie van het foutopsporingsprogramma vertegenwoordigt waarin wordt gediagnosticeerd (met welke doelinstelling, dump, enzovoort...).
currentThread

Vastgoed

2 Retourneert het object dat de huidige thread van het foutopsporingsprogramma vertegenwoordigt
evaluateExpression

evaluateExpression(expression, [contextInheritor])

2 Hiermee wordt de foutopsporingshost aangespoord om een expressie te evalueren met behulp van de taal van het foutopsporingsdoel. Als het optionele argument contextInheritor wordt opgegeven, wordt de expressie geëvalueerd in de context (bijvoorbeeld adresruimte en doel voor foutopsporing) van het argument; anders wordt deze geëvalueerd in de huidige context van het foutopsporingsprogramma
evaluateExpressionInContext

evaluateExpressionInContext(context, expressie)

2 Hiermee wordt de foutopsporingshost aangespoord om een expressie te evalueren met behulp van de taal van het foutopsporingsdoel. Het contextargument geeft de impliciete aanwijzer aan die moet worden gebruikt voor de evaluatie. De expressie wordt geëvalueerd in de context (bijvoorbeeld adresruimte en doel voor foutopsporing), aangegeven door het contextargument .
getModuleSymbol

getModuleSymbol(moduleName, symbolName, [contextInheritor])

2 Retourneert een object voor een globaal symbool binnen een bepaalde module. De modulenaam en symboolnaam zijn tekenreeksen. Als het optionele argument contextInheritor wordt opgegeven, worden de module en het symbool opgezoekd binnen dezelfde context (adresruimte, doel voor foutopsporing) als het doorgegeven object. Als het argument niet is opgegeven, worden de module en het symbool opgezoekd in de huidige context van het foutopsporingsprogramma. Een JavaScript-extensie die geen eenmalig script is, moet altijd een expliciete context opgeven
getNamedModel

getNamedModel(modelName)

2 Retourneert het gegevensmodel dat is geregistreerd op basis van een bepaalde naam. Houd er rekening mee dat het volkomen legaal is om dit te noemen tegen een naam die nog niet is geregistreerd. Als u dit doet, wordt er een stub aangemaakt voor die naam, en manipulatiewijzigingen van de stub zullen bij registratie worden toegepast op het feitelijke object.
geïndexeerdeWaarde

nieuwe indexedValue(waarde, indicies)

2 Een constructor voor een object dat kan worden geretourneerd vanuit een JavaScript-iterator om een standaardset indicies toe te wijzen aan de itereerde waarde. De set met indicies moet worden uitgedrukt als een JavaScript-matrix.
Int64

nieuwe Int64(waarde; [highValue])

1 Hiermee wordt een bibliotheektype Int64 samengesteld. De versie met één argument accepteert elke waarde die zonder conversie in een Int64 kan worden verpakt en plaatst deze daarin. Als er een optioneel tweede argument wordt opgegeven, wordt een conversie van het eerste argument in de onderste 32 bits verpakt en wordt een conversie van het tweede argument in de bovenste 32 bits verpakt.
namedModelParent

nieuwe namedModelParent(object, naam)

1 Een constructor voor een object dat is bedoeld om te worden geplaatst in de matrix die wordt geretourneerd door initializeScript. Dit vertegenwoordigt het gebruik van een JavaScript-prototype of ES6-klasse als bovenliggende extensie van een gegevensmodel met de opgegeven naam
geregistreerdModelRegistratie

nieuwe namedModelRegistration(object, naam)

1 Een constructor voor een object dat is bedoeld om te worden geplaatst in de matrix die wordt geretourneerd door initializeScript. Dit vertegenwoordigt de registratie van een JavaScript-prototype of ES6-klasse als een gegevensmodel via een bekende naam, zodat andere extensies kunnen zoeken en uitbreiden
naamruimte

Vastgoed

2 Geeft directe toegang tot de hoofdnaamruimte van het foutopsporingsprogramma. U kunt bijvoorbeeld toegang krijgen tot de proceslijst van het eerste foutopsporingsdoel via host.namespace.Debugger.Sessions.First(). Processen die deze eigenschap gebruiken
registerNamedModel

registerNamedModel(object, modelName)

2 Hiermee wordt een JavaScript-prototype of ES6-klasse geregistreerd als een gegevensmodel onder de opgegeven naam. Met een dergelijke registratie kan het prototype of de klasse worden gevonden en uitgebreid door andere scripts of andere extensies voor foutopsporingsprogramma's. Houd er rekening mee dat een script liever een benoemdModelRegistration-object retourneert vanuit de initializeScript-methode in plaats van dit imperatief te doen. Elk script dat wijzigingen aanbrengt, is vereist om een initializeScript-methode te hebben om op te schonen.
registerExtensionForTypeSignature

registreerExtensieVoorTypeHandtekening(object, typeHandtekening)

2 Hiermee wordt een JavaScript-prototype of ES6-klasse geregistreerd als een uitbreidingsgegevensmodel voor een native type, zoals gespecificeerd door de typehandtekening. Houd er rekening mee dat een script liever een typeSignatureExtension-object retourneert vanuit de initializeScript-methode in plaats van dit imperatief te doen. Elk script dat wijzigingen aanbrengt, is vereist om een initializeScript-methode te hebben om op te schonen.
PrototyperegistrerenVoorTypeHandtekening

registerPrototypeForTypeSignature(object, typeSignature)

2 Hiermee registreer je een JavaScript-prototype of ES6-klasse als het canonieke gegevensmodel (bijvoorbeeld visualizer) voor een ingebouwd type zoals gedefinieerd door de typehandtekening. Houd er rekening mee dat een script liever een typeSignatureRegistration-object retourneert vanuit de initializeScript-methode in plaats van dit imperatief te doen. Elk script dat wijzigingen aanbrengt, moet een uninitializeScript-methode hebben om op te schonen.
parseInt64

parseInt64(tekenreeks; [radix])

1 Deze methode werkt op dezelfde manier als de standaard JavaScript parseInt-methode, behalve dat deze in plaats daarvan een bibliotheek int64-type retourneert. Als een radix wordt opgegeven, vindt het parsen plaats in de basis 2, 8, 10 of 16 zoals gespecificeerd.
typehandtekeninguitbreiding

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

1 Een constructor voor een object dat is bedoeld om te worden geplaatst in de matrix die wordt geretourneerd door initializeScript. Dit vertegenwoordigt een uitbreiding van een systeemeigen type dat wordt beschreven via een typehandtekening door een JavaScript-prototype of ES6-klasse. Een dergelijke registratie voegt velden toe aan de visualisatie van de debugger voor elk type dat overeenkomt met de signatuur, in plaats van het volledig over te nemen. Een optionele modulenaam en -versie kunnen de registratie beperken. Versies worden opgegeven als tekenreeksen in de stijl 1.2.3.4.
typeHandtekeningRegistratie

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

1 Een constructor voor een object dat is bedoeld om in de matrix te worden geplaatst die wordt geretourneerd door initializeScript. Dit vertegenwoordigt een canonieke registratie van een JavaScript-prototype of ES6-klasse op basis van een systeemeigen typehandtekening. Een dergelijke registratie 'neemt' in plaats daarvan de visualisatie van het foutopsporingsprogramma over van elk type dat overeenkomt met de handtekening, in plaats van het alleen maar uit te breiden. Een optionele modulenaam en -versie kunnen de registratie beperken. Versies worden opgegeven als tekenreeksen in de stijl 1.2.3.4.
unregisterNamedModel ongedaan maken

unregisterNamedModel(modelName)

2 Hiermee wordt een gegevensmodel met de opgegeven naam uit de registratie verwijderd, waarmee elke bewerking die door registerNamedModel is uitgevoerd, wordt teruggedraaid.
unregisterExtensionForTypeSignature

unregisterExtensionForTypeSignature(object, typeSignature, [moduleName], [minVersion], [maxVersion])

2 Hierdoor wordt de registratie van een JavaScript-prototype of ES6-klasse als extensie datamodel voor een native type ongedaan gemaakt, zoals bepaald door de typehandtekening. Het is de logische ongedaanmaking van registerExtensionForTypeSignature. Houd er rekening mee dat een script liever een typeSignatureExtension-object retourneert vanuit de initializeScript-methode in plaats van dit imperatief te doen. Elk script dat wijzigingen aanbrengt, is vereist om een initializeScript-methode te hebben om op te schonen. Een optionele modulenaam en -versie kunnen de registratie beperken. Versies worden opgegeven als tekenreeksen in de stijl 1.2.3.4.
deregistreerPrototypeVoorTypeHandtekening

unregisterPrototypeForTypeSignature(object, typeSignature, [moduleName], [minVersion], [maxVersion])

2 Hierdoor wordt de registratie van een JavaScript-prototype of ES6-klasse als het standaard gegevensmodel (bijvoorbeeld visualizer) voor een systeemeigen type opgeheven, zoals gespecificeerd door de typehandtekening. Het is de logische ongedaakmaking van registerPrototypeForTypeSignature. Houd er rekening mee dat een script liever een typeSignatureRegistration-object retourneert vanuit de initializeScript-methode in plaats van dit imperatief te doen. Elk script dat wijzigingen aanbrengt, moet een uninitializeScript-methode hebben om op te schonen. Een optionele modulenaam en -versie kunnen de registratie beperken. Versies worden opgegeven als tekenreeksen in de stijl 1.2.3.4.

Diagnostische functionaliteit

De diagnostische subnaamruimte van het hostobject bevat het volgende.

Naam Handtekening Fase aanwezig Beschrijving
foutopsporingslogboek debugLog(object...) 1 Dit biedt printf-stijl foutopsporing voor een scriptuitbreiding. Op dit moment wordt uitvoer van foutopsporingslogboek doorgestuurd naar de uitvoerconsole van het foutopsporingsprogramma. Op een later tijdstip zijn er plannen om flexibiliteit te bieden voor het routeren van deze uitvoer. OPMERKING: Dit mag niet worden gebruikt als een middel om gebruikersuitvoer naar de console af te drukken. Het kan daar in de toekomst misschien niet worden gerouteerd.

Geheugenfunctionaliteit

De subnaamruimte geheugen van het hostobject bevat het volgende.

Naam Handtekening Fase aanwezig Beschrijving
readMemoryValues

leesGeheugenWaarden(locatie, aantalElementen, [elementGrootte], [isGetekend], [contextOvernemer])

2 Hiermee wordt een onbewerkte matrix met waarden gelezen uit de adresruimte van het doel voor foutopsporing en wordt een getypte matrix boven op de weergave van dit geheugen geplaatst. De opgegeven locatie kan een adres (een 64-bits waarde), een locatieobject of een systeemeigen aanwijzer zijn. De grootte van de matrix wordt aangegeven met het argument numElements . De grootte (en het type) van elk element van de matrix wordt gegeven door de optionele elementSize en isSigned-argumenten . Als er geen dergelijke argumenten worden opgegeven, is de standaard byte (niet-ondertekende / 1 byte). Als het optionele argument contextInheritor wordt opgegeven, wordt het geheugen gelezen in de context (bijvoorbeeld adresruimte en doel voor foutopsporing) aangegeven door het argument; anders wordt deze gelezen uit de huidige context van het foutopsporingsprogramma. Houd er rekening mee dat het gebruik van deze methode op 8-, 16- en 32-bits waarden resulteert in een snelle getypte weergave die over het leesgeheugen wordt geplaatst. Als u deze methode op 64-bits waarden gebruikt, resulteert dit in een matrix van 64-bits bibliotheektypen die aanzienlijk duurder zijn.
readString

readString(location, [contextInheritor])

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

2 Hiermee wordt een smalle tekenreeks (huidige codepagina) uit de adresruimte van een foutopsporingsdoel gelezen, geconverteerd naar UTF-16 en wordt het resultaat geretourneerd als een JavaScript-tekenreeks. Er kan een uitzondering optreden als het geheugen niet kan worden gelezen. De opgegeven locatie kan een adres (een 64-bits waarde), een locatieobject of een systeemeigen teken zijn. Als het optionele argument contextInheritor wordt opgegeven, wordt het geheugen gelezen in de context (bijvoorbeeld adresruimte en doel voor foutopsporing) aangegeven door het argument; anders wordt deze gelezen uit de huidige context van het foutopsporingsprogramma. Als het optionele lengteargument wordt opgegeven, is de leestekenreeks van de opgegeven lengte.
readWideString

readWideString(location, [contextInheritor])

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

2 Hiermee wordt een brede tekenreeks (UTF-16) gelezen uit de adresruimte van een foutopsporingsdoel en wordt het resultaat geretourneerd als een JavaScript-tekenreeks. Er kan een uitzondering optreden als het geheugen niet kan worden gelezen. De opgegeven locatie kan een adres (een 64-bits waarde), een locatieobject of een systeemeigen wchar_t zijn. Als het optionele argument contextInheritor wordt opgegeven, wordt het geheugen gelezen in de context (bijvoorbeeld adresruimte en doel voor foutopsporing) aangegeven door het argument; anders wordt deze gelezen uit de huidige context van het foutopsporingsprogramma. Als het optionele lengteargument wordt opgegeven, is de leestekenreeks van de opgegeven lengte.

Concepten van gegevensmodellen in JavaScript

Gegevensmodelmapping

De volgende concepten van gegevensmodellen komen overeen met JavaScript.

Begrip Systeemeigen interface JavaScript-equivalent
Tekenreeksconversie IStringDisplayableConcept standaard: toString(...){...}
Iterabiliteit IIterableConcept standaard: [Symbol.iterator](){...}
Indexeerbaarheid IIndexableConcept protocol: getDimensionality(...) / getValueAt(...) / setValueAt(...)
Conversie van runtimetype IPreferredRuntimeTypeConcept protocol: getPreferredRuntimeTypedObject(...)

Tekenreeksconversie

Het concept voor tekenreeksconversie (IStringDisplayableConcept) komt rechtstreeks overeen met de standaardmethode JavaScript toString. Aangezien alle JavaScript-objecten een tekenreeksconversie hebben (geleverd door Object.prototype als dit niet elders wordt opgegeven), kan elk JavaScript-object dat wordt geretourneerd naar het gegevensmodel, worden geconverteerd naar een weergavetekenreeks. Voor het overschrijven van de tekenreeksconversie hoeft u alleen uw eigen toString te implementeren.

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

Iterabiliteit

Het concept van het gegevensmodel of een object iterabel is, komt rechtstreeks overeen met het ES6-protocol of een object iterabel is. Elk object met een methode [Symbol.iterator] wordt beschouwd als itereerbaar. Door dit te implementeren, wordt het object iterabel.

Een object dat alleen iterabel is, kan als volgt worden geïmplementeerd.

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";
    }
}

Er moet speciale aandacht worden besteed aan objecten die zowel curseerbaar als indexeerbaar zijn als de objecten die worden geretourneerd door de iterator, moeten de index en de waarde bevatten via een speciaal retourtype.

Iterable en Indexable

Een object dat kan worden itereerbaar en geïndexeerbaar, vereist een speciale retourwaarde van de iterator. In plaats van de waarden op te geven, levert de iterator exemplaren van indexedValue op. De indicies worden doorgegeven als een matrix in het tweede argument aan de indexedValue-constructor. Ze kunnen multidimensionaal zijn, maar moeten overeenkomen met de dimensionaliteit die wordt geretourneerd in het indexeerprotocol.

Deze code toont een voorbeeld van een implementatie.

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]);
    }
}

Indexeerbaarheid

In tegenstelling tot JavaScript maakt het gegevensmodel een zeer expliciete differentiatie tussen eigenschapstoegang en indexering. Elk JavaScript-object dat zichzelf als indexeerbaar in het gegevensmodel wil presenteren, moet een protocol implementeren dat bestaat uit een getDimensionality-methode die de dimensionaliteit van de indexeerfunctie retourneert en een optioneel paar getValueAt- en setValueAt-methoden waarmee lees- en schrijfbewerkingen van het object worden uitgevoerd op opgegeven indicies. Het is acceptabel om de getValueAt- of setValueAt-methoden weg te laten als het object alleen-lezen of alleen-schrijven is

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

Conversie van runtimetype

Dit is alleen relevant voor JavaScript-prototypes/-klassen die zijn geregistreerd op typesysteemtypen (systeemeigen). Het foutopsporingsprogramma is vaak in staat om analyse uit te voeren (bijvoorbeeld Run-Time Type Information (RTTI) / v-table-analyse) om het werkelijke runtimetype van een object te bepalen van een statisch type dat wordt uitgedrukt in code. Een gegevensmodel dat is geregistreerd voor een systeemeigen type, kan dit gedrag overschrijven via een implementatie van de IPreferredRuntimeTypeConcept. Op dezelfde manier kan een JavaScript-klasse of prototype die is geregistreerd op basis van een systeemeigen object een eigen implementatie bieden via de implementatie van een protocol dat bestaat uit de methode getPreferredRuntimeTypedObject.

Hoewel deze methode technisch gezien iets kan retourneren, wordt deze beschouwd als een slechte vorm om iets te retourneren dat niet echt het runtimetype of een afgeleid type is. Dit kan leiden tot aanzienlijke verwarring voor gebruikers van het foutopsporingsprogramma. Het overschrijven van deze methode kan echter waardevol zijn voor zaken zoals C-style header+object styles of implementation, enzovoort...

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);
    }
}

Zie ook

Systeemeigen Debugger-objecten in JavaScript-extensies

Systeemeigen foutopsporingsprogrammaobjecten in JavaScript-extensies - Ontwerp- en testoverwegingen

Scripting voor JavaScript-foutopsporingsprogramma's

Voorbeeldscripts voor javaScript-foutopsporingsprogramma's