Nhiều hơn 10 dòng trong một lỗi ngăn xếp node.js?


93

Có cách nào để nhận được nhiều hơn 10 dòng trong lỗi ngăn xếp node.js không?

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);
}

trình diễn :

$ 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)

Có cách nào để nhận được hơn 10 cuộc gọi?


Better gỡ lỗi là một ưu tiên cho các phiên bản tương lai của Node.js
BRampersad

Tôi có nhận xét từ nhận xét của bạn rằng điều này chưa thể được thực hiện?
Julien Genestoux

Không. Nhưng gỡ lỗi tốt hơn có trong danh sách cho .6 :)
BRampersad

Câu trả lời:


138

Giải pháp dễ nhất cho điều đó là bắt đầu mã của bạn bằng cách sau:

Error.stackTraceLimit = Infinity;

Nếu bạn muốn xem dấu vết ngăn xếp trải dài qua các lệnh gọi setTimeout / setInterval, thì https://github.com/mattinsler/longjohn sẽ là cách để thực hiện.


2
Error.stackTraceLimit đã không làm điều đó cho tôi khi tôi thử lần cuối cùng.
BT

Lưu ý rằng một số gói có thể thay đổi stackTraceLimit . Ngoài ra, nó chỉ ảnh hưởng đến những gì bạn nhận được Error.stacktừ những gì tôi có thể nhìn thấy. Trình gỡ lỗi tích hợp luôn hiển thị đầy đủ ngăn xếp ( btlệnh).
x-yuri

Và rõ ràng, dấu vết ngăn xếp không tuân theo các hoạt động không đồng bộ. Nói cách khác, trong một lần gọi lại của một lệnh gọi không đồng bộ, ngăn xếp của bạn bắt đầu từ đầu (về cơ bản là trống).
x-yuri

@ x-yuri Node.js đội đang làm việc trên đó ( github.com/nodejs/node/issues/11865 ) Nếu không đủ ngăn xếp có thể nhìn thấy trong debugger Chrome khi bạn chạy Node Application với --inspecthoặc --inpect-brklệnh
Mariusz Nowak

Omg điều này đã làm tôi phát điên. Cảm ơn vì thông tin này!
Kris Oye,

65

Bạn có thể vượt qua giới hạn theo dõi ngăn xếp dưới dạng tham số dòng lệnh tới node:

node --stack-trace-limit=1000 debug.js // mặc định 10

BTW, một điều khác nghe có vẻ khó xảy ra, nhưng chỉ lãng phí vài giờ thời gian của tôi để gỡ lỗi, là kích thước ngăn xếp (mặc định là 492 kB) . Bạn có thể gặp các lỗi rất không thông tin nếu ngăn xếp đã hết ( RangeErrorkhông có bất kỳ thông tin bổ sung nào). Bạn có thể tăng kích thước ngăn xếp bằng :

node --stack-size=1024 debug.js // mặc định 492

Trong thế giới của các chuỗi callback-to-callback-to-callback, trên thực tế rất dễ vượt quá kích thước ngăn xếp đối với các kích thước đầu vào lớn, nếu chương trình không được viết trong tâm trí.

Để xem tất cả các tùy chọn liên quan đến ngăn xếp:

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


3
--stack-trace-limit vẫn hoạt động kể từ ngày 0.10.22, cảm ơn!
Riplexus

3
Tính đến Node.js v8.0.0, bạn cũng có thể thiết lập này trong NODE_OPTIONSbiến môi trường, ví dụ như NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-script. Hữu ích nếu bạn không gọi nodetrực tiếp.
Bluu


-1

Ngoài ra, bạn có thể sử dụng trình gỡ lỗi tích hợp , mở trình gỡ lỗi công cụ dành cho nhà phát triển quen thuộc của Google Chrome. Nó dừng ở bất kỳ lỗi nào và bạn có thể duyệt toàn bộ ngăn xếp. Chỉ cần chạy:

$ node --inspect debug.js

Debugger listening on port 9229.
To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/...
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.