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.