2016-02-17 6 views
2

У меня есть длинный код узла, который через некоторое время напечатает ошибку [RangeError: Maximum call stack size exceeded] и продолжит делать это на неопределенный срок.Ошибка трассировки стека узла

Чтобы отследить, что рекурсивный вызов является причиной этого (я не мог найти где-рекурсивной, что я не использовал либо setTimeout или process.nextTick на), я сделал это:

process.on('uncaughtException', function(error) { 
    console.log(error); 
    console.log(error.stack); 
}); 

Это застало ошибку , но свойство stack - undefined! Я попытался выбросить свою собственную ошибку, а свойство stack отображает ожидаемый стек. Является ли узел не должен иметь stack в ошибке переполнения стека? Как я могу определить, какие вызовы вызывают это?

+0

«console.trace» производит что-то более значимое? – Wex

+0

попробуйте 'console.log (error.stack || error) ... это будет печатать стек, если аргумент' error' имеет тип 'Error' ... Если он имеет тип' String', он будет явно печатать сообщение ... –

ответ

0

Вам не нужно бросать объект Error в JavaScript. Это может быть даже строка. Таким образом, вы не можете полагаться на атрибут stack, который будет определен при сбое приложения.

Из того, что вы описываете, у вас в памяти есть утечка памяти, которую вы должны попытаться найти. В Интернете есть много обучающих программ. Существует также модуль, который может найти утечку под названием memwatch по адресу https://www.npmjs.com/package/memwatch.

+1

Исключения, связанные с исключением стека, в любом случае являются экземплярами 'Error'. – Bergi

+0

Но не делает ли событие' uncaughtException' какое-либо необработанное исключение? Кроме того, вы, вероятно, не должны его использовать вообще? – migg

Смежные вопросы