Отладка "Максимальный размер стека вызовов"
У меня есть сервер, на котором я могу заставить умирать со следующим выходом:
events.js:38
EventEmitter.prototype.emit = function(type) {
^
RangeError: Maximum call stack size exceeded
Однако без дампа или трассировки стека я не могу найти, является ли это бесконечной рекурсией или просто слишком большой цепочкой, не говоря уже о том, где находится проблема.
Запуск Node с опцией --trace
заставил мои тесты не только работать медленно (как и следовало ожидать), но и не воспроизводить проблему.
У кого-нибудь есть какие-либо решения или советы по достижению этого?
Ответы
Ответ 1
Кажется, сейчас ответ: сидите и ждите Node.js, чтобы обновить новую версию V8 или создать собственный патч из отчета об ошибке проекта Chromium.
Этот архивированный поток из списка рассылки v8-dev показывает обсуждение, в котором
- Дэйв Смит поднимает эту проблему и предлагает патч
- Ян Го из проекта Chromium обсуждает его, записывает ошибку Chromium в отношении этой проблемы и применяет другое исправление
- Дэйв отмечает, что Node (0,8 в то время) использует V8 3.11 и спрашивает о том, как использовать патч. Ян отвечает, что патч, вероятно, приземлится в V8 3.15 и не будет передан обратно.
Обратите внимание, что Node.js v0.8 используется V8 3.11; Node.js 0.10 в настоящее время использует V8 3.14. Таким образом, исправление, принятое Chromium для этой проблемы, все еще "в будущем" в отношении Node.
(Этот ответ должен благодаря @Coderoshi, поскольку он, следуя потоку своего ответа, узнал все это.)
Ответ 2
Вероятность того, что это "слишком большая цепочка", кажется маловероятной.
Вероятно, это функция, вызывающая событие, которое вызвало сам.
Итак, если замедление кода приводит к остановке бесконечной рекурсии.
Я предполагаю, что у вас есть очередь и с более медленным режимом ее не получается
заполняется так быстро.
Если это не поможет, я думаю, мне нужно больше информации.
Может быть, у кого-то есть все-таки для этого.
Ответ 3
Этот патч может помочь вам найти решение. Он значительно расширяет трассировку стека:
https://github.com/dizzyd/node/commit/40434019540ffc17e984ff0653500a3c5db87deb