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?


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.


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


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/...
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.