Lebih dari 10 baris dalam kesalahan tumpukan node.js?

93

Apakah ada cara untuk mendapatkan lebih dari 10 baris dalam kesalahan tumpukan 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);
}

acara:

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

Apakah ada cara untuk mendapatkan lebih dari 10 panggilan?

Julien Genestoux
sumber
Debugging yang lebih baik adalah prioritas untuk versi Node.JS yang akan datang
BRampersad
Apakah saya mengambil dari komentar Anda bahwa ini belum bisa dilakukan?
Julien Genestoux
Nggak. Tapi debugging yang lebih baik ada di daftar untuk .6 :)
BRampersad

Jawaban:

138

Solusi termudah untuk itu adalah memulai kode Anda dengan yang berikut:

Error.stackTraceLimit = Infinity;

Jika Anda ingin melihat pelacakan tumpukan yang mencakup panggilan setTimeout / setInterval, maka https://github.com/mattinsler/longjohn yang lebih canggih adalah cara yang tepat.

Mariusz Nowak
sumber
2
Error.stackTraceLimit tidak melakukannya untuk saya saat terakhir kali mencoba.
BT
Perhatikan bahwa beberapa paket mungkin berubah stackTraceLimit . Juga, itu hanya mempengaruhi apa yang Anda dapatkan Error.stackdari apa yang saya bisa lihat. Debugger bawaan selalu menampilkan tumpukan penuh ( btperintah).
x-yuri
Dan tampaknya, pelacakan tumpukan tidak mengikuti operasi asinkron. Dengan kata lain, dalam callback panggilan asinkron, tumpukan Anda dimulai dari awal (pada dasarnya kosong).
x-yuri
@ x-yuri Tim Node.js sedang mengerjakannya ( github.com/nodejs/node/issues/11865 ) Jika tidak, tumpukan penuh terlihat di debugger Chrome ketika Anda menjalankan aplikasi Node dengan --inspectatau --inpect-brkperintah
Mariusz Nowak
Omg ini membuatku gila. Terima kasih atas info ini!
Kris Oye
65

Anda dapat meneruskan batas pelacakan tumpukan sebagai parameter baris perintah ke node:

node --stack-trace-limit=1000 debug.js // default 10

BTW, hal lain yang kedengarannya tidak mungkin terjadi, tetapi hanya menyia-nyiakan beberapa jam waktu saya untuk debugging, adalah ukuran tumpukan (yang defaultnya 492 kB) . Anda dapat mengalami kesalahan yang sangat tidak informatif jika tumpukan habis ( RangeErrortanpa info tambahan). Anda dapat meningkatkan ukuran tumpukan dengan :

node --stack-size=1024 debug.js // default 492

Dalam dunia rantai callback-to-callback-to-callback, sebenarnya sangat mudah untuk melebihi ukuran tumpukan untuk ukuran input yang besar, jika program tidak ditulis dalam pikiran ini.

Untuk melihat semua opsi terkait tumpukan:

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

jakub.g
sumber
3
--stack-trace-limit masih berfungsi pada 0.10.22, terima kasih!
Riplexus
3
Mulai Node.js v8.0.0, Anda juga dapat menyetelnya di NODE_OPTIONSvariabel lingkungan, mis NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-script. Berguna jika Anda tidak memohon nodesecara langsung.
Bluu
-1

Anda juga dapat menggunakan debugger bawaan , yang membuka debugger dev-tools Google Chrome yang sudah dikenal. Itu berhenti pada kesalahan apa pun dan Anda dapat menelusuri seluruh tumpukan. Lari saja:

$ node --inspect debug.js

Debugger listening on port 9229.
To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/...
zbycz
sumber