Bir node.js yığın hatası içinde 10'dan fazla satır var mı?


98

Bir node.js yığın hatasında 10'dan fazla satır almanın bir yolu var mı?

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

gösterir:

$ 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'dan fazla çağrı almanın bir yolu var mı?


Daha iyi hata ayıklama, Node.JS'nin gelecekteki sürümleri için bir önceliktir
BRampersad

Yorumunuzdan bunun henüz yapılamayacağını anlıyor muyum?
Julien Genestoux

Hayır! Ama daha iyi hata ayıklama .6 için listede var :)
BRampersad

Yanıtlar:


145

Bunun için en kolay çözüm, kodunuzu aşağıdakilerle başlatmaktır:

Error.stackTraceLimit = Infinity;

SetTimeout / setInterval çağrılarına yayılan yığın izlemeyi görmek istiyorsanız, daha karmaşık https://github.com/mattinsler/longjohn yol olacaktır.


2
En son denediğimde Error.stackTraceLimit bunu benim için yapmadı.
BT

Bazı paketlerin değişebileceğini unutmayın stackTraceLimit . Ayrıca, sadece Error.stackgörebildiklerimden içeri girdiklerini etkiler . Yerleşik hata ayıklayıcı her zaman tam yığını ( btkomut) görüntüler.
x-yuri

Görünüşe göre, yığın izleme eşzamansız işlemleri izlemiyor. Başka bir deyişle, eşzamansız bir çağrının geri çağrılmasında yığınınız sıfırdan başlar (temelde boştur).
x-yuri

@ x-yuri Node.js ekibi bunun üzerinde çalışıyor ( github.com/nodejs/node/issues/11865 ) Aksi takdirde, Node uygulamasını birlikte --inspectveya --inpect-brkkomutuyla çalıştırdığınızda Chrome hata ayıklayıcısında tam yığın görünür
Mariusz Nowak

Omg bu beni deli ediyordu. Bu bilgi için teşekkürler!
Kris Oye

67

Yığın izleme sınırını komut satırı parametresi olarak şunlara geçirebilirsiniz node:

node --stack-trace-limit=1000 debug.js // varsayılan 10

BTW, olması pek olası görünmeyen ancak hata ayıklama için birkaç saatimi boşa harcayan başka bir şey de yığın boyutu (varsayılan olarak 492 kB'dir) . Yığın tükenirse ( RangeErrorherhangi bir ek bilgi olmadan) çok bilgilendirici olmayan hatalar yaşayabilirsiniz . Yığın boyutunu şu şekilde artırabilirsiniz :

node --stack-size=1024 debug.js // varsayılan 492

Geri aramadan geri aramaya zincirleme dünyasında, program akılda yazılmadıysa, büyük girdi boyutları için yığın boyutunu aşmak aslında çok kolaydır.

Yığınla ilgili tüm seçenekleri görmek için:

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


3
--stack-trace-limit, 0.10.22 itibariyle hala çalışıyor, teşekkürler!
Riplexus

3
Node.js v8.0.0'dan itibaren, bunu NODE_OPTIONSortam değişkeninde de ayarlayabilirsiniz , örn NODE_OPTIONS='--stack-trace-limit=10000' /path/to/some-script. nodeDoğrudan çağırmıyorsanız kullanışlıdır .
Bluu


-1

Ayrıca , tanıdık Google Chrome'un geliştirme araçları hata ayıklayıcısını açan yerleşik hata ayıklayıcıyı da kullanabilirsiniz . Herhangi bir hatada durur ve tüm yığına göz atabilirsiniz. Sadece koş:

$ node --inspect debug.js

Debugger listening on port 9229.
To start debugging, open the following URL in Chrome: chrome-devtools://devtools/remote/serve_file/...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.