Більше 10 рядків у помилці стеку node.js?


93

Чи є спосіб отримати більше 10 рядків у помилці стеку node.js?

function a() { dieInHell(); }
function b() { a(); }
function c() { b(); }
function d() { c(); }
function e() { d(); }
function f() { e(); }
function g() { f(); }
function h() { g(); }
function i() { h(); }
function j() { i(); }
function k() { j(); }
function l() { k(); }
function m() { l(); }
function n() { m(); }
function o() { n(); }
function p() { o(); }
function q() { p(); }

try {
    q();
}
catch(e) {
    console.log(e.stack);
}

показує:

$ node debug.js 
ReferenceError: dieInHell is not defined
    at a (/Users/julien/tmp/debug.js:2:5)
    at b (/Users/julien/tmp/debug.js:6:5)
    at c (/Users/julien/tmp/debug.js:10:5)
    at d (/Users/julien/tmp/debug.js:14:5)
    at e (/Users/julien/tmp/debug.js:18:5)
    at f (/Users/julien/tmp/debug.js:22:5)
    at g (/Users/julien/tmp/debug.js:26:5)
    at h (/Users/julien/tmp/debug.js:30:5)
    at i (/Users/julien/tmp/debug.js:34:5)
    at j (/Users/julien/tmp/debug.js:38:5)

Чи є спосіб отримати більше 10 дзвінків?


Краща налагодження є пріоритетом для майбутніх версій Node.JS
BRampersad

Чи я беру з вашого коментаря, що цього ще не можна зробити?
Julien Genestoux,

Ні. Але краща налагодження є в списку для .6 :)
BRampersad

Відповіді:


138

Найпростішим рішенням для цього є запуск коду з наступного:

Error.stackTraceLimit = Infinity;

Якщо ви хочете побачити стек стека, який охоплює виклики setTimeout / setInterval, тоді слід зробити більш складний https://github.com/mattinsler/longjohn .


2
Error.stackTraceLimit не робив цього замість мене, коли я востаннє намагався.
BT

Зверніть увагу, що деякі пакунки можуть змінюватися stackTraceLimit . Крім того, це впливає лише на те, що ви отримуєте Error.stackз того, що я бачу. Вбудований налагоджувач завжди відображає повний стек ( btкоманда).
x-yuri

І очевидно, трасування стека не слідує за асинхронними операціями. Іншими словами, під час зворотного виклику асинхронного виклику ваш стек починається з нуля (в основному він порожній).
x-yuri

Команда @ x-yuri Node.js працює над цим ( github.com/nodejs/node/issues/11865 ) В іншому випадку повний стек видно в налагоджувачі Chrome під час запуску Node applicaiton за допомогою --inspectабо --inpect-brkкомандою
Mariusz Nowak

Омг, це зводило мене з розуму. Дякую за цю інформацію!
Kris Oye

65

Ви можете передати обмеження трасування стека як параметр командного рядка node:

node --stack-trace-limit=1000 debug.js // за замовчуванням 10

До речі, ще одна річ, яка здається малоймовірною, але просто витратила кілька годин мого часу на налагодження, - це розмір стека (який за замовчуванням становить 492 кБ) . Ви можете мати дуже неінформативні помилки, якщо стек вичерпаний ( RangeErrorбез будь-якої додаткової інформації). Ви можете збільшити розмір стека за допомогою :

node --stack-size=1024 debug.js // за замовчуванням 492

У світі ланцюжків зворотного дзвінка до зворотного дзвінка до зворотного дзвінка насправді дуже легко перевищити розмір стека для великих вхідних розмірів, якщо програма не написана з урахуванням цього.

Щоб переглянути всі параметри, пов’язані зі стеком:

node --v8-options | grep -B0 -A1 stack


3
- stack-trace-limit все ще працює станом на 0.10.22, дякую!
Riplexus

3
Починаючи з Node.js v8.0.0, ви також можете встановити це у NODE_OPTIONSзмінній середовища, наприклад NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-script. Корисно, якщо ви не звертаєтесь nodeбезпосередньо.
Bluu


-1

Також ви можете використовувати вбудований налагоджувач , який відкриває знайомий налагоджувач інструментів розробника Google Chrome. Він зупиняється на будь-якій помилці, і ви можете переглянути весь стек. Просто запустіть:

$ node --inspect debug.js

Debugger listening on port 9229.
To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.