Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DI] Add ability to take state snapshot #4549

Merged
merged 1 commit into from
Oct 4, 2024
Merged

Conversation

watson
Copy link
Collaborator

@watson watson commented Jul 23, 2024

Take a "snapshot" of the variables that are in scope when a probe is hit (except the global scope, which intentionally have been omitted since it's too noisy):

  • For each variable in scope, we traverse objects and their properties up to maxReferenceDepth deep (default i 3 levels).
  • Strings are truncated to maxLength (default is 255 characters).
  • Binary data is converted to strings with appropriate escaping of non printable characters (the maxLength limit is also applied)

Out of scope:

  • Information about this is not captured.
  • maxCollectionSize limit
  • maxFieldCount limit
  • Special handling for snapshots larger than 1MB (e.g. snapshot pruning or something simpler)
  • PII redaction

Note to reviewers

The algorithm to collect the snapshot is located in:

packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js

The post-processing of the collected state to get it into the format expected by the DI endpoint is located in:

packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js

To make it easier to understand what data is being operated on in processor.js when reviewing, here's some example data from two of the unit tests in packages/dd-trace/test/debugger/devtools_client/snapshot.spec.js:

Output of `collector.js` for primitive types (from the unit test "should return expected object for primitives")
[
  {
    name: 'undef',
    value: { type: 'undefined' },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'nil',
    value: { type: 'object', subtype: 'null', value: null },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'bool',
    value: { type: 'boolean', value: true },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'num',
    value: { type: 'number', value: 42, description: '42' },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'bigint',
    value: {
      type: 'bigint',
      unserializableValue: '18014398509481982n',
      description: '18014398509481982n'
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'str',
    value: { type: 'string', value: 'foo' },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'sym',
    value: {
      type: 'symbol',
      description: 'Symbol(foo)',
      objectId: '4293226926560230981.1.9'
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'a1',
    value: { type: 'number', value: 1, description: '1' },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'a2',
    value: { type: 'number', value: 2, description: '2' },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'ref',
    value: {
      type: 'object',
      className: 'Object',
      description: 'Object',
      objectId: '4293226926560230981.1.10',
      properties: [
        {
          name: 'wmo1',
          value: {
            type: 'object',
            className: 'Object',
            description: 'Object',
            objectId: '4293226926560230981.1.12',
            properties: [
              {
                name: 'a',
                value: { type: 'number', value: 1, description: '1' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'wmo2',
          value: {
            type: 'object',
            className: 'Object',
            description: 'Object',
            objectId: '4293226926560230981.1.13',
            properties: [
              {
                name: 'b',
                value: { type: 'number', value: 3, description: '3' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'wso1',
          value: {
            type: 'object',
            className: 'Object',
            description: 'Object',
            objectId: '4293226926560230981.1.14',
            properties: [
              {
                name: 'a',
                value: { type: 'number', value: 1, description: '1' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'wso2',
          value: {
            type: 'object',
            className: 'Object',
            description: 'Object',
            objectId: '4293226926560230981.1.15',
            properties: [
              {
                name: 'a',
                value: { type: 'number', value: 2, description: '2' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'wso3',
          value: {
            type: 'object',
            className: 'Object',
            description: 'Object',
            objectId: '4293226926560230981.1.16',
            properties: [
              {
                name: 'a',
                value: { type: 'number', value: 3, description: '3' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'get',
    value: {
      type: 'function',
      className: 'Function',
      description: 'function get () {\n' +
        '  const bigint = BigInt(Number.MAX_SAFE_INTEGER) * 2n\n' +
        '\n' +
        '  let e, g\n' +
        '  const oblit = {\n' +
        '    a: 1,\n' +
        '    b: 2,\n' +
        '    c: 3,\n' +
        '    // Has no side-effect\n' +
        '    // TODO: At some point it would be great to detect this and get the value,\n' +
        '    // though currently we can neither detect it, nor execute the getter.\n' +
        '    get d () {\n' +
        '      return 4\n' +
        '    },\n' +
        '    // Has side-effect: We should never try to fetch this!\n' +
        '    get e () {\n' +
        '      e = Math.random()\n' +
        '      return e\n' +
        '    },\n' +
        '    // Only setter\n' +
        '    set f (v) {}, // eslint-disable-line accessor-pairs\n' +
        '    // Both getter and setter\n' +
        '    get g () { return g },\n' +
        '    set g (x) { g = x }\n' +
        '  }\n' +
        '\n' +
        '  function fnWithProperties (a, b) {}\n' +
        '  fnWithProperties.foo = { bar: 42 }\n' +
        '\n' +
        '  class MyClass {\n' +
        '    #secret = 42\n' +
        '    constructor () {\n' +
        '      this.foo = this.#secret\n' +
        '    }\n' +
        '  }\n' +
        '\n' +
        '  // const myIterator = {\n' +
        '  //   next () { return { value: 42, done: true } },\n' +
        '  //   * [Symbol.iterator] () {\n' +
        '  //     yield 1\n' +
        '  //   }\n' +
        '  // }\n' +
        '\n' +
        '  function * makeIterator () {\n' +
        '    yield 1\n' +
        '    yield 2\n' +
        '  }\n' +
        '  const gen = makeIterator()\n' +
        '  gen.foo = 42\n' +
        '\n' +
        '  class CustomError extends Error {\n' +
        '    constructor (...args) {\n' +
        '      super(...args)\n' +
        '      this.foo = 42\n' +
        '    }\n' +
        '  }\n' +
        "  const err = new CustomError('boom!')\n" +
        '\n' +
        "  const buf1 = Buffer.from('IBM')\n" +
        "  const buf2 = Buffer.from('hello\\x01\\x02\\x03world')\n" +
        '\n' +
        '  const arrayBuffer = new ArrayBuffer(buf1.length)\n' +
        '  const sharedArrayBuffer = new SharedArrayBuffer(buf2.length)\n' +
        '\n' +
        '  const typedArray = new Int8Array(arrayBuffer)\n' +
        '  for (let i = 0; i < buf1.length; i++) typedArray[i] = buf1[i] - 1\n' +
        '\n' +
        '  const sharedTypedArray = new Int8Array(sharedArrayBuffer)\n' +
        '  for (let i = 0; i < buf2.length; i++) sharedTypedArray[i] = buf2[i]\n' +
        '\n' +
        '  // const dataView = new DataView(new ArrayBuffer(3))\n' +
        '  // dataView.setUint8(0, 42)\n' +
        '\n' +
        '  const result = {\n' +
        '    primitives: {\n' +
        '      undef: undefined,\n' +
        '      nil: null,\n' +
        '      bool: true,\n' +
        '      num: 42,\n' +
        '      bigint,\n' +
        "      str: 'foo',\n" +
        "      sym: Symbol('foo')\n" +
        '    },\n' +
        '    complexTypes: {\n' +
        '      oblit,\n' +
        '      obnew: new MyClass(),\n' +
        '      arr: [1, 2, 3],\n' +
        '      regex: /foo/,\n' +
        "      date: new Date('2024-09-20T07:22:59.998Z'),\n" +
        '      map: new Map([[1, 2], [3, 4]]),\n' +
        '      set: new Set([[1, 2], 3, 4]),\n' +
        '      wmap: new WeakMap([[ref.wmo1, 2], [ref.wmo2, 4]]),\n' +
        '      wset: new WeakSet([ref.wso1, ref.wso2, ref.wso3]),\n' +
        '      // itr: myIterator,\n' +
        '      gen,\n' +
        '      err,\n' +
        '      fn: fnWithProperties,\n' +
        '      afn: () => { return 42 },\n' +
        '      cls: MyClass,\n' +
        '      acls: class\n' +
        '            {}, // eslint-disable-line indent, brace-style\n' +
        '      prox: new Proxy({ target: true }, { get () { return false } }),\n' +
        '      custProx: new Proxy(new MyClass(), { get () { return false } }),\n' +
        '      pPen: new Promise(() => {}),\n' +
        "      pRes: Promise.resolve('resolved value'),\n" +
        "      pRej: Promise.reject('rejected value'), // eslint-disable-line prefer-promise-reject-errors\n" +
        "      tarr: typedArray, // TODO: Should we test other TypedArray's?\n" +
        '      ab: arrayBuffer,\n' +
        '      sab: sharedArrayBuffer\n' +
        '      // dv: dataView\n' +
        '      // wam: new WebAssembly.Memory({\n' +
        '      //   initial: 10,\n' +
        '      //   maximum: 100\n' +
        '      // }),\n' +
        "      // wav: new WebAssembly.Table({ initial: 2, element: 'anyfunc' }).get(0)\n" +
        '    },\n' +
        '    nested: {\n' +
        '      myNestedObj: {\n' +
        '        deepObj: { foo: { foo: { foo: { foo: { foo: true } } } } },\n' +
        '        deepArr: [[[[[42]]]]]\n' +
        '      }\n' +
        '    }\n' +
        '  }\n' +
        '\n' +
        '  result.complexTypes.circular = result.complexTypes\n' +
        '\n' +
        "  Object.defineProperty(result.complexTypes, 'hidden', {\n" +
        "    value: 'secret',\n" +
        '    enumerable: false\n' +
        '  })\n' +
        '\n' +
        "  // ensure we don't get an unhandled promise rejection error\n" +
        '  result.complexTypes.pRej.catch(() => {})\n' +
        '\n' +
        '  return result\n' +
        '}',
      objectId: '4293226926560230981.1.11',
      properties: [
        {
          name: 'length',
          value: { type: 'number', value: 0, description: '0' },
          writable: false,
          configurable: true,
          enumerable: false,
          isOwn: true
        },
        {
          name: 'name',
          value: { type: 'string', value: 'get' },
          writable: false,
          configurable: true,
          enumerable: false,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  }
]
Output of `collector.js` for complex types (from the unit test "should contain expected properties from local and closure scope")
[
  {
    name: 'oblit',
    value: {
      type: 'object',
      className: 'Object',
      description: 'Object',
      objectId: '-5688388600467275026.1.9',
      properties: [
        {
          name: 'a',
          value: { type: 'number', value: 1, description: '1' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'b',
          value: { type: 'number', value: 2, description: '2' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'c',
          value: { type: 'number', value: 3, description: '3' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'd',
          get: {
            type: 'function',
            className: 'Function',
            description: 'get d () {\n      return 4\n    }',
            objectId: '-5688388600467275026.1.33'
          },
          set: { type: 'undefined' },
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'e',
          get: {
            type: 'function',
            className: 'Function',
            description: 'get e () {\n      e = Math.random()\n      return e\n    }',
            objectId: '-5688388600467275026.1.34'
          },
          set: { type: 'undefined' },
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'f',
          get: { type: 'undefined' },
          set: {
            type: 'function',
            className: 'Function',
            description: 'set f (v) {}',
            objectId: '-5688388600467275026.1.35'
          },
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'g',
          get: {
            type: 'function',
            className: 'Function',
            description: 'get g () { return g }',
            objectId: '-5688388600467275026.1.36'
          },
          set: {
            type: 'function',
            className: 'Function',
            description: 'set g (x) { g = x }',
            objectId: '-5688388600467275026.1.37'
          },
          configurable: true,
          enumerable: true,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'obnew',
    value: {
      type: 'object',
      className: 'MyClass',
      description: 'MyClass',
      objectId: '-5688388600467275026.1.10',
      properties: [
        {
          name: 'foo',
          value: { type: 'number', value: 42, description: '42' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '#secret',
          value: { type: 'number', value: 42, description: '42' }
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'arr',
    value: {
      type: 'object',
      subtype: 'array',
      className: 'Array',
      description: 'Array(3)',
      objectId: '-5688388600467275026.1.11',
      properties: [
        {
          name: '0',
          value: { type: 'number', value: 1, description: '1' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '1',
          value: { type: 'number', value: 2, description: '2' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '2',
          value: { type: 'number', value: 3, description: '3' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'length',
          value: { type: 'number', value: 3, description: '3' },
          writable: true,
          configurable: false,
          enumerable: false,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'regex',
    value: {
      type: 'object',
      subtype: 'regexp',
      className: 'RegExp',
      description: '/foo/',
      objectId: '-5688388600467275026.1.12'
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'date',
    value: {
      type: 'object',
      subtype: 'date',
      className: 'Date',
      description: 'Fri Sep 20 2024 09:22:59 GMT+0200 (Central European Summer Time)',
      objectId: '-5688388600467275026.1.13'
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'map',
    value: {
      type: 'object',
      subtype: 'map',
      className: 'Map',
      description: 'Map(2)',
      objectId: '-5688388600467275026.1.14',
      properties: [
        {
          name: '0',
          value: {
            type: 'object',
            subtype: 'internal#entry',
            className: 'Object',
            description: '{1 => 2}',
            objectId: '-5688388600467275026.1.43',
            properties: [
              {
                name: 'key',
                value: { type: 'number', value: 1, description: '1' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'value',
                value: { type: 'number', value: 2, description: '2' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '1',
          value: {
            type: 'object',
            subtype: 'internal#entry',
            className: 'Object',
            description: '{3 => 4}',
            objectId: '-5688388600467275026.1.44',
            properties: [
              {
                name: 'key',
                value: { type: 'number', value: 3, description: '3' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'value',
                value: { type: 'number', value: 4, description: '4' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'length',
          value: { type: 'number', value: 2, description: '2' },
          writable: true,
          configurable: false,
          enumerable: false,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'set',
    value: {
      type: 'object',
      subtype: 'set',
      className: 'Set',
      description: 'Set(3)',
      objectId: '-5688388600467275026.1.15',
      properties: [
        {
          name: '0',
          value: {
            type: 'object',
            subtype: 'internal#entry',
            className: 'Object',
            description: 'Array(2)',
            objectId: '-5688388600467275026.1.47',
            properties: [
              {
                name: 'value',
                value: {
                  type: 'object',
                  subtype: 'array',
                  className: 'Array',
                  description: 'Array(2)',
                  objectId: '-5688388600467275026.1.50',
                  properties: [
                    {
                      name: '0',
                      value: { type: 'number', value: 1, description: '1' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '1',
                      value: { type: 'number', value: 2, description: '2' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'length',
                      value: { type: 'number', value: 2, description: '2' },
                      writable: true,
                      configurable: false,
                      enumerable: false,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '1',
          value: {
            type: 'object',
            subtype: 'internal#entry',
            className: 'Object',
            description: '3',
            objectId: '-5688388600467275026.1.48',
            properties: [
              {
                name: 'value',
                value: { type: 'number', value: 3, description: '3' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '2',
          value: {
            type: 'object',
            subtype: 'internal#entry',
            className: 'Object',
            description: '4',
            objectId: '-5688388600467275026.1.49',
            properties: [
              {
                name: 'value',
                value: { type: 'number', value: 4, description: '4' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'length',
          value: { type: 'number', value: 3, description: '3' },
          writable: true,
          configurable: false,
          enumerable: false,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'wmap',
    value: {
      type: 'object',
      subtype: 'weakmap',
      className: 'WeakMap',
      description: 'WeakMap',
      objectId: '-5688388600467275026.1.16',
      properties: [
        {
          name: '0',
          value: {
            type: 'object',
            subtype: 'internal#entry',
            className: 'Object',
            description: '{Object => 4}',
            objectId: '-5688388600467275026.1.54',
            properties: [
              {
                name: 'key',
                value: {
                  type: 'object',
                  className: 'Object',
                  description: 'Object',
                  objectId: '-5688388600467275026.1.56',
                  properties: [
                    {
                      name: 'b',
                      value: { type: 'number', value: 3, description: '3' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'value',
                value: { type: 'number', value: 4, description: '4' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '1',
          value: {
            type: 'object',
            subtype: 'internal#entry',
            className: 'Object',
            description: '{Object => 2}',
            objectId: '-5688388600467275026.1.55',
            properties: [
              {
                name: 'key',
                value: {
                  type: 'object',
                  className: 'Object',
                  description: 'Object',
                  objectId: '-5688388600467275026.1.58',
                  properties: [
                    {
                      name: 'a',
                      value: { type: 'number', value: 1, description: '1' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'value',
                value: { type: 'number', value: 2, description: '2' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'length',
          value: { type: 'number', value: 2, description: '2' },
          writable: true,
          configurable: false,
          enumerable: false,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'wset',
    value: {
      type: 'object',
      subtype: 'weakset',
      className: 'WeakSet',
      description: 'WeakSet',
      objectId: '-5688388600467275026.1.17',
      properties: [
        {
          name: '0',
          value: {
            type: 'object',
            subtype: 'internal#entry',
            className: 'Object',
            description: 'Object',
            objectId: '-5688388600467275026.1.62',
            properties: [
              {
                name: 'value',
                value: {
                  type: 'object',
                  className: 'Object',
                  description: 'Object',
                  objectId: '-5688388600467275026.1.65',
                  properties: [
                    {
                      name: 'a',
                      value: { type: 'number', value: 1, description: '1' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '1',
          value: {
            type: 'object',
            subtype: 'internal#entry',
            className: 'Object',
            description: 'Object',
            objectId: '-5688388600467275026.1.63',
            properties: [
              {
                name: 'value',
                value: {
                  type: 'object',
                  className: 'Object',
                  description: 'Object',
                  objectId: '-5688388600467275026.1.67',
                  properties: [
                    {
                      name: 'a',
                      value: { type: 'number', value: 3, description: '3' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '2',
          value: {
            type: 'object',
            subtype: 'internal#entry',
            className: 'Object',
            description: 'Object',
            objectId: '-5688388600467275026.1.64',
            properties: [
              {
                name: 'value',
                value: {
                  type: 'object',
                  className: 'Object',
                  description: 'Object',
                  objectId: '-5688388600467275026.1.69',
                  properties: [
                    {
                      name: 'a',
                      value: { type: 'number', value: 2, description: '2' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'length',
          value: { type: 'number', value: 3, description: '3' },
          writable: true,
          configurable: false,
          enumerable: false,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'gen',
    value: {
      type: 'object',
      subtype: 'generator',
      className: 'makeIterator',
      description: 'makeIterator',
      objectId: '-5688388600467275026.1.18',
      properties: [
        {
          name: 'foo',
          value: { type: 'number', value: 42, description: '42' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'err',
    value: {
      type: 'object',
      subtype: 'error',
      className: 'CustomError',
      description: 'Error: boom!\n' +
        '    at get (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/_inspected_file.js:89:15)\n' +
        '    at getComplextTypes (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/_inspected_file.js:11:165)\n' +
        '    at Test.<anonymous> (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/snapshot.spec.js:355:7)',
      objectId: '-5688388600467275026.1.19',
      properties: [
        {
          name: 'foo',
          value: { type: 'number', value: 42, description: '42' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'stack',
          value: {
            type: 'string',
            value: 'Error: boom!\n' +
              '    at get (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/_inspected_file.js:89:15)\n' +
              '    at getComplextTypes (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/_inspected_file.js:11:165)\n' +
              '    at Test.<anonymous> (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/snapshot.spec.js:355:7)'
          },
          writable: false,
          configurable: true,
          enumerable: false,
          isOwn: true
        },
        {
          name: 'message',
          value: { type: 'string', value: 'boom!' },
          writable: true,
          configurable: true,
          enumerable: false,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'fn',
    value: {
      type: 'function',
      className: 'Function',
      description: 'function fnWithProperties (a, b) {}',
      objectId: '-5688388600467275026.1.20',
      properties: [
        {
          name: 'foo',
          value: {
            type: 'object',
            className: 'Object',
            description: 'Object',
            objectId: '-5688388600467275026.1.75',
            properties: [
              {
                name: 'bar',
                value: { type: 'number', value: 42, description: '42' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'length',
          value: { type: 'number', value: 2, description: '2' },
          writable: false,
          configurable: true,
          enumerable: false,
          isOwn: true
        },
        {
          name: 'name',
          value: { type: 'string', value: 'fnWithProperties' },
          writable: false,
          configurable: true,
          enumerable: false,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'afn',
    value: {
      type: 'function',
      className: 'Function',
      description: '() => { return 42 }',
      objectId: '-5688388600467275026.1.21',
      properties: [
        {
          name: 'length',
          value: { type: 'number', value: 0, description: '0' },
          writable: false,
          configurable: true,
          enumerable: false,
          isOwn: true
        },
        {
          name: 'name',
          value: { type: 'string', value: 'afn' },
          writable: false,
          configurable: true,
          enumerable: false,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'cls',
    value: {
      type: 'function',
      className: 'Function',
      description: 'class MyClass {\n' +
        '    #secret = 42\n' +
        '    constructor () {\n' +
        '      this.foo = this.#secret\n' +
        '    }\n' +
        '  }',
      objectId: '-5688388600467275026.1.22',
      properties: [
        {
          name: 'length',
          value: { type: 'number', value: 0, description: '0' },
          writable: false,
          configurable: true,
          enumerable: false,
          isOwn: true
        },
        {
          name: 'name',
          value: { type: 'string', value: 'MyClass' },
          writable: false,
          configurable: true,
          enumerable: false,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'acls',
    value: {
      type: 'function',
      className: 'Function',
      description: 'class\n            {}',
      objectId: '-5688388600467275026.1.23',
      properties: [
        {
          name: 'length',
          value: { type: 'number', value: 0, description: '0' },
          writable: false,
          configurable: true,
          enumerable: false,
          isOwn: true
        },
        {
          name: 'name',
          value: { type: 'string', value: 'acls' },
          writable: false,
          configurable: true,
          enumerable: false,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'prox',
    value: {
      type: 'object',
      subtype: 'proxy',
      className: 'Object',
      description: 'Proxy(Object)',
      objectId: '-5688388600467275026.1.24',
      properties: [
        {
          name: 'target',
          value: { type: 'boolean', value: true },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'custProx',
    value: {
      type: 'object',
      subtype: 'proxy',
      className: 'Object',
      description: 'Proxy(MyClass)',
      objectId: '-5688388600467275026.1.25',
      properties: [
        {
          name: 'foo',
          value: { type: 'number', value: 42, description: '42' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'pPen',
    value: {
      type: 'object',
      subtype: 'promise',
      className: 'Promise',
      description: 'Promise',
      objectId: '-5688388600467275026.1.26',
      properties: [
        {
          name: '[[PromiseState]]',
          value: { type: 'string', value: 'pending' }
        },
        { name: '[[PromiseResult]]', value: { type: 'undefined' } }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'pRes',
    value: {
      type: 'object',
      subtype: 'promise',
      className: 'Promise',
      description: 'Promise',
      objectId: '-5688388600467275026.1.27',
      properties: [
        {
          name: '[[PromiseState]]',
          value: { type: 'string', value: 'fulfilled' }
        },
        {
          name: '[[PromiseResult]]',
          value: { type: 'string', value: 'resolved value' }
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'pRej',
    value: {
      type: 'object',
      subtype: 'promise',
      className: 'Promise',
      description: 'Promise',
      objectId: '-5688388600467275026.1.28',
      properties: [
        {
          name: '[[PromiseState]]',
          value: { type: 'string', value: 'rejected' }
        },
        {
          name: '[[PromiseResult]]',
          value: { type: 'string', value: 'rejected value' }
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'tarr',
    value: {
      type: 'object',
      subtype: 'typedarray',
      className: 'Int8Array',
      description: 'Int8Array(3)',
      objectId: '-5688388600467275026.1.29',
      properties: [
        {
          name: '0',
          value: { type: 'number', value: 72, description: '72' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '1',
          value: { type: 'number', value: 65, description: '65' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '2',
          value: { type: 'number', value: 76, description: '76' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'ab',
    value: {
      type: 'object',
      subtype: 'arraybuffer',
      className: 'ArrayBuffer',
      description: 'ArrayBuffer(3)',
      objectId: '-5688388600467275026.1.30',
      properties: [
        {
          name: '0',
          value: { type: 'number', value: 72, description: '72' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '1',
          value: { type: 'number', value: 65, description: '65' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '2',
          value: { type: 'number', value: 76, description: '76' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'sab',
    value: {
      type: 'object',
      subtype: 'arraybuffer',
      className: 'SharedArrayBuffer',
      description: 'SharedArrayBuffer(13)',
      objectId: '-5688388600467275026.1.31',
      properties: [
        {
          name: '0',
          value: { type: 'number', value: 104, description: '104' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '1',
          value: { type: 'number', value: 101, description: '101' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '2',
          value: { type: 'number', value: 108, description: '108' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '3',
          value: { type: 'number', value: 108, description: '108' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '4',
          value: { type: 'number', value: 111, description: '111' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '5',
          value: { type: 'number', value: 1, description: '1' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '6',
          value: { type: 'number', value: 2, description: '2' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '7',
          value: { type: 'number', value: 3, description: '3' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '8',
          value: { type: 'number', value: 119, description: '119' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '9',
          value: { type: 'number', value: 111, description: '111' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '10',
          value: { type: 'number', value: 114, description: '114' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '11',
          value: { type: 'number', value: 108, description: '108' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: '12',
          value: { type: 'number', value: 100, description: '100' },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'circular',
    value: {
      type: 'object',
      className: 'Object',
      description: 'Object',
      objectId: '-5688388600467275026.1.32',
      properties: [
        {
          name: 'oblit',
          value: {
            type: 'object',
            className: 'Object',
            description: 'Object',
            objectId: '-5688388600467275026.1.112',
            properties: [
              {
                name: 'a',
                value: { type: 'number', value: 1, description: '1' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'b',
                value: { type: 'number', value: 2, description: '2' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'c',
                value: { type: 'number', value: 3, description: '3' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'd',
                get: {
                  type: 'function',
                  className: 'Function',
                  description: 'get d () {\n      return 4\n    }',
                  objectId: '-5688388600467275026.1.137'
                },
                set: { type: 'undefined' },
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'e',
                get: {
                  type: 'function',
                  className: 'Function',
                  description: 'get e () {\n      e = Math.random()\n      return e\n    }',
                  objectId: '-5688388600467275026.1.138'
                },
                set: { type: 'undefined' },
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'f',
                get: { type: 'undefined' },
                set: {
                  type: 'function',
                  className: 'Function',
                  description: 'set f (v) {}',
                  objectId: '-5688388600467275026.1.139'
                },
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'g',
                get: {
                  type: 'function',
                  className: 'Function',
                  description: 'get g () { return g }',
                  objectId: '-5688388600467275026.1.140'
                },
                set: {
                  type: 'function',
                  className: 'Function',
                  description: 'set g (x) { g = x }',
                  objectId: '-5688388600467275026.1.141'
                },
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'obnew',
          value: {
            type: 'object',
            className: 'MyClass',
            description: 'MyClass',
            objectId: '-5688388600467275026.1.113',
            properties: [
              {
                name: 'foo',
                value: { type: 'number', value: 42, description: '42' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '#secret',
                value: { type: 'number', value: 42, description: '42' }
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'arr',
          value: {
            type: 'object',
            subtype: 'array',
            className: 'Array',
            description: 'Array(3)',
            objectId: '-5688388600467275026.1.114',
            properties: [
              {
                name: '0',
                value: { type: 'number', value: 1, description: '1' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '1',
                value: { type: 'number', value: 2, description: '2' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '2',
                value: { type: 'number', value: 3, description: '3' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'length',
                value: { type: 'number', value: 3, description: '3' },
                writable: true,
                configurable: false,
                enumerable: false,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'regex',
          value: {
            type: 'object',
            subtype: 'regexp',
            className: 'RegExp',
            description: '/foo/',
            objectId: '-5688388600467275026.1.115'
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'date',
          value: {
            type: 'object',
            subtype: 'date',
            className: 'Date',
            description: 'Fri Sep 20 2024 09:22:59 GMT+0200 (Central European Summer Time)',
            objectId: '-5688388600467275026.1.116'
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'map',
          value: {
            type: 'object',
            subtype: 'map',
            className: 'Map',
            description: 'Map(2)',
            objectId: '-5688388600467275026.1.117',
            properties: [
              {
                name: '0',
                value: {
                  type: 'object',
                  subtype: 'internal#entry',
                  className: 'Object',
                  description: '{1 => 2}',
                  objectId: '-5688388600467275026.1.147',
                  properties: [
                    {
                      name: 'key',
                      value: { type: 'number', value: 1, description: '1' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'value',
                      value: { type: 'number', value: 2, description: '2' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '1',
                value: {
                  type: 'object',
                  subtype: 'internal#entry',
                  className: 'Object',
                  description: '{3 => 4}',
                  objectId: '-5688388600467275026.1.148',
                  properties: [
                    {
                      name: 'key',
                      value: { type: 'number', value: 3, description: '3' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'value',
                      value: { type: 'number', value: 4, description: '4' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'length',
                value: { type: 'number', value: 2, description: '2' },
                writable: true,
                configurable: false,
                enumerable: false,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'set',
          value: {
            type: 'object',
            subtype: 'set',
            className: 'Set',
            description: 'Set(3)',
            objectId: '-5688388600467275026.1.118',
            properties: [
              {
                name: '0',
                value: {
                  type: 'object',
                  subtype: 'internal#entry',
                  className: 'Object',
                  description: 'Array(2)',
                  objectId: '-5688388600467275026.1.151',
                  properties: [
                    {
                      name: 'value',
                      value: {
                        type: 'object',
                        subtype: 'array',
                        className: 'Array',
                        description: 'Array(2)',
                        objectId: '-5688388600467275026.1.154',
                        properties: [
                          {
                            name: '0',
                            value: {
                              type: 'number',
                              value: 1,
                              description: '1'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          },
                          {
                            name: '1',
                            value: {
                              type: 'number',
                              value: 2,
                              description: '2'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          },
                          {
                            name: 'length',
                            value: {
                              type: 'number',
                              value: 2,
                              description: '2'
                            },
                            writable: true,
                            configurable: false,
                            enumerable: false,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '1',
                value: {
                  type: 'object',
                  subtype: 'internal#entry',
                  className: 'Object',
                  description: '3',
                  objectId: '-5688388600467275026.1.152',
                  properties: [
                    {
                      name: 'value',
                      value: { type: 'number', value: 3, description: '3' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '2',
                value: {
                  type: 'object',
                  subtype: 'internal#entry',
                  className: 'Object',
                  description: '4',
                  objectId: '-5688388600467275026.1.153',
                  properties: [
                    {
                      name: 'value',
                      value: { type: 'number', value: 4, description: '4' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'length',
                value: { type: 'number', value: 3, description: '3' },
                writable: true,
                configurable: false,
                enumerable: false,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'wmap',
          value: {
            type: 'object',
            subtype: 'weakmap',
            className: 'WeakMap',
            description: 'WeakMap',
            objectId: '-5688388600467275026.1.119',
            properties: [
              {
                name: '0',
                value: {
                  type: 'object',
                  subtype: 'internal#entry',
                  className: 'Object',
                  description: '{Object => 4}',
                  objectId: '-5688388600467275026.1.158',
                  properties: [
                    {
                      name: 'key',
                      value: {
                        type: 'object',
                        className: 'Object',
                        description: 'Object',
                        objectId: '-5688388600467275026.1.160',
                        properties: [
                          {
                            name: 'b',
                            value: {
                              type: 'number',
                              value: 3,
                              description: '3'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'value',
                      value: { type: 'number', value: 4, description: '4' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '1',
                value: {
                  type: 'object',
                  subtype: 'internal#entry',
                  className: 'Object',
                  description: '{Object => 2}',
                  objectId: '-5688388600467275026.1.159',
                  properties: [
                    {
                      name: 'key',
                      value: {
                        type: 'object',
                        className: 'Object',
                        description: 'Object',
                        objectId: '-5688388600467275026.1.162',
                        properties: [
                          {
                            name: 'a',
                            value: {
                              type: 'number',
                              value: 1,
                              description: '1'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'value',
                      value: { type: 'number', value: 2, description: '2' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'length',
                value: { type: 'number', value: 2, description: '2' },
                writable: true,
                configurable: false,
                enumerable: false,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'wset',
          value: {
            type: 'object',
            subtype: 'weakset',
            className: 'WeakSet',
            description: 'WeakSet',
            objectId: '-5688388600467275026.1.120',
            properties: [
              {
                name: '0',
                value: {
                  type: 'object',
                  subtype: 'internal#entry',
                  className: 'Object',
                  description: 'Object',
                  objectId: '-5688388600467275026.1.166',
                  properties: [
                    {
                      name: 'value',
                      value: {
                        type: 'object',
                        className: 'Object',
                        description: 'Object',
                        objectId: '-5688388600467275026.1.169',
                        properties: [
                          {
                            name: 'a',
                            value: {
                              type: 'number',
                              value: 1,
                              description: '1'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '1',
                value: {
                  type: 'object',
                  subtype: 'internal#entry',
                  className: 'Object',
                  description: 'Object',
                  objectId: '-5688388600467275026.1.167',
                  properties: [
                    {
                      name: 'value',
                      value: {
                        type: 'object',
                        className: 'Object',
                        description: 'Object',
                        objectId: '-5688388600467275026.1.171',
                        properties: [
                          {
                            name: 'a',
                            value: {
                              type: 'number',
                              value: 3,
                              description: '3'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '2',
                value: {
                  type: 'object',
                  subtype: 'internal#entry',
                  className: 'Object',
                  description: 'Object',
                  objectId: '-5688388600467275026.1.168',
                  properties: [
                    {
                      name: 'value',
                      value: {
                        type: 'object',
                        className: 'Object',
                        description: 'Object',
                        objectId: '-5688388600467275026.1.173',
                        properties: [
                          {
                            name: 'a',
                            value: {
                              type: 'number',
                              value: 2,
                              description: '2'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'length',
                value: { type: 'number', value: 3, description: '3' },
                writable: true,
                configurable: false,
                enumerable: false,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'gen',
          value: {
            type: 'object',
            subtype: 'generator',
            className: 'makeIterator',
            description: 'makeIterator',
            objectId: '-5688388600467275026.1.121',
            properties: [
              {
                name: 'foo',
                value: { type: 'number', value: 42, description: '42' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'err',
          value: {
            type: 'object',
            subtype: 'error',
            className: 'CustomError',
            description: 'Error: boom!\n' +
              '    at get (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/_inspected_file.js:89:15)\n' +
              '    at getComplextTypes (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/_inspected_file.js:11:165)\n' +
              '    at Test.<anonymous> (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/snapshot.spec.js:355:7)',
            objectId: '-5688388600467275026.1.122',
            properties: [
              {
                name: 'foo',
                value: { type: 'number', value: 42, description: '42' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'stack',
                value: {
                  type: 'string',
                  value: 'Error: boom!\n' +
                    '    at get (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/_inspected_file.js:89:15)\n' +
                    '    at getComplextTypes (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/_inspected_file.js:11:165)\n' +
                    '    at Test.<anonymous> (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/snapshot.spec.js:355:7)'
                },
                writable: false,
                configurable: true,
                enumerable: false,
                isOwn: true
              },
              {
                name: 'message',
                value: { type: 'string', value: 'boom!' },
                writable: true,
                configurable: true,
                enumerable: false,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'fn',
          value: {
            type: 'function',
            className: 'Function',
            description: 'function fnWithProperties (a, b) {}',
            objectId: '-5688388600467275026.1.123',
            properties: [
              {
                name: 'foo',
                value: {
                  type: 'object',
                  className: 'Object',
                  description: 'Object',
                  objectId: '-5688388600467275026.1.179',
                  properties: [
                    {
                      name: 'bar',
                      value: { type: 'number', value: 42, description: '42' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'length',
                value: { type: 'number', value: 2, description: '2' },
                writable: false,
                configurable: true,
                enumerable: false,
                isOwn: true
              },
              {
                name: 'name',
                value: { type: 'string', value: 'fnWithProperties' },
                writable: false,
                configurable: true,
                enumerable: false,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'afn',
          value: {
            type: 'function',
            className: 'Function',
            description: '() => { return 42 }',
            objectId: '-5688388600467275026.1.124',
            properties: [
              {
                name: 'length',
                value: { type: 'number', value: 0, description: '0' },
                writable: false,
                configurable: true,
                enumerable: false,
                isOwn: true
              },
              {
                name: 'name',
                value: { type: 'string', value: 'afn' },
                writable: false,
                configurable: true,
                enumerable: false,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'cls',
          value: {
            type: 'function',
            className: 'Function',
            description: 'class MyClass {\n' +
              '    #secret = 42\n' +
              '    constructor () {\n' +
              '      this.foo = this.#secret\n' +
              '    }\n' +
              '  }',
            objectId: '-5688388600467275026.1.125',
            properties: [
              {
                name: 'length',
                value: { type: 'number', value: 0, description: '0' },
                writable: false,
                configurable: true,
                enumerable: false,
                isOwn: true
              },
              {
                name: 'name',
                value: { type: 'string', value: 'MyClass' },
                writable: false,
                configurable: true,
                enumerable: false,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'acls',
          value: {
            type: 'function',
            className: 'Function',
            description: 'class\n            {}',
            objectId: '-5688388600467275026.1.126',
            properties: [
              {
                name: 'length',
                value: { type: 'number', value: 0, description: '0' },
                writable: false,
                configurable: true,
                enumerable: false,
                isOwn: true
              },
              {
                name: 'name',
                value: { type: 'string', value: 'acls' },
                writable: false,
                configurable: true,
                enumerable: false,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'prox',
          value: {
            type: 'object',
            subtype: 'proxy',
            className: 'Object',
            description: 'Proxy(Object)',
            objectId: '-5688388600467275026.1.127',
            properties: [
              {
                name: 'target',
                value: { type: 'boolean', value: true },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'custProx',
          value: {
            type: 'object',
            subtype: 'proxy',
            className: 'Object',
            description: 'Proxy(MyClass)',
            objectId: '-5688388600467275026.1.128',
            properties: [
              {
                name: 'foo',
                value: { type: 'number', value: 42, description: '42' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'pPen',
          value: {
            type: 'object',
            subtype: 'promise',
            className: 'Promise',
            description: 'Promise',
            objectId: '-5688388600467275026.1.129',
            properties: [
              {
                name: '[[PromiseState]]',
                value: { type: 'string', value: 'pending' }
              },
              {
                name: '[[PromiseResult]]',
                value: { type: 'undefined' }
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'pRes',
          value: {
            type: 'object',
            subtype: 'promise',
            className: 'Promise',
            description: 'Promise',
            objectId: '-5688388600467275026.1.130',
            properties: [
              {
                name: '[[PromiseState]]',
                value: { type: 'string', value: 'fulfilled' }
              },
              {
                name: '[[PromiseResult]]',
                value: { type: 'string', value: 'resolved value' }
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'pRej',
          value: {
            type: 'object',
            subtype: 'promise',
            className: 'Promise',
            description: 'Promise',
            objectId: '-5688388600467275026.1.131',
            properties: [
              {
                name: '[[PromiseState]]',
                value: { type: 'string', value: 'rejected' }
              },
              {
                name: '[[PromiseResult]]',
                value: { type: 'string', value: 'rejected value' }
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'tarr',
          value: {
            type: 'object',
            subtype: 'typedarray',
            className: 'Int8Array',
            description: 'Int8Array(3)',
            objectId: '-5688388600467275026.1.132',
            properties: [
              {
                name: '0',
                value: { type: 'number', value: 72, description: '72' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '1',
                value: { type: 'number', value: 65, description: '65' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '2',
                value: { type: 'number', value: 76, description: '76' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'ab',
          value: {
            type: 'object',
            subtype: 'arraybuffer',
            className: 'ArrayBuffer',
            description: 'ArrayBuffer(3)',
            objectId: '-5688388600467275026.1.133',
            properties: [
              {
                name: '0',
                value: { type: 'number', value: 72, description: '72' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '1',
                value: { type: 'number', value: 65, description: '65' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '2',
                value: { type: 'number', value: 76, description: '76' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'sab',
          value: {
            type: 'object',
            subtype: 'arraybuffer',
            className: 'SharedArrayBuffer',
            description: 'SharedArrayBuffer(13)',
            objectId: '-5688388600467275026.1.134',
            properties: [
              {
                name: '0',
                value: { type: 'number', value: 104, description: '104' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '1',
                value: { type: 'number', value: 101, description: '101' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '2',
                value: { type: 'number', value: 108, description: '108' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '3',
                value: { type: 'number', value: 108, description: '108' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '4',
                value: { type: 'number', value: 111, description: '111' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '5',
                value: { type: 'number', value: 1, description: '1' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '6',
                value: { type: 'number', value: 2, description: '2' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '7',
                value: { type: 'number', value: 3, description: '3' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '8',
                value: { type: 'number', value: 119, description: '119' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '9',
                value: { type: 'number', value: 111, description: '111' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '10',
                value: { type: 'number', value: 114, description: '114' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '11',
                value: { type: 'number', value: 108, description: '108' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: '12',
                value: { type: 'number', value: 100, description: '100' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'circular',
          value: {
            type: 'object',
            className: 'Object',
            description: 'Object',
            objectId: '-5688388600467275026.1.135',
            properties: [
              {
                name: 'oblit',
                value: {
                  type: 'object',
                  className: 'Object',
                  description: 'Object',
                  objectId: '-5688388600467275026.1.216',
                  properties: [
                    {
                      name: 'a',
                      value: { type: 'number', value: 1, description: '1' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'b',
                      value: { type: 'number', value: 2, description: '2' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'c',
                      value: { type: 'number', value: 3, description: '3' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'd',
                      get: {
                        type: 'function',
                        className: 'Function',
                        description: 'get d () {\n      return 4\n    }',
                        objectId: '-5688388600467275026.1.241'
                      },
                      set: { type: 'undefined' },
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'e',
                      get: {
                        type: 'function',
                        className: 'Function',
                        description: 'get e () {\n' +
                          '      e = Math.random()\n' +
                          '      return e\n' +
                          '    }',
                        objectId: '-5688388600467275026.1.242'
                      },
                      set: { type: 'undefined' },
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'f',
                      get: { type: 'undefined' },
                      set: {
                        type: 'function',
                        className: 'Function',
                        description: 'set f (v) {}',
                        objectId: '-5688388600467275026.1.243'
                      },
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'g',
                      get: {
                        type: 'function',
                        className: 'Function',
                        description: 'get g () { return g }',
                        objectId: '-5688388600467275026.1.244'
                      },
                      set: {
                        type: 'function',
                        className: 'Function',
                        description: 'set g (x) { g = x }',
                        objectId: '-5688388600467275026.1.245'
                      },
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'obnew',
                value: {
                  type: 'object',
                  className: 'MyClass',
                  description: 'MyClass',
                  objectId: '-5688388600467275026.1.217',
                  properties: [
                    {
                      name: 'foo',
                      value: { type: 'number', value: 42, description: '42' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '#secret',
                      value: { type: 'number', value: 42, description: '42' }
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'arr',
                value: {
                  type: 'object',
                  subtype: 'array',
                  className: 'Array',
                  description: 'Array(3)',
                  objectId: '-5688388600467275026.1.218',
                  properties: [
                    {
                      name: '0',
                      value: { type: 'number', value: 1, description: '1' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '1',
                      value: { type: 'number', value: 2, description: '2' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '2',
                      value: { type: 'number', value: 3, description: '3' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'length',
                      value: { type: 'number', value: 3, description: '3' },
                      writable: true,
                      configurable: false,
                      enumerable: false,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'regex',
                value: {
                  type: 'object',
                  subtype: 'regexp',
                  className: 'RegExp',
                  description: '/foo/',
                  objectId: '-5688388600467275026.1.219'
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'date',
                value: {
                  type: 'object',
                  subtype: 'date',
                  className: 'Date',
                  description: 'Fri Sep 20 2024 09:22:59 GMT+0200 (Central European Summer Time)',
                  objectId: '-5688388600467275026.1.220'
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'map',
                value: {
                  type: 'object',
                  subtype: 'map',
                  className: 'Map',
                  description: 'Map(2)',
                  objectId: '-5688388600467275026.1.221',
                  properties: [
                    {
                      name: '0',
                      value: {
                        type: 'object',
                        subtype: 'internal#entry',
                        className: 'Object',
                        description: '{1 => 2}',
                        objectId: '-5688388600467275026.1.251',
                        properties: [
                          {
                            name: 'key',
                            value: {
                              type: 'number',
                              value: 1,
                              description: '1'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          },
                          {
                            name: 'value',
                            value: {
                              type: 'number',
                              value: 2,
                              description: '2'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '1',
                      value: {
                        type: 'object',
                        subtype: 'internal#entry',
                        className: 'Object',
                        description: '{3 => 4}',
                        objectId: '-5688388600467275026.1.252',
                        properties: [
                          {
                            name: 'key',
                            value: {
                              type: 'number',
                              value: 3,
                              description: '3'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          },
                          {
                            name: 'value',
                            value: {
                              type: 'number',
                              value: 4,
                              description: '4'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'length',
                      value: { type: 'number', value: 2, description: '2' },
                      writable: true,
                      configurable: false,
                      enumerable: false,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'set',
                value: {
                  type: 'object',
                  subtype: 'set',
                  className: 'Set',
                  description: 'Set(3)',
                  objectId: '-5688388600467275026.1.222',
                  properties: [
                    {
                      name: '0',
                      value: {
                        type: 'object',
                        subtype: 'internal#entry',
                        className: 'Object',
                        description: 'Array(2)',
                        objectId: '-5688388600467275026.1.255',
                        properties: [
                          {
                            name: 'value',
                            value: {
                              type: 'object',
                              subtype: 'array',
                              className: 'Array',
                              description: 'Array(2)',
                              objectId: '-5688388600467275026.1.258'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '1',
                      value: {
                        type: 'object',
                        subtype: 'internal#entry',
                        className: 'Object',
                        description: '3',
                        objectId: '-5688388600467275026.1.256',
                        properties: [
                          {
                            name: 'value',
                            value: {
                              type: 'number',
                              value: 3,
                              description: '3'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '2',
                      value: {
                        type: 'object',
                        subtype: 'internal#entry',
                        className: 'Object',
                        description: '4',
                        objectId: '-5688388600467275026.1.257',
                        properties: [
                          {
                            name: 'value',
                            value: {
                              type: 'number',
                              value: 4,
                              description: '4'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'length',
                      value: { type: 'number', value: 3, description: '3' },
                      writable: true,
                      configurable: false,
                      enumerable: false,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'wmap',
                value: {
                  type: 'object',
                  subtype: 'weakmap',
                  className: 'WeakMap',
                  description: 'WeakMap',
                  objectId: '-5688388600467275026.1.223',
                  properties: [
                    {
                      name: '0',
                      value: {
                        type: 'object',
                        subtype: 'internal#entry',
                        className: 'Object',
                        description: '{Object => 4}',
                        objectId: '-5688388600467275026.1.261',
                        properties: [
                          {
                            name: 'key',
                            value: {
                              type: 'object',
                              className: 'Object',
                              description: 'Object',
                              objectId: '-5688388600467275026.1.263'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          },
                          {
                            name: 'value',
                            value: {
                              type: 'number',
                              value: 4,
                              description: '4'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '1',
                      value: {
                        type: 'object',
                        subtype: 'internal#entry',
                        className: 'Object',
                        description: '{Object => 2}',
                        objectId: '-5688388600467275026.1.262',
                        properties: [
                          {
                            name: 'key',
                            value: {
                              type: 'object',
                              className: 'Object',
                              description: 'Object',
                              objectId: '-5688388600467275026.1.264'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          },
                          {
                            name: 'value',
                            value: {
                              type: 'number',
                              value: 2,
                              description: '2'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'length',
                      value: { type: 'number', value: 2, description: '2' },
                      writable: true,
                      configurable: false,
                      enumerable: false,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'wset',
                value: {
                  type: 'object',
                  subtype: 'weakset',
                  className: 'WeakSet',
                  description: 'WeakSet',
                  objectId: '-5688388600467275026.1.224',
                  properties: [
                    {
                      name: '0',
                      value: {
                        type: 'object',
                        subtype: 'internal#entry',
                        className: 'Object',
                        description: 'Object',
                        objectId: '-5688388600467275026.1.267',
                        properties: [
                          {
                            name: 'value',
                            value: {
                              type: 'object',
                              className: 'Object',
                              description: 'Object',
                              objectId: '-5688388600467275026.1.270'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '1',
                      value: {
                        type: 'object',
                        subtype: 'internal#entry',
                        className: 'Object',
                        description: 'Object',
                        objectId: '-5688388600467275026.1.268',
                        properties: [
                          {
                            name: 'value',
                            value: {
                              type: 'object',
                              className: 'Object',
                              description: 'Object',
                              objectId: '-5688388600467275026.1.271'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '2',
                      value: {
                        type: 'object',
                        subtype: 'internal#entry',
                        className: 'Object',
                        description: 'Object',
                        objectId: '-5688388600467275026.1.269',
                        properties: [
                          {
                            name: 'value',
                            value: {
                              type: 'object',
                              className: 'Object',
                              description: 'Object',
                              objectId: '-5688388600467275026.1.272'
                            },
                            writable: true,
                            configurable: true,
                            enumerable: true,
                            isOwn: true
                          }
                        ]
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'length',
                      value: { type: 'number', value: 3, description: '3' },
                      writable: true,
                      configurable: false,
                      enumerable: false,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'gen',
                value: {
                  type: 'object',
                  subtype: 'generator',
                  className: 'makeIterator',
                  description: 'makeIterator',
                  objectId: '-5688388600467275026.1.225',
                  properties: [
                    {
                      name: 'foo',
                      value: { type: 'number', value: 42, description: '42' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'err',
                value: {
                  type: 'object',
                  subtype: 'error',
                  className: 'CustomError',
                  description: 'Error: boom!\n' +
                    '    at get (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/_inspected_file.js:89:15)\n' +
                    '    at getComplextTypes (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/_inspected_file.js:11:165)\n' +
                    '    at Test.<anonymous> (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/snapshot.spec.js:355:7)',
                  objectId: '-5688388600467275026.1.226',
                  properties: [
                    {
                      name: 'foo',
                      value: { type: 'number', value: 42, description: '42' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'stack',
                      value: {
                        type: 'string',
                        value: 'Error: boom!\n' +
                          '    at get (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/_inspected_file.js:89:15)\n' +
                          '    at getComplextTypes (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/_inspected_file.js:11:165)\n' +
                          '    at Test.<anonymous> (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/snapshot.spec.js:355:7)'
                      },
                      writable: false,
                      configurable: true,
                      enumerable: false,
                      isOwn: true
                    },
                    {
                      name: 'message',
                      value: { type: 'string', value: 'boom!' },
                      writable: true,
                      configurable: true,
                      enumerable: false,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'fn',
                value: {
                  type: 'function',
                  className: 'Function',
                  description: 'function fnWithProperties (a, b) {}',
                  objectId: '-5688388600467275026.1.227',
                  properties: [
                    {
                      name: 'foo',
                      value: {
                        type: 'object',
                        className: 'Object',
                        description: 'Object',
                        objectId: '-5688388600467275026.1.277'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'length',
                      value: { type: 'number', value: 2, description: '2' },
                      writable: false,
                      configurable: true,
                      enumerable: false,
                      isOwn: true
                    },
                    {
                      name: 'name',
                      value: { type: 'string', value: 'fnWithProperties' },
                      writable: false,
                      configurable: true,
                      enumerable: false,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'afn',
                value: {
                  type: 'function',
                  className: 'Function',
                  description: '() => { return 42 }',
                  objectId: '-5688388600467275026.1.228',
                  properties: [
                    {
                      name: 'length',
                      value: { type: 'number', value: 0, description: '0' },
                      writable: false,
                      configurable: true,
                      enumerable: false,
                      isOwn: true
                    },
                    {
                      name: 'name',
                      value: { type: 'string', value: 'afn' },
                      writable: false,
                      configurable: true,
                      enumerable: false,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'cls',
                value: {
                  type: 'function',
                  className: 'Function',
                  description: 'class MyClass {\n' +
                    '    #secret = 42\n' +
                    '    constructor () {\n' +
                    '      this.foo = this.#secret\n' +
                    '    }\n' +
                    '  }',
                  objectId: '-5688388600467275026.1.229',
                  properties: [
                    {
                      name: 'length',
                      value: { type: 'number', value: 0, description: '0' },
                      writable: false,
                      configurable: true,
                      enumerable: false,
                      isOwn: true
                    },
                    {
                      name: 'name',
                      value: { type: 'string', value: 'MyClass' },
                      writable: false,
                      configurable: true,
                      enumerable: false,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'acls',
                value: {
                  type: 'function',
                  className: 'Function',
                  description: 'class\n            {}',
                  objectId: '-5688388600467275026.1.230',
                  properties: [
                    {
                      name: 'length',
                      value: { type: 'number', value: 0, description: '0' },
                      writable: false,
                      configurable: true,
                      enumerable: false,
                      isOwn: true
                    },
                    {
                      name: 'name',
                      value: { type: 'string', value: 'acls' },
                      writable: false,
                      configurable: true,
                      enumerable: false,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'prox',
                value: {
                  type: 'object',
                  subtype: 'proxy',
                  className: 'Object',
                  description: 'Proxy(Object)',
                  objectId: '-5688388600467275026.1.231',
                  properties: [
                    {
                      name: 'target',
                      value: { type: 'boolean', value: true },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'custProx',
                value: {
                  type: 'object',
                  subtype: 'proxy',
                  className: 'Object',
                  description: 'Proxy(MyClass)',
                  objectId: '-5688388600467275026.1.232',
                  properties: [
                    {
                      name: 'foo',
                      value: { type: 'number', value: 42, description: '42' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'pPen',
                value: {
                  type: 'object',
                  subtype: 'promise',
                  className: 'Promise',
                  description: 'Promise',
                  objectId: '-5688388600467275026.1.233',
                  properties: [
                    {
                      name: '[[PromiseState]]',
                      value: { type: 'string', value: 'pending' }
                    },
                    {
                      name: '[[PromiseResult]]',
                      value: { type: 'undefined' }
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'pRes',
                value: {
                  type: 'object',
                  subtype: 'promise',
                  className: 'Promise',
                  description: 'Promise',
                  objectId: '-5688388600467275026.1.234',
                  properties: [
                    {
                      name: '[[PromiseState]]',
                      value: { type: 'string', value: 'fulfilled' }
                    },
                    {
                      name: '[[PromiseResult]]',
                      value: { type: 'string', value: 'resolved value' }
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'pRej',
                value: {
                  type: 'object',
                  subtype: 'promise',
                  className: 'Promise',
                  description: 'Promise',
                  objectId: '-5688388600467275026.1.235',
                  properties: [
                    {
                      name: '[[PromiseState]]',
                      value: { type: 'string', value: 'rejected' }
                    },
                    {
                      name: '[[PromiseResult]]',
                      value: { type: 'string', value: 'rejected value' }
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'tarr',
                value: {
                  type: 'object',
                  subtype: 'typedarray',
                  className: 'Int8Array',
                  description: 'Int8Array(3)',
                  objectId: '-5688388600467275026.1.236',
                  properties: [
                    {
                      name: '0',
                      value: { type: 'number', value: 72, description: '72' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '1',
                      value: { type: 'number', value: 65, description: '65' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '2',
                      value: { type: 'number', value: 76, description: '76' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'ab',
                value: {
                  type: 'object',
                  subtype: 'arraybuffer',
                  className: 'ArrayBuffer',
                  description: 'ArrayBuffer(3)',
                  objectId: '-5688388600467275026.1.237',
                  properties: [
                    {
                      name: '0',
                      value: { type: 'number', value: 72, description: '72' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '1',
                      value: { type: 'number', value: 65, description: '65' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '2',
                      value: { type: 'number', value: 76, description: '76' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'sab',
                value: {
                  type: 'object',
                  subtype: 'arraybuffer',
                  className: 'SharedArrayBuffer',
                  description: 'SharedArrayBuffer(13)',
                  objectId: '-5688388600467275026.1.238',
                  properties: [
                    {
                      name: '0',
                      value: {
                        type: 'number',
                        value: 104,
                        description: '104'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '1',
                      value: {
                        type: 'number',
                        value: 101,
                        description: '101'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '2',
                      value: {
                        type: 'number',
                        value: 108,
                        description: '108'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '3',
                      value: {
                        type: 'number',
                        value: 108,
                        description: '108'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '4',
                      value: {
                        type: 'number',
                        value: 111,
                        description: '111'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '5',
                      value: { type: 'number', value: 1, description: '1' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '6',
                      value: { type: 'number', value: 2, description: '2' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '7',
                      value: { type: 'number', value: 3, description: '3' },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '8',
                      value: {
                        type: 'number',
                        value: 119,
                        description: '119'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '9',
                      value: {
                        type: 'number',
                        value: 111,
                        description: '111'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '10',
                      value: {
                        type: 'number',
                        value: 114,
                        description: '114'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '11',
                      value: {
                        type: 'number',
                        value: 108,
                        description: '108'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: '12',
                      value: {
                        type: 'number',
                        value: 100,
                        description: '100'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'circular',
                value: {
                  type: 'object',
                  className: 'Object',
                  description: 'Object',
                  objectId: '-5688388600467275026.1.239',
                  properties: [
                    {
                      name: 'oblit',
                      value: {
                        type: 'object',
                        className: 'Object',
                        description: 'Object',
                        objectId: '-5688388600467275026.1.313'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'obnew',
                      value: {
                        type: 'object',
                        className: 'MyClass',
                        description: 'MyClass',
                        objectId: '-5688388600467275026.1.314'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'arr',
                      value: {
                        type: 'object',
                        subtype: 'array',
                        className: 'Array',
                        description: 'Array(3)',
                        objectId: '-5688388600467275026.1.315'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'regex',
                      value: {
                        type: 'object',
                        subtype: 'regexp',
                        className: 'RegExp',
                        description: '/foo/',
                        objectId: '-5688388600467275026.1.316'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'date',
                      value: {
                        type: 'object',
                        subtype: 'date',
                        className: 'Date',
                        description: 'Fri Sep 20 2024 09:22:59 GMT+0200 (Central European Summer Time)',
                        objectId: '-5688388600467275026.1.317'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'map',
                      value: {
                        type: 'object',
                        subtype: 'map',
                        className: 'Map',
                        description: 'Map(2)',
                        objectId: '-5688388600467275026.1.318'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'set',
                      value: {
                        type: 'object',
                        subtype: 'set',
                        className: 'Set',
                        description: 'Set(3)',
                        objectId: '-5688388600467275026.1.319'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'wmap',
                      value: {
                        type: 'object',
                        subtype: 'weakmap',
                        className: 'WeakMap',
                        description: 'WeakMap',
                        objectId: '-5688388600467275026.1.320'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'wset',
                      value: {
                        type: 'object',
                        subtype: 'weakset',
                        className: 'WeakSet',
                        description: 'WeakSet',
                        objectId: '-5688388600467275026.1.321'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'gen',
                      value: {
                        type: 'object',
                        subtype: 'generator',
                        className: 'makeIterator',
                        description: 'makeIterator',
                        objectId: '-5688388600467275026.1.322'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'err',
                      value: {
                        type: 'object',
                        subtype: 'error',
                        className: 'CustomError',
                        description: 'Error: boom!\n' +
                          '    at get (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/_inspected_file.js:89:15)\n' +
                          '    at getComplextTypes (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/_inspected_file.js:11:165)\n' +
                          '    at Test.<anonymous> (/Users/thomas.watson/go/src/github.com/DataDog/node_modules/dd-trace/packages/dd-trace/test/debugger/devtools_client/snapshot.spec.js:355:7)',
                        objectId: '-5688388600467275026.1.323'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'fn',
                      value: {
                        type: 'function',
                        className: 'Function',
                        description: 'function fnWithProperties (a, b) {}',
                        objectId: '-5688388600467275026.1.324'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'afn',
                      value: {
                        type: 'function',
                        className: 'Function',
                        description: '() => { return 42 }',
                        objectId: '-5688388600467275026.1.325'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'cls',
                      value: {
                        type: 'function',
                        className: 'Function',
                        description: 'class MyClass {\n' +
                          '    #secret = 42\n' +
                          '    constructor () {\n' +
                          '      this.foo = this.#secret\n' +
                          '    }\n' +
                          '  }',
                        objectId: '-5688388600467275026.1.326'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'acls',
                      value: {
                        type: 'function',
                        className: 'Function',
                        description: 'class\n            {}',
                        objectId: '-5688388600467275026.1.327'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'prox',
                      value: {
                        type: 'object',
                        subtype: 'proxy',
                        className: 'Object',
                        description: 'Proxy(Object)',
                        objectId: '-5688388600467275026.1.328'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'custProx',
                      value: {
                        type: 'object',
                        subtype: 'proxy',
                        className: 'Object',
                        description: 'Proxy(MyClass)',
                        objectId: '-5688388600467275026.1.329'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'pPen',
                      value: {
                        type: 'object',
                        subtype: 'promise',
                        className: 'Promise',
                        description: 'Promise',
                        objectId: '-5688388600467275026.1.330'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'pRes',
                      value: {
                        type: 'object',
                        subtype: 'promise',
                        className: 'Promise',
                        description: 'Promise',
                        objectId: '-5688388600467275026.1.331'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'pRej',
                      value: {
                        type: 'object',
                        subtype: 'promise',
                        className: 'Promise',
                        description: 'Promise',
                        objectId: '-5688388600467275026.1.332'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'tarr',
                      value: {
                        type: 'object',
                        subtype: 'typedarray',
                        className: 'Int8Array',
                        description: 'Int8Array(3)',
                        objectId: '-5688388600467275026.1.333'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'ab',
                      value: {
                        type: 'object',
                        subtype: 'arraybuffer',
                        className: 'ArrayBuffer',
                        description: 'ArrayBuffer(3)',
                        objectId: '-5688388600467275026.1.334'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'sab',
                      value: {
                        type: 'object',
                        subtype: 'arraybuffer',
                        className: 'SharedArrayBuffer',
                        description: 'SharedArrayBuffer(13)',
                        objectId: '-5688388600467275026.1.335'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'circular',
                      value: {
                        type: 'object',
                        className: 'Object',
                        description: 'Object',
                        objectId: '-5688388600467275026.1.336'
                      },
                      writable: true,
                      configurable: true,
                      enumerable: true,
                      isOwn: true
                    },
                    {
                      name: 'hidden',
                      value: { type: 'string', value: 'secret' },
                      writable: false,
                      configurable: false,
                      enumerable: false,
                      isOwn: true
                    }
                  ]
                },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              },
              {
                name: 'hidden',
                value: { type: 'string', value: 'secret' },
                writable: false,
                configurable: false,
                enumerable: false,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'hidden',
          value: { type: 'string', value: 'secret' },
          writable: false,
          configurable: false,
          enumerable: false,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'hidden',
    value: { type: 'string', value: 'secret' },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'a1',
    value: { type: 'number', value: 1, description: '1' },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'a2',
    value: { type: 'number', value: 2, description: '2' },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'ref',
    value: {
      type: 'object',
      className: 'Object',
      description: 'Object',
      objectId: '-5688388600467275026.1.338',
      properties: [
        {
          name: 'wmo1',
          value: {
            type: 'object',
            className: 'Object',
            description: 'Object',
            objectId: '-5688388600467275026.1.340',
            properties: [
              {
                name: 'a',
                value: { type: 'number', value: 1, description: '1' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'wmo2',
          value: {
            type: 'object',
            className: 'Object',
            description: 'Object',
            objectId: '-5688388600467275026.1.341',
            properties: [
              {
                name: 'b',
                value: { type: 'number', value: 3, description: '3' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'wso1',
          value: {
            type: 'object',
            className: 'Object',
            description: 'Object',
            objectId: '-5688388600467275026.1.342',
            properties: [
              {
                name: 'a',
                value: { type: 'number', value: 1, description: '1' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'wso2',
          value: {
            type: 'object',
            className: 'Object',
            description: 'Object',
            objectId: '-5688388600467275026.1.343',
            properties: [
              {
                name: 'a',
                value: { type: 'number', value: 2, description: '2' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        },
        {
          name: 'wso3',
          value: {
            type: 'object',
            className: 'Object',
            description: 'Object',
            objectId: '-5688388600467275026.1.344',
            properties: [
              {
                name: 'a',
                value: { type: 'number', value: 3, description: '3' },
                writable: true,
                configurable: true,
                enumerable: true,
                isOwn: true
              }
            ]
          },
          writable: true,
          configurable: true,
          enumerable: true,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  },
  {
    name: 'get',
    value: {
      type: 'function',
      className: 'Function',
      description: 'function get () {\n' +
        '  const bigint = BigInt(Number.MAX_SAFE_INTEGER) * 2n\n' +
        '\n' +
        '  let e, g\n' +
        '  const oblit = {\n' +
        '    a: 1,\n' +
        '    b: 2,\n' +
        '    c: 3,\n' +
        '    // Has no side-effect\n' +
        '    // TODO: At some point it would be great to detect this and get the value,\n' +
        '    // though currently we can neither detect it, nor execute the getter.\n' +
        '    get d () {\n' +
        '      return 4\n' +
        '    },\n' +
        '    // Has side-effect: We should never try to fetch this!\n' +
        '    get e () {\n' +
        '      e = Math.random()\n' +
        '      return e\n' +
        '    },\n' +
        '    // Only setter\n' +
        '    set f (v) {}, // eslint-disable-line accessor-pairs\n' +
        '    // Both getter and setter\n' +
        '    get g () { return g },\n' +
        '    set g (x) { g = x }\n' +
        '  }\n' +
        '\n' +
        '  function fnWithProperties (a, b) {}\n' +
        '  fnWithProperties.foo = { bar: 42 }\n' +
        '\n' +
        '  class MyClass {\n' +
        '    #secret = 42\n' +
        '    constructor () {\n' +
        '      this.foo = this.#secret\n' +
        '    }\n' +
        '  }\n' +
        '\n' +
        '  // const myIterator = {\n' +
        '  //   next () { return { value: 42, done: true } },\n' +
        '  //   * [Symbol.iterator] () {\n' +
        '  //     yield 1\n' +
        '  //   }\n' +
        '  // }\n' +
        '\n' +
        '  function * makeIterator () {\n' +
        '    yield 1\n' +
        '    yield 2\n' +
        '  }\n' +
        '  const gen = makeIterator()\n' +
        '  gen.foo = 42\n' +
        '\n' +
        '  class CustomError extends Error {\n' +
        '    constructor (...args) {\n' +
        '      super(...args)\n' +
        '      this.foo = 42\n' +
        '    }\n' +
        '  }\n' +
        "  const err = new CustomError('boom!')\n" +
        '\n' +
        "  const buf1 = Buffer.from('IBM')\n" +
        "  const buf2 = Buffer.from('hello\\x01\\x02\\x03world')\n" +
        '\n' +
        '  const arrayBuffer = new ArrayBuffer(buf1.length)\n' +
        '  const sharedArrayBuffer = new SharedArrayBuffer(buf2.length)\n' +
        '\n' +
        '  const typedArray = new Int8Array(arrayBuffer)\n' +
        '  for (let i = 0; i < buf1.length; i++) typedArray[i] = buf1[i] - 1\n' +
        '\n' +
        '  const sharedTypedArray = new Int8Array(sharedArrayBuffer)\n' +
        '  for (let i = 0; i < buf2.length; i++) sharedTypedArray[i] = buf2[i]\n' +
        '\n' +
        '  // const dataView = new DataView(new ArrayBuffer(3))\n' +
        '  // dataView.setUint8(0, 42)\n' +
        '\n' +
        '  const result = {\n' +
        '    primitives: {\n' +
        '      undef: undefined,\n' +
        '      nil: null,\n' +
        '      bool: true,\n' +
        '      num: 42,\n' +
        '      bigint,\n' +
        "      str: 'foo',\n" +
        "      sym: Symbol('foo')\n" +
        '    },\n' +
        '    complexTypes: {\n' +
        '      oblit,\n' +
        '      obnew: new MyClass(),\n' +
        '      arr: [1, 2, 3],\n' +
        '      regex: /foo/,\n' +
        "      date: new Date('2024-09-20T07:22:59.998Z'),\n" +
        '      map: new Map([[1, 2], [3, 4]]),\n' +
        '      set: new Set([[1, 2], 3, 4]),\n' +
        '      wmap: new WeakMap([[ref.wmo1, 2], [ref.wmo2, 4]]),\n' +
        '      wset: new WeakSet([ref.wso1, ref.wso2, ref.wso3]),\n' +
        '      // itr: myIterator,\n' +
        '      gen,\n' +
        '      err,\n' +
        '      fn: fnWithProperties,\n' +
        '      afn: () => { return 42 },\n' +
        '      cls: MyClass,\n' +
        '      acls: class\n' +
        '            {}, // eslint-disable-line indent, brace-style\n' +
        '      prox: new Proxy({ target: true }, { get () { return false } }),\n' +
        '      custProx: new Proxy(new MyClass(), { get () { return false } }),\n' +
        '      pPen: new Promise(() => {}),\n' +
        "      pRes: Promise.resolve('resolved value'),\n" +
        "      pRej: Promise.reject('rejected value'), // eslint-disable-line prefer-promise-reject-errors\n" +
        "      tarr: typedArray, // TODO: Should we test other TypedArray's?\n" +
        '      ab: arrayBuffer,\n' +
        '      sab: sharedArrayBuffer\n' +
        '      // dv: dataView\n' +
        '      // wam: new WebAssembly.Memory({\n' +
        '      //   initial: 10,\n' +
        '      //   maximum: 100\n' +
        '      // }),\n' +
        "      // wav: new WebAssembly.Table({ initial: 2, element: 'anyfunc' }).get(0)\n" +
        '    },\n' +
        '    nested: {\n' +
        '      myNestedObj: {\n' +
        '        deepObj: { foo: { foo: { foo: { foo: { foo: true } } } } },\n' +
        '        deepArr: [[[[[42]]]]]\n' +
        '      }\n' +
        '    }\n' +
        '  }\n' +
        '\n' +
        '  result.complexTypes.circular = result.complexTypes\n' +
        '\n' +
        "  Object.defineProperty(result.complexTypes, 'hidden', {\n" +
        "    value: 'secret',\n" +
        '    enumerable: false\n' +
        '  })\n' +
        '\n' +
        "  // ensure we don't get an unhandled promise rejection error\n" +
        '  result.complexTypes.pRej.catch(() => {})\n' +
        '\n' +
        '  return result\n' +
        '}',
      objectId: '-5688388600467275026.1.339',
      properties: [
        {
          name: 'length',
          value: { type: 'number', value: 0, description: '0' },
          writable: false,
          configurable: true,
          enumerable: false,
          isOwn: true
        },
        {
          name: 'name',
          value: { type: 'string', value: 'get' },
          writable: false,
          configurable: true,
          enumerable: false,
          isOwn: true
        }
      ]
    },
    writable: true,
    configurable: true,
    enumerable: true,
    isOwn: true
  }
]

Copy link
Collaborator Author

watson commented Jul 23, 2024

Copy link

github-actions bot commented Jul 23, 2024

Overall package size

Self size: 7.3 MB
Deduped: 62.71 MB
No deduping: 62.99 MB

Dependency sizes | name | version | self size | total size | |------|---------|-----------|------------| | @datadog/native-appsec | 8.1.1 | 18.67 MB | 18.68 MB | | @datadog/native-iast-taint-tracking | 3.1.0 | 12.27 MB | 12.28 MB | | @datadog/pprof | 5.3.0 | 9.85 MB | 10.22 MB | | protobufjs | 7.2.5 | 2.77 MB | 5.16 MB | | @datadog/native-iast-rewriter | 2.4.1 | 2.14 MB | 2.23 MB | | @opentelemetry/core | 1.14.0 | 872.87 kB | 1.47 MB | | @datadog/native-metrics | 2.0.0 | 898.77 kB | 1.3 MB | | @opentelemetry/api | 1.8.0 | 1.21 MB | 1.21 MB | | jsonpath-plus | 9.0.0 | 580.4 kB | 1.03 MB | | import-in-the-middle | 1.11.2 | 112.74 kB | 826.22 kB | | msgpack-lite | 0.1.26 | 201.16 kB | 281.59 kB | | opentracing | 0.14.7 | 194.81 kB | 194.81 kB | | pprof-format | 2.1.0 | 111.69 kB | 111.69 kB | | @datadog/sketches-js | 2.1.0 | 109.9 kB | 109.9 kB | | semver | 7.6.3 | 95.82 kB | 95.82 kB | | lodash.sortby | 4.7.0 | 75.76 kB | 75.76 kB | | lru-cache | 7.14.0 | 74.95 kB | 74.95 kB | | ignore | 5.3.1 | 51.46 kB | 51.46 kB | | int64-buffer | 0.1.10 | 49.18 kB | 49.18 kB | | shell-quote | 1.8.1 | 44.96 kB | 44.96 kB | | istanbul-lib-coverage | 3.2.0 | 29.34 kB | 29.34 kB | | rfdc | 1.3.1 | 25.21 kB | 25.21 kB | | tlhunter-sorted-set | 0.1.0 | 24.94 kB | 24.94 kB | | limiter | 1.1.5 | 23.17 kB | 23.17 kB | | dc-polyfill | 0.1.4 | 23.1 kB | 23.1 kB | | retry | 0.13.1 | 18.85 kB | 18.85 kB | | jest-docblock | 29.7.0 | 8.99 kB | 12.76 kB | | crypto-randomuuid | 1.0.0 | 11.18 kB | 11.18 kB | | koalas | 1.0.2 | 6.47 kB | 6.47 kB | | path-to-regexp | 0.1.10 | 6.38 kB | 6.38 kB | | module-details-from-path | 1.0.3 | 4.47 kB | 4.47 kB |

🤖 This report was automatically generated by heaviest-objects-in-the-universe

@watson watson self-assigned this Jul 23, 2024
@pr-commenter
Copy link

pr-commenter bot commented Jul 23, 2024

Benchmarks

Benchmark execution time: 2024-10-03 13:05:13

Comparing candidate commit c4dc156 in PR branch watson/DEBUG-2605/snapshot with baseline commit f988e00 in branch master.

Found 0 performance improvements and 0 performance regressions! Performance is the same for 259 metrics, 7 unstable metrics.

@watson watson force-pushed the watson/DEBUG-2605/snapshot branch from 8639412 to 60ed8b6 Compare July 25, 2024 06:50
@watson watson force-pushed the watson/DEBUG-2605/snapshot branch from 60ed8b6 to 8af7e4d Compare July 25, 2024 08:29
@watson watson force-pushed the watson/DEBUG-2605/snapshot branch from 8af7e4d to 39fea38 Compare July 25, 2024 08:37
@watson watson force-pushed the watson/DEBUG-2605/snapshot branch from 39fea38 to 30f6795 Compare July 25, 2024 10:36
@watson watson force-pushed the watson/DEBUG-2605/snapshot branch from 30f6795 to c214942 Compare July 25, 2024 10:37
@watson watson force-pushed the watson/DEBUG-2605/snapshot branch from c214942 to d4f1f8a Compare July 25, 2024 10:44
@watson watson force-pushed the watson/DEBUG-2605/snapshot branch from d4f1f8a to b6e69cd Compare July 25, 2024 11:53
@watson watson force-pushed the watson/DEBUG-2605/snapshot branch from b6e69cd to eb10ac7 Compare July 26, 2024 08:00
Copy link

codecov bot commented Jul 26, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 88.11%. Comparing base (e4bd929) to head (7dba831).

Additional details and impacted files
@@                   Coverage Diff                    @@
##           watson/DEBUG-2532/di    #4549      +/-   ##
========================================================
- Coverage                 88.44%   88.11%   -0.33%     
========================================================
  Files                       263      259       -4     
  Lines                     11371    11303      -68     
  Branches                     33       33              
========================================================
- Hits                      10057     9960      -97     
- Misses                     1314     1343      +29     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@watson watson changed the title [DI] Add ability to take state snapshot feature [DI] Add ability to take state snapshot Sep 25, 2024
@watson watson marked this pull request as ready for review September 25, 2024 15:15
@watson watson requested review from a team as code owners September 25, 2024 15:15
@watson watson changed the base branch from master to watson/DEBUG-2605/mocha September 26, 2024 11:54
@watson watson force-pushed the watson/DEBUG-2605/snapshot branch 2 times, most recently from 22f8505 to 17043fa Compare September 26, 2024 17:23
shatzi
shatzi previously approved these changes Sep 27, 2024
Copy link

@shatzi shatzi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

great progress

Base automatically changed from watson/DEBUG-2605/mocha to master October 2, 2024 10:46
@watson watson dismissed shatzi’s stale review October 2, 2024 10:46

The base branch was changed.

@watson watson mentioned this pull request Oct 3, 2024
6 tasks
juan-fernandez
juan-fernandez previously approved these changes Oct 3, 2024
shatzi
shatzi previously approved these changes Oct 3, 2024
integration-tests/debugger/index.spec.js Show resolved Hide resolved
}

// TODO: The following extra information from `internalProperties` might be relevant to include for functions:
// - Bound function: `[[TargetFunction]]`, `[[BoundThis]]` and `[[BoundArgs]]`
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would love to sit down and see examples of each of those.

I think capture the BoundThis would be beneficial for debugging - as it would let the user know what the instance that was bounded.

What I'm not sure if those also expose as locals and args (specifically for BoundArgs) - if they are duplicated, not sure this worth the effort. but if they are not captured, I think those values would improve the debug experience.

@watson watson dismissed stale reviews from shatzi and juan-fernandez via 43dd45a October 4, 2024 07:44
@watson watson enabled auto-merge (squash) October 4, 2024 07:47
@watson watson merged commit d024777 into master Oct 4, 2024
185 of 193 checks passed
@watson watson deleted the watson/DEBUG-2605/snapshot branch October 4, 2024 07:52
tlhunter pushed a commit that referenced this pull request Oct 7, 2024
Take a "snapshot" of the variables that are in scope when a probe is hit
(except the global scope, which intentionally have been omitted since it's too
noisy):

- For each variable in scope, we traverse objects and their properties up to
  `maxReferenceDepth` deep (default is 3 levels).
- Strings are truncated to `maxLength` (default is 255 characters).
- Binary data is converted to strings with appropriate escaping of non
  printable characters (the `maxLength` limit is also applied)

Out of scope:
- Information about `this` is not captured.
- maxCollectionSize limit
- maxFieldCount limit
- Special handling for snapshots larger than 1MB (e.g. snapshot pruning or
  something simpler)
- PII redaction
bengl pushed a commit that referenced this pull request Oct 16, 2024
Take a "snapshot" of the variables that are in scope when a probe is hit
(except the global scope, which intentionally have been omitted since it's too
noisy):

- For each variable in scope, we traverse objects and their properties up to
  `maxReferenceDepth` deep (default is 3 levels).
- Strings are truncated to `maxLength` (default is 255 characters).
- Binary data is converted to strings with appropriate escaping of non
  printable characters (the `maxLength` limit is also applied)

Out of scope:
- Information about `this` is not captured.
- maxCollectionSize limit
- maxFieldCount limit
- Special handling for snapshots larger than 1MB (e.g. snapshot pruning or
  something simpler)
- PII redaction
bengl pushed a commit that referenced this pull request Oct 16, 2024
Take a "snapshot" of the variables that are in scope when a probe is hit
(except the global scope, which intentionally have been omitted since it's too
noisy):

- For each variable in scope, we traverse objects and their properties up to
  `maxReferenceDepth` deep (default is 3 levels).
- Strings are truncated to `maxLength` (default is 255 characters).
- Binary data is converted to strings with appropriate escaping of non
  printable characters (the `maxLength` limit is also applied)

Out of scope:
- Information about `this` is not captured.
- maxCollectionSize limit
- maxFieldCount limit
- Special handling for snapshots larger than 1MB (e.g. snapshot pruning or
  something simpler)
- PII redaction
This was referenced Oct 16, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants