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

Maximum call stack size exceeded #41

Closed
RamiAPFM opened this issue Mar 10, 2023 · 5 comments
Closed

Maximum call stack size exceeded #41

RamiAPFM opened this issue Mar 10, 2023 · 5 comments

Comments

@RamiAPFM
Copy link

RamiAPFM commented Mar 10, 2023

node_modules/safe-stable-stringify/index.js:287:23

          const key = keys[i]
          const tmp = stringifyFnReplacer(key, value, stack, replacer, spacer, indentation)
          if (tmp !== undefined) {
            res += `${separator}"${strEscape(key)}":${whitespace}${tmp}`
            separator = join
          }
        }

It appears I am experiencing a memory leak when attempting to log circular JSON.

Any advice on how to tackle this?

Dependencies:

    "@types/newrelic": "^9.4.0",
    "@typescript-eslint/eslint-plugin": "^5.42.0",
    "@typescript-eslint/parser": "^5.42.0",
    "eslint": "^8.27.0",
    "eslint-plugin-import": "^2.26.0",
    "prettier": "^2.7.1",
    "prettier-plugin-organize-imports": "^3.1.1",
    "standard-version": "^9.5.0",
    "tslint": "^6.1.3",
    "tslint-config-prettier": "^1.18.0",
    "typescript": "^4.8.4"
  },
  "dependencies": {
    "@types/compression": "^1.7.2",
    "@types/config": "^3.3.0",
    "@types/connect-slashes": "0.0.33",
    "@types/connect-timeout": "0.0.36",
    "@types/cookie-parser": "^1.4.3",
    "@types/express": "^4.17.14",
    "@types/response-time": "^2.3.5",
    "body-parser": "1.20.1",
    "compression": "1.7.4",
    "config": "3.3.8",
    "connect-slashes": "1.4.0",
    "connect-timeout": "1.9.0",
    "cookie-parser": "1.4.6",
    "dotenv": "16.0.3",
    "express": "4.18.2",
    "https": "^1.0.0",
    "newrelic": "^9.7.1",
    "response-time": "2.3.2",
    "winston": "^3.8.2",
    "winston-transport-sentry-node": "^2.6.0"
  },```
@BridgeAR
Copy link
Owner

Do you have the code that caused the issue? The code does detect circular structures.

@RamiAPFM
Copy link
Author

":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_des^Cestroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":{"_destroyed":false,"_idleNext":"[Circular]","_idlePrev":"[Circular]","_idleStart":76374,"_idleTimeout":40000,"_repeat":null},"_idleStart":76374,"_idleTimeout":40000,"_repeat":null},"_idleStart":76374,"_idleTimeout":40000,"_repeat":null},"_idleStart":76374,"_idleTimeout":40000,"_repeat":null},"_idleStart":76374,"_idleTimeout":40000,"_repeat":null},"_idleStart":76363,"_idleTimeout":40000,"_repeat":null},"_idleStart":76363,"_idleTimeout":40000,"_repeat":null},"_idleStart":76363,"_idleTimeout":40000,"_repeat":null},"_idleStart":763

@BridgeAR
Copy link
Owner

This looks like a linked list and the maximum call stack size is not related to a circular structure in this case. The algorithm uses a recursion and this adds up while trying to create the JSON representation of this deep linked list. You can use the maximumDepth option to limit the inspection to a specific depth. Logging a linked list is a bit tricky though and I wonder if that is really what you want to do.

Rewriting the algorithm to a non recursive one would also resolve the issue but that is likely a bit slower and a bit more complicated to implement. I would rather not do that at the moment.

I am going to lose this as there's nothing else that I can do at the moment. Maybe still let me know if using the maximumDepth option helps you? :-)

@RamiAPFM
Copy link
Author

pino.js uses a different library and the performance is significantly more performant and this issue doesn't exist there.

@BridgeAR
Copy link
Owner

BridgeAR commented Mar 20, 2023

@RamiAPFM pino actually uses this library but it uses the maximumDepth option: https://github.com/pinojs/pino/blob/2d5c522398731c1063a453295ed0f906b5ae54ff/pino.js#L111-L114

That way the maximum call stack size error want happen and it's faster due to inspecting less entries of the linked list.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants