다음을 통해 공유


JavaScript 확장의 네이티브 디버거 개체 - 디버거 개체 세부 정보

이 항목에서는 JavaScript 확장에서 네이티브 디버거 개체를 사용하는 방법에 대한 추가 세부 정보를 설명합니다.

네이티브 디버거 개체는 디버거 환경의 다양한 구문과 동작을 나타냅니다. 개체를 JavaScript 확장으로 전달(또는 획득)하여 디버거의 상태를 조작할 수 있습니다.

디버거 개체 JavaScript 확장에 대한 자세한 내용은 JavaScript 확장의 네이티브 디버거 개체를 참조하세요.

JavaScript 작업에 대한 일반적인 내용은 JavaScript 디버거 스크립팅을 참조하세요.

예를 들어 JavaScript 스크립트 및 확장과 같은 디버거 팀은 에서 https://github.com/Microsoft/WinDbg-SamplesGitHub 리포지토리를 호스트합니다.

JavaScript 확장의 디버거 개체

네이티브 개체 전달

디버거 개체는 다양한 방법으로 JavaScript 확장으로 전달되거나 획득할 수 있습니다.

  • JavaScript 함수 또는 메서드에 전달할 수 있습니다.
  • JavaScript 프로토타입의 instance 개체일 수 있습니다(시각화 도우미로, instance).
  • 네이티브 디버거 개체를 만들도록 설계된 호스트 메서드에서 반환할 수 있습니다.
  • 디버거 네이티브 개체를 만들도록 설계된 호스트 메서드에서 반환할 수 있습니다.

JavaScript 확장에 전달되는 디버거 개체에는 이 섹션에 설명된 기능 집합이 있습니다.

  • 속성 액세스
  • 프로젝스된 이름
  • 네이티브 디버거 개체와 관련된 특수 형식
  • 추가 특성

속성 액세스

JavaScript 공급자 자체에 의해 배치되는 개체에는 일부 속성이 있지만 JavaScript를 입력하는 네이티브 개체의 대부분의 속성은 데이터 모델에서 제공됩니다. 즉, object.propertyName 또는 object[propertyName]--- 속성 액세스의 경우 다음이 발생합니다.

  • propertyName이 JavaScript 공급자 자체에 의해 개체에 프로젝터된 속성의 이름이면 먼저 이 속성으로 resolve. 그렇지 않으면 입니다.
  • propertyName이 데이터 모델(다른 시각화 도우미)에 의해 개체에 프로젝션된 키의 이름인 경우 두 번째 이름으로 resolve. 그렇지 않으면 입니다.
  • propertyName이 네이티브 개체의 필드 이름인 경우 세 번째 이름으로 resolve. 그렇지 않으면 입니다.
  • 개체가 포인터인 경우 포인터는 역참조되고 위의 주기는 계속됩니다(역참조된 개체의 프로젝션된 속성과 뒤에 네이티브 필드가 오는 키).

JavaScript의 일반적인 속성 액세스 수단인 object.propertyName 및 object[propertyName]은 디버거 내에서 'dx' 명령과 마찬가지로 개체의 기본 네이티브 필드에 액세스합니다.

프로젝스된 이름

다음 속성(및 메서드)은 JavaScript를 입력하는 네이티브 개체에 프로젝트됩니다.

메서드 서명 Description
hostContext 속성 개체가 있는 컨텍스트(주소 공간, 디버그 대상 등)를 나타내는 개체를 반환합니다.
targetLocation 속성 개체가 주소 공간(가상 주소, 레지스터, 하위 레지스터 등)에 있는 추상화인 개체를 반환합니다.
targetSize 속성 개체의 크기를 반환합니다(효과적으로: sizeof(<TYPE OF OBJECT>)
addParentModel .addParentModel(object) 개체에 새 부모 모델(JavaScript 프로토타입과 비슷하지만 데이터 모델 쪽)을 추가합니다.
removeParentModel .removeParentModel(object) 개체에서 지정된 부모 모델을 제거합니다.
runtimeTypedObject 속성 개체에 대한 분석을 수행하고 런타임(가장 파생된) 형식으로 변환하려고 시도합니다.
targetType 속성 JavaScript 확장은 기본 언어의 형식 시스템에 직접 액세스할 수 있습니다. 이 액세스는 형식 개체의 개념을 통해 표현됩니다. 자세한 내용은 JavaScript 확장의 네이티브 디버거 개체 - 형식 개체를 참조하세요.

개체가 포인터인 경우 JavaScript를 입력하는 포인터에 다음 속성(및 메서드)이 투영됩니다.

속성 이름 서명 Description
add .add(value) 포인터와 지정된 값 사이에 포인터 수학 추가를 수행합니다.
address 속성 포인터의 주소를 64비트 서수 개체(라이브러리 형식)로 반환합니다.
역참조 .dereference() 포인터를 역참조하고 기본 개체를 반환합니다.
Isnull 속성 포인터 값이 nullptr인지 여부를 반환합니다(0).

네이티브 디버거 개체와 관련된 특수 형식

위치 개체

네이티브 개체의 targetLocation 속성에서 반환되는 location 개체에는 다음 속성(및 메서드)이 포함됩니다.

속성 이름 서명 Description
add .add(value) 위치에 절대 바이트 오프셋을 추가합니다.
빼기(subtract) .subtract(value) 위치에서 절대 바이트 오프셋을 뺍니다.

추가 특성

반복성

데이터 모델에서 반복 가능한 것으로 인식되는 모든 개체(네이티브 배열이거나 시각화 도우미(NatVis 또는 기타)가 있어 반복기 함수(ES6 표준 Symbol.iterator를 통해 인덱싱됨)가 배치됩니다. 즉, 다음과 같이 JavaScript에서 네이티브 개체를 반복할 수 있습니다.

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

인덱싱 가능성

서수를 통해 1차원에서 인덱싱 가능으로 인식되는 개체(예: 네이티브 배열)는 표준 속성 액세스 연산자인 object[index]를 통해 JavaScript에서 인덱싱할 수 있습니다. 개체를 이름으로 인덱싱할 수 있거나 둘 이상의 차원에서 인덱싱할 수 있는 경우 javaScript 코드가 인덱서를 활용할 수 있도록 getValueAt 및 setValueAt 메서드가 개체에 프로젝팅됩니다.

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

문자열 변환

IStringDisplayableConcept 또는 NatVis DisplayString 요소를 지원하여 표시 문자열 변환이 있는 네이티브 개체는 표준 JavaScript toString 메서드를 통해 해당 문자열 변환에 액세스할 수 있습니다.

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

네이티브 디버거 개체 만들기

언급했듯이 JavaScript 스크립트는 여러 가지 방법 중 하나로 JavaScript에 전달하거나 호스트 라이브러리에 대한 호출을 통해 만들 수 있도록 하여 네이티브 개체에 액세스할 수 있습니다. 다음 함수를 사용하여 네이티브 디버거 개체를 만듭니다.

메서드 서명 Description

host.getModuleSymbol

getModuleSymbol(moduleName, symbolName, [contextInheritor])

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

특정 모듈 내의 전역 기호에 대한 개체를 반환합니다. 모듈 이름 및 기호 이름은 문자열입니다.

선택적 contextInheritor 인수가 제공되면 모듈 및 기호가 전달된 개체와 동일한 컨텍스트(주소 공간, 디버그 대상) 내에서 조회됩니다. 인수가 제공되지 않으면 모듈 및 기호가 디버거의 현재 컨텍스트에서 조회됩니다. 일회성 테스트 스크립트가 아닌 JavaScript 확장은 항상 명시적 컨텍스트를 제공해야 합니다.

선택적 typeName 인수가 제공되면 기호는 전달된 형식으로 간주되고 기호에 표시된 형식은 무시됩니다. 모듈의 공용 기호에서 작동해야 하는 호출자는 항상 명시적 형식 이름을 제공해야 합니다.

host.getModuleContainingSymbol

getModuleContainingSymbol(location, [contextInheritor])

지정된 주소를 포함하는 기호(예: 함수 또는 데이터)를 반환합니다. 지정된 주소를 포함하는 모듈에 대한 프라이빗 기호가 있는 경우에만 작동합니다.

선택적 contextInheritor 인수가 제공되면 모듈 및 기호가 전달된 개체와 동일한 컨텍스트(주소 공간, 디버그 대상) 내에서 조회됩니다. 인수가 제공되지 않으면 모듈 및 기호가 디버거의 현재 컨텍스트에서 조회됩니다. 일회성 테스트 스크립트가 아닌 JavaScript 확장은 항상 명시적 컨텍스트를 제공해야 합니다.

host.createPointerObject

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

지정된 주소 또는 위치에 포인터 개체를 만듭니다. 모듈 이름 및 형식 이름은 문자열입니다.

선택적 contextInheritor 인수가 제공되면 모듈 및 기호가 전달된 개체와 동일한 컨텍스트(주소 공간, 디버그 대상) 내에서 조회됩니다. 인수가 제공되지 않으면 모듈 및 기호가 디버거의 현재 컨텍스트에서 조회됩니다. 일회성 테스트 스크립트가 아닌 JavaScript 확장은 항상 명시적 컨텍스트를 제공해야 합니다.

host.createTypedObject

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

지정된 위치에 있는 디버그 대상의 주소 공간 내에 네이티브 형식의 개체를 나타내는 개체를 만듭니다. 모듈 이름 및 형식 이름은 문자열입니다.

선택적 contextInheritor 인수가 제공되면 모듈 및 기호가 전달된 개체와 동일한 컨텍스트(주소 공간, 디버그 대상) 내에서 조회됩니다. 인수가 제공되지 않으면 모듈 및 기호가 디버거의 현재 컨텍스트에서 조회됩니다. 일회성 테스트 스크립트가 아닌 JavaScript 확장은 항상 명시적 컨텍스트를 제공해야 합니다.

JavaScript 확장에 대한 호스트 API

JavaScript 공급자는 호스트라는 개체를 로드하는 모든 스크립트의 전역 네임스페이스에 삽입합니다. 이 개체는 스크립트에 대한 중요한 기능과 디버거의 네임스페이스에 대한 액세스를 제공합니다. 두 단계로 설정됩니다.

  • 1단계: 스크립트가 실행되기 전에 호스트 개체에는 스크립트가 자체적으로 초기화하고 확장성 지점(생산자 및 소비자 모두)을 등록하는 데 필요한 최소한의 기능 집합만 포함됩니다. 루트 및 초기화 코드는 디버그 대상의 상태를 조작하거나 복잡한 작업을 수행하기 위한 것이 아니며, 따라서 initializeScript 메서드가 반환될 때까지 호스트가 완전히 채워지지 않습니다.

  • 2단계: initializeScript가 반환된 후 호스트 개체는 디버그 대상의 상태를 조작하는 데 필요한 모든 항목으로 채워집니다.

호스트 개체 수준

몇 가지 주요 기능은 호스트 개체 바로 아래에 있습니다. 나머지는 하위 이름스페이스입니다. 네임스페이스에는 다음이 포함됩니다.

네임스페이스 Description
진단 스크립트 코드의 진단 및 디버깅을 지원하는 기능
메모리 디버그 대상 내에서 메모리 읽기 및 쓰기를 사용하도록 설정하는 기능

루트 수준

호스트 개체 내에서 직접 다음 속성, 메서드 및 생성자를 찾을 수 있습니다.

이름 서명 단계 존재 Description
createPointerObject

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

2 지정된 주소 또는 위치에 포인터 개체를 만듭니다. 모듈 이름 및 형식 이름은 문자열입니다. 선택적 contextInheritor 인수는 getModuleSymbol과 같이 작동합니다.
createTypedObject

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

2 지정된 위치에 있는 디버그 대상의 주소 공간 내에 네이티브 형식의 개체를 나타내는 개체를 만듭니다. 모듈 이름 및 형식 이름은 문자열입니다. 선택적 contextInheritor 인수는 getModuleSymbol과 같이 작동합니다.
currentProcess

속성

2 디버거의 현재 프로세스를 나타내는 개체를 반환합니다.
currentSession

속성

2 디버깅 중인 디버거의 현재 세션(대상, 덤프 등)을 나타내는 개체를 반환합니다.
currentThread

속성

2 디버거의 현재 스레드를 나타내는 개체를 반환합니다.
evaluateExpression

evaluateExpression(expression, [contextInheritor])

2 이렇게 하면 디버그 호스트를 호출하여 디버그 대상의 언어만 사용하여 식을 평가합니다. 선택적 contextInheritor 인수가 제공되면 인수의 컨텍스트(예: 주소 공간 및 디버그 대상)에서 식이 계산됩니다. 그렇지 않으면 디버거의 현재 컨텍스트에서 평가됩니다.
evaluateExpressionInContext

evaluateExpressionInContext(context, expression)

2 이렇게 하면 디버그 호스트를 호출하여 디버그 대상의 언어만 사용하여 식을 평가합니다. 컨텍스트 인수는 평가에 사용할 암시적 이 포인터를 나타냅니다. 식은 컨텍스트 인수로 표시된 컨텍스트(예: 주소 공간 및 디버그 대상)에서 평가됩니다.
getModuleSymbol

getModuleSymbol(moduleName, symbolName, [contextInheritor])

2 특정 모듈 내의 전역 기호에 대한 개체를 반환합니다. 모듈 이름 및 기호 이름은 문자열입니다. 선택적 contextInheritor 인수가 제공되면 모듈 및 기호가 전달된 개체와 동일한 컨텍스트(주소 공간, 디버그 대상) 내에서 조회됩니다. 인수가 제공되지 않으면 모듈 및 기호가 디버거의 현재 컨텍스트에서 조회됩니다. 일회성 스크립트가 아닌 JavaScript 확장은 항상 명시적 컨텍스트를 제공해야 합니다.
getNamedModel

getNamedModel(modelName)

2 지정된 이름에 대해 등록된 데이터 모델을 반환합니다. 아직 등록되지 않은 이름에 대해 이를 호출하는 것은 완벽하게 합법적입니다. 이렇게 하면 해당 이름에 대한 스텁이 만들어지고 등록 시 스텁의 조작이 실제 개체에 만들어집니다.
indexedValue

new indexedValue(value, indicies)

2 반복된 값에 기본 인덱스 집합을 할당하기 위해 JavaScript 반복기에서 반환할 수 있는 개체의 생성자입니다. 인덱스 집합은 JavaScript 배열로 표현되어야 합니다.
Int64

new Int64(value, [highValue])

1 그러면 Int64 형식 라이브러리가 생성됩니다. 단일 인수 버전은 변환 없이 Int64로 압축할 수 있는 모든 값을 가져와 이러한 값에 배치합니다. 선택적 두 번째 인수가 제공되면 첫 번째 인수의 변환이 하위 32비트로 압축되고 두 번째 인수의 변환이 상위 32비트로 압축됩니다.
namedModelParent

new namedModelParent(object, name)

1 initializeScript에서 반환된 배열에 배치할 개체의 생성자이며, 이는 지정된 이름의 데이터 모델의 데이터 모델 부모 확장으로 JavaScript 프로토타입 또는 ES6 클래스를 사용하는 것을 나타냅니다.
namedModelRegistration

new namedModelRegistration(object, name)

1 initializeScript에서 반환된 배열에 배치할 개체의 생성자이며, 이는 다른 확장이 찾아서 확장할 수 있도록 알려진 이름을 통해 JavaScript 프로토타입 또는 ES6 클래스를 데이터 모델로 등록했음을 나타냅니다.
namespace

속성

2 디버거의 루트 네임스페이스에 직접 액세스할 수 있도록 합니다. 예를 들어 host.namespace.Debugger.Sessions.First()를 통해 첫 번째 디버그 대상의 프로세스 목록에 액세스할 수 있습니다. 이 속성을 사용하는 프로세스
registerNamedModel

registerNamedModel(object, modelName)

2 이렇게 하면 JavaScript 프로토타입 또는 ES6 클래스가 지정된 이름 아래에 데이터 모델로 등록됩니다. 이러한 등록을 통해 프로토타입 또는 클래스를 다른 스크립트 또는 다른 디버거 확장에 의해 배치 및 확장할 수 있습니다. 스크립트는 이 작업을 명령적으로 수행하는 대신 initializeScript 메서드에서 namedModelRegistration 개체를 반환하는 것을 선호해야 합니다. 변경 내용을 명령적으로 만드는 모든 스크립트는 클린 위해 initializeScript 메서드가 있어야 합니다.
registerExtensionForTypeSignature

registerExtensionForTypeSignature(object, typeSignature)

2 이렇게 하면 제공된 형식 서명에 지정된 대로 JavaScript 프로토타입 또는 ES6 클래스를 네이티브 형식의 확장 데이터 모델로 등록합니다. 스크립트는 이 작업을 명령적으로 수행하는 대신 initializeScript 메서드에서 typeSignatureExtension 개체를 반환하는 것을 선호해야 합니다. 변경 내용을 명령적으로 만드는 모든 스크립트는 클린 위해 initializeScript 메서드가 있어야 합니다.
registerPrototypeForTypeSignature

registerPrototypeForTypeSignature(object, typeSignature)

2 이렇게 하면 제공된 형식 서명에서 지정한 대로 네이티브 형식에 대한 JavaScript 프로토타입 또는 ES6 클래스를 정식 데이터 모델(예: 시각화 도우미)으로 등록합니다. 스크립트는 이 작업을 명령적으로 수행하는 대신 initializeScript 메서드에서 typeSignatureRegistration 개체를 반환하는 것을 선호해야 합니다. 변경 내용을 명령적으로 만드는 모든 스크립트는 클린 위해 uninitializeScript메서드가 있어야 합니다.
parseInt64

parseInt64(string, [radix])

1 이 메서드는 대신 Int64 형식 라이브러리를 반환한다는 점을 제외하고 표준 JavaScript parseInt 메서드와 유사하게 작동합니다. radix가 제공되면 구문 분석이 표시된 대로 base 2, 8, 10 또는 16에서 발생합니다.
typeSignatureExtension

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

1 initializeScript에서 반환된 배열에 배치할 개체의 생성자이며 JavaScript 프로토타입 또는 ES6 클래스의 형식 서명을 통해 설명된 네이티브 형식의 확장을 나타냅니다. 이러한 등록은 서명을 완전히 인수하는 대신 서명과 일치하는 모든 형식의 디버거 시각화에 "필드를 추가"합니다. 선택적 모듈 이름 및 버전은 등록을 제한할 수 있습니다. 버전은 "1.2.3.4" 스타일 문자열로 지정됩니다.
typeSignatureRegistration

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

1 initializeScript에서 반환된 배열에 배치할 개체의 생성자이며, 이는 네이티브 형식 서명에 대한 JavaScript 프로토타입 또는 ES6 클래스의 정식 등록을 나타냅니다. 이러한 등록은 단순히 서명을 확장하는 것이 아니라 서명과 일치하는 모든 형식의 디버거 시각화를 "인계"합니다. 선택적 모듈 이름 및 버전은 등록을 제한할 수 있습니다. 버전은 "1.2.3.4" 스타일 문자열로 지정됩니다.
unregisterNamedModel

unregisterNamedModel(modelName)

2 이렇게 하면 registerNamedModel에서 수행한 작업을 실행 취소하는 지정된 이름으로 조회에서 데이터 모델을 등록 취소합니다.
unregisterExtensionForTypeSignature

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

2 이렇게 하면 JavaScript 프로토타입 또는 ES6 클래스가 제공된 형식 서명에 지정된 네이티브 형식의 확장 데이터 모델에서 등록 취소됩니다. registerExtensionForTypeSignature의 논리적 실행 취소입니다. 스크립트는 이 작업을 명령적으로 수행하는 대신 initializeScript 메서드에서 typeSignatureExtension 개체를 반환하는 것을 선호해야 합니다. 변경 내용을 명령적으로 만드는 모든 스크립트는 클린 위해 initializeScript 메서드가 있어야 합니다. 선택적 모듈 이름 및 버전은 등록을 제한할 수 있습니다. 버전은 "1.2.3.4" 스타일 문자열로 지정됩니다.
unregisterPrototypeForTypeSignature

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

2 이렇게 하면 제공된 형식 서명에 지정된 네이티브 형식에 대한 정식 데이터 모델(예: 시각화 도우미)에서 JavaScript 프로토타입 또는 ES6 클래스의 등록을 취소합니다. registerPrototypeForTypeSignature의 논리적 실행 취소입니다. 스크립트는 이 작업을 명령적으로 수행하는 대신 initializeScript 메서드에서 typeSignatureRegistration 개체를 반환하는 것을 선호해야 합니다. 변경 내용을 명령적으로 만드는 모든 스크립트는 클린 위해 uninitializeScript 메서드가 있어야 합니다. 선택적 모듈 이름 및 버전은 등록을 제한할 수 있습니다. 버전은 "1.2.3.4" 스타일 문자열로 지정됩니다.

진단 기능

호스트 개체의 진단 하위 네임스페이스에는 다음이 포함됩니다.

이름 서명 단계 존재 Description
debugLog debugLog(object...) 1 이렇게 하면 스크립트 확장에 대한 printf 스타일 디버깅이 제공됩니다. 현재 debugLog의 출력은 디버거의 출력 콘솔로 라우팅됩니다. 나중에 이 출력을 라우팅하는 데 유연성을 제공할 계획이 있습니다. 참고: 콘솔에 사용자 출력을 인쇄하는 수단으로 사용하면 안 됩니다. 나중에 라우팅되지 않을 수 있습니다.

메모리 기능

호스트 개체의 메모리 하위 네임스페이스에는 다음이 포함됩니다.

이름 서명 위상 존재 Description
readMemoryValues

readMemoryValues(location, numElements, [elementSize], [isSigned], [contextInheritor])

2 그러면 디버그 대상의 주소 공간에서 값의 원시 배열을 읽고 이 메모리 보기 위에 형식화된 배열을 배치합니다. 제공된 위치는 주소(64비트 값), 위치 개체 또는 네이티브 포인터일 수 있습니다. 배열의 크기는 numElements 인수로 표시됩니다. 배열의 각 요소의 크기(및 형식)는 선택적 elementSizeisSigned 인수에 의해 지정됩니다. 이러한 인수가 제공되지 않으면 기본값은 바이트(부호 없는/1 바이트)입니다. 선택적 contextInheritor 인수가 제공되면 인수로 표시된 컨텍스트(예: 주소 공간 및 디버그 대상)에서 메모리가 읽혀집니다. 그렇지 않으면 디버거의 현재 컨텍스트에서 읽습니다. 8, 16 및 32비트 값에서 이 메서드를 사용하면 빠른 형식의 보기가 읽기 메모리 위에 배치됩니다. 64비트 값에 이 메서드를 사용하면 64비트 라이브러리 형식의 배열이 생성되므로 훨씬 더 비용이 많이 듭니다.
readString

readString(location, [contextInheritor])

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

2 그러면 디버그 대상의 주소 공간에서 좁은(현재 코드 페이지) 문자열을 읽고 UTF-16으로 변환한 다음 결과를 JavaScript 문자열로 반환합니다. 메모리를 읽을 수 없는 경우 예외가 발생할 수 있습니다. 제공된 위치는 주소(64비트 값), 위치 개체 또는 네이티브 char일 수 있습니다. 선택적 contextInheritor 인수가 제공되면 인수로 표시된 컨텍스트(예: 주소 공간 및 디버그 대상)에서 메모리가 읽혀집니다. 그렇지 않으면 디버거의 현재 컨텍스트에서 읽습니다. 선택적 길이 인수가 제공되면 읽기 문자열은 지정된 길이가 됩니다.
readWideString

readWideString(location, [contextInheritor])

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

2 디버그 대상의 주소 공간에서 wide(UTF-16) 문자열을 읽고 결과를 JavaScript 문자열로 반환합니다. 메모리를 읽을 수 없는 경우 예외가 발생할 수 있습니다. 제공된 위치는 주소(64비트 값), 위치 개체 또는 네이티브 wchar_t 수 있습니다. 선택적 contextInheritor 인수가 제공되면 인수로 표시된 컨텍스트(예: 주소 공간 및 디버그 대상)에서 메모리가 읽혀집니다. 그렇지 않으면 디버거의 현재 컨텍스트에서 읽습니다. 선택적 길이 인수가 제공되면 읽기 문자열은 지정된 길이가 됩니다.

JavaScript의 데이터 모델 개념

데이터 모델 매핑

다음 데이터 모델 개념은 JavaScript에 매핑됩니다.

개념 네이티브 인터페이스 JavaScript 등가
문자열 변환 IStringDisplayableConcept standard: toString(...) {...}
반복성 IIterableConcept standard: [Symbol.iterator](){...}
인덱싱 가능성 IIndexableConcept protocol: getDimensionality(...) / getValueAt(...) / setValueAt(...)
런타임 형식 변환 IPreferredRuntimeTypeConcept protocol: getPreferredRuntimeTypedObject(...)

문자열 변환

문자열 변환 개념(IStringDisplayableConcept)은 표준 JavaScript toString 메서드로 직접 변환됩니다. 모든 JavaScript 개체에 문자열 변환이 있으므로(다른 곳에서 제공되지 않은 경우 Object.prototype에서 제공됨) 데이터 모델에 반환된 모든 JavaScript 개체를 표시 문자열로 변환할 수 있습니다. 문자열 변환을 재정의하려면 고유한 toString을 구현하기만 하면 됩니다.

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

반복성

개체가 반복 가능한지 여부에 대한 데이터 모델의 개념은 개체가 반복 가능한지 여부에 대한 ES6 프로토콜에 직접 매핑됩니다. [Symbol.iterator] 메서드가 있는 모든 개체는 반복 가능한 것으로 간주됩니다. 이러한 구현은 개체를 반복 가능하게 만듭니다.

반복 가능한 개체에는 다음과 같은 구현이 있을 수 있습니다.

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

반복기에서 반환된 개체에는 인덱스 및 특수 반환 형식을 통한 값이 포함되어야 하며 반복 가능하고 인덱싱이 가능한 개체에 대해 특별히 고려해야 합니다.

반복 가능 및 인덱싱 가능

반복 가능하고 인덱싱할 수 있는 개체에는 반복기의 특수 반환 값이 필요합니다. 반복기는 값을 생성하는 대신 indexedValue 인스턴스를 생성합니다. 인덱스가 indexedValue 생성자에 두 번째 인수의 배열로 전달됩니다. 다차원일 수 있지만 인덱서 프로토콜에서 반환된 차원과 일치해야 합니다.

이 코드는 구현 예제를 보여줍니다.

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

인덱싱 가능성

JavaScript와 달리 데이터 모델은 속성 액세스와 인덱싱을 매우 명시적으로 구분합니다. 데이터 모델에서 인덱싱 가능으로 표시하려는 JavaScript 개체는 인덱서의 차원성을 반환하는 getDimensionality 메서드와 제공된 인덱스에서 개체의 읽기 및 쓰기를 수행하는 getValueAt 및 setValueAt 메서드의 선택적 쌍으로 구성된 프로토콜을 구현해야 합니다. 개체가 읽기 전용이거나 쓰기 전용인 경우 getValueAt 또는 setValueAt 메서드를 생략할 수 있습니다.

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

런타임 형식 변환

이는 형식 시스템(네이티브) 형식에 대해 등록된 JavaScript 프로토타입/클래스와만 관련이 있습니다. 디버거는 코드에 표현된 정적 형식에서 개체의 실제 런타임 형식을 확인하기 위해 분석(예: RTTI(Run-Time 형식 정보) /v 테이블 분석)을 수행할 수 있는 경우가 많습니다. 네이티브 형식에 대해 등록된 데이터 모델은 IPreferredRuntimeTypeConcept의 구현을 통해 이 동작을 재정의할 수 있습니다. 마찬가지로 네이티브 개체에 대해 등록된 JavaScript 클래스 또는 프로토타입은 getPreferredRuntimeTypedObject 메서드로 구성된 프로토콜 구현을 통해 자체 구현을 제공할 수 있습니다.

이 메서드는 기술적으로 무엇이든 반환할 수 있지만 실제로 런타임 형식 또는 파생 형식이 아닌 항목을 반환하는 것은 잘못된 형식으로 간주됩니다. 이로 인해 디버거 사용자에게 상당한 혼란이 발생할 수 있습니다. 그러나 이 메서드를 재정의하는 것은 구현의 C 스타일 헤더+개체 스타일 등과 같은 항목에 유용할 수 있습니다.

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

참고 항목

JavaScript 확장의 네이티브 디버거 개체

JavaScript 확장의 네이티브 디버거 개체 - 디자인 및 테스트 고려 사항

JavaScript 디버거 스크립팅

JavaScript 디버거 예제 스크립트