console.trace()
sonucunu konsolda çıkarır.
Sonuçları string olarak almak ve bir dosyaya kaydetmek istiyorum.
Fonksiyonlar için isim tanımlamıyorum ve isimlerini de alamıyorum callee.caller.name
.
Yanıtlar:
Firefox'tan emin değilim, ancak v8 / chrome'da, adlı Error yapıcısında bir yöntem kullanabilirsiniz captureStackTrace
. ( Daha fazla bilgi burada )
Yani bunu elde etmenin karmaşık bir yolu şudur:
var getStackTrace = function() {
var obj = {};
Error.captureStackTrace(obj, getStackTrace);
return obj.stack;
};
console.log(getStackTrace());
Normalde, getStackTrace
yakalandığında yığında olur. Oradaki ikinci argüman getStackTrace
yığın izlemesine dahil edilmeyi dışlar .
Error().stack
. Firefox'ta nesne ve işlev adları kaybolsa ve kromda nesne adı kaybolsa da (ile aynı Error.captureStackTrace
), Error().stack
her iki tarayıcıda da çalışıyor ve hata ayıklamak için yeterli bilgi veriyor.
Error.stack ihtiyacınız olan şeydir. Chrome ve Firefox'ta çalışır. Örneğin
try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}
Chrome'da verecek:
TypeError: Object #<Object> has no method 'debug'
at eval at <anonymous> (unknown source)
at eval (native)
at Object._evaluateOn (unknown source)
at Object._evaluateAndWrap (unknown source)
at Object.evaluate (unknown source)
ve Firefox'ta:
@http://www.google.com.ua/:87 _firebugInjectedEvaluate("with(_FirebugCommandLine){try { var a = {}; a.debug() } catch(ex) {console.log(ex.stack)}\n};")
@http://www.google.com.ua/:87 _firebugEvalEvent([object Event])
@http://www.google.com.ua/:67
(new Error).stack
Bu, modern Chrome, Firefox, Opera ve IE10 + için bir yığın izleme (dizeler dizisi olarak) verecektir.
function getStackTrace () {
var stack;
try {
throw new Error('');
}
catch (error) {
stack = error.stack || '';
}
stack = stack.split('\n').map(function (line) { return line.trim(); });
return stack.splice(stack[0] == 'Error' ? 2 : 1);
}
Kullanım:
console.log(getStackTrace().join('\n'));
Yığın dışında, kendi çağrısını ve Chrome ve Firefox tarafından kullanılan (ancak IE değil) "Hata" başlığını dışlar.
Eski tarayıcılarda çökmemeli, sadece boş dizi döndürmelidir. Daha evrensel çözüme ihtiyacınız varsa, stacktrace.js'ye bakın . Desteklenen tarayıcıların listesi gerçekten etkileyici, ancak bana göre amaçlandığı küçük görev için çok büyük: Tüm bağımlılıkları içeren 37Kb küçültülmüş metin.
Size çapraz tarayıcı yığın izleri sağlayan stacktrace.js adlı bir kitaplık vardır . Komut dosyasını ekleyerek ve herhangi bir noktada çağırarak kullanabilirsiniz:
var trace = printStackTrace();
Bu, Konstantin'in mükemmel kodunda yalnızca küçük bir iyileştirmedir. Fırlatma-yakalama masrafını biraz azaltır ve sadece Hata yığınını somutlaştırır:
function getStackTrace () {
let stack = new Error().stack || '';
stack = stack.split('\n').map(function (line) { return line.trim(); });
return stack.splice(stack[0] == 'Error' ? 2 : 1);
}
Genelde belirli bir yığın izleme düzeyi istiyorum (özel kaydedicim için), bu nedenle arama sırasında da bu mümkündür:
getStackTrace()[2]; // get stack trace info 2 levels-deep
sadece ihtiyacın var var stack = new Error().stack
. bu @sgouros yanıtının basitleştirilmiş sürümüdür.
function foo() {
bar();
}
function bar() {
baz();
}
function baz() {
console.log(new Error().stack);
}
foo();
Muhtemelen her tarayıcıda çalışmayacaktır (Chrome'da çalışır).
Yığın İzini JavaScript'te dize değişkeni olarak NodeJS'de almaya çalışıyordum ve bu eğitim bana yardımcı oldu. Bu, senaryonuzda da çalışacaktır, ancak yığın izlemenin Hata Nesnesi ile yazdırılması dışında console.trace()
.
Yığın izleme yazdırmak için kod:
function add(x, y) {
console.log(new Error().stack);
return x+y;
}