Console.trace () sonucunu javascript'te chrome veya firefox ile string olarak nasıl alabilirim?


100

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.


1
bu PhantomJS'de çalışmıyor :(
ekkis

Yanıtlar:


104

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, getStackTraceyakalandığında yığında olur. Oradaki ikinci argüman getStackTraceyığın izlemesine dahil edilmeyi dışlar .


18
Bilgi için teşekkürler. Bu, kromda çalıştı ama firefox'ta işe yaramadı. Bu yüzden tekrar aradım ve buldum Error().stack. Firefox'ta nesne ve işlev adları kaybolsa ve kromda nesne adı kaybolsa da (ile aynı Error.captureStackTrace), Error().stackher iki tarayıcıda da çalışıyor ve hata ayıklamak için yeterli bilgi veriyor.
js_

@Konstantin Smolyanin'in cevabıyla aynı sonucu tam olarak. Sonuç olarak aynı sınırlı ayrıntılar.
Codebeat

Kabul edilen cevap bu olmamalı. Burada aldığınız yığın, yalnızca bir "üst kısım" içeren "kesilir", console.trace () ise tam yığını gösterecektir. Burada 30 yığın derinliğine sahip bir örneğe bakın: stackoverflow.com/questions/62768598/…
mathheadinclouds

35

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

2
Cevabınız için teşekkürler. Ancak bu yalnızca istisna oluştuğunda işe yarar. İstisnasız yığın izleme almam gerekiyor.
js_

10
Peki ya(new Error).stack
JasonSmith

Bu, a.debug () 'a bir istisna atmalıdır - bu, yığını elde etmenin pahalı bir yoludur, ancak çalışmalıdır.
fijiaaron

Bu yaklaşım aynı zamanda sadece çalışabilen bazı kodlardan, örneğin PhantomJS veya benzeri herhangi bir nedenle bir iz almaya çalışırken işe yarar.
waxspin

20

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.


12

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

Ben bakardım github.com/stacktracejs/stacktrace.js uygulama ES6 vaat desteklemeye değiştiği gibi.
Erez Cohen

Şimdilik bunun kullanılması gerektiğini unutmayın: github.com/stacktracejs/stacktrace.js/tree/stable?files=1 (yeni sürüm henüz yayınlanmadı)
Erez Cohen

10

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

6

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).


0

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