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.