Come ottenere il risultato di console.trace () come stringa in javascript con chrome o firefox?


98

console.trace()restituisce il risultato sulla console.
Voglio ottenere i risultati come stringa e salvarli in un file.

Non definisco nomi per le funzioni e non posso nemmeno ottenere i loro nomi con callee.caller.name.


1
questo non funziona in PhantomJS :(
ekkis

Risposte:


103

Non sono sicuro di Firefox, ma in v8 / chrome puoi utilizzare un metodo sul costruttore Error chiamato captureStackTrace. ( Maggiori informazioni qui )

Quindi un modo hacky per ottenerlo sarebbe:

var getStackTrace = function() {
  var obj = {};
  Error.captureStackTrace(obj, getStackTrace);
  return obj.stack;
};

console.log(getStackTrace());

Normalmente, getStackTracesarebbe in pila quando viene catturato. Il secondo argomento esclude getStackTracedall'essere incluso nella traccia dello stack.


18
Grazie per le vostre informazioni. Funzionava in Chrome ma non in Firefox. Così ho cercato di nuovo e ho trovato Error().stack. Sebbene i nomi degli oggetti e delle funzioni vengano persi in Firefox e il nome dell'oggetto venga perso in Chrome (lo stesso di Error.captureStackTrace), Error().stackfunziona con entrambi i browser e mi fornisce informazioni sufficienti per eseguire il debug.
js_

Esatto lo stesso risultato della risposta di @Konstantin Smolyanin. Di conseguenza, gli stessi dettagli limitati.
Codebeat

Questa non dovrebbe essere la risposta accettata. Lo stack che ottieni qui è "tagliato" contenente solo una "parte superiore", mentre console.trace () mostrerà lo stack completo. Vedere un esempio con la profondità dello stack 30 qui: stackoverflow.com/questions/62768598/...
mathheadinclouds

34

Error.stack è ciò di cui hai bisogno. Funziona in Chrome e Firefox. Per esempio

try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}

darà in Chrome:

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)

e in Firefox:

@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
Grazie per la tua risposta. Ma funziona solo quando si è verificata un'eccezione. Ho bisogno di ottenere la traccia dello stack senza eccezioni.
js_

8
Che dire(new Error).stack
JasonSmith

Questo dovrebbe generare un'eccezione su a.debug () - è un modo costoso per ottenere lo stack, ma dovrebbe funzionare.
fijiaaron

Questo approccio è utile anche quando si cerca di ottenere una traccia da un codice che può essere eseguito solo su, ad esempio PhantomJS o simili per qualsiasi motivo.
waxspin

18

Questo darà una traccia dello stack (come array di stringhe) per i moderni Chrome, Firefox, Opera e IE10 +

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

Utilizzo:

console.log(getStackTrace().join('\n'));

Esclude dallo stack la propria chiamata e il titolo "Errore" utilizzato da Chrome e Firefox (ma non da IE).

Non dovrebbe bloccarsi sui browser meno recenti, ma restituire semplicemente un array vuoto. Se hai bisogno di una soluzione più universale, guarda stacktrace.js . Il suo elenco di browser supportati è davvero impressionante, ma a mio avviso è molto grande per quel piccolo compito a cui è destinato: 37Kb di testo minimizzato comprese tutte le dipendenze.


12

C'è una libreria chiamata stacktrace.js che ti fornisce tracce dello stack cross browser. Puoi usarlo semplicemente includendo lo script e chiamando in qualsiasi momento:

var trace = printStackTrace();

Guarderei su github.com/stacktracejs/stacktrace.js poiché l'implementazione è cambiata per supportare le promesse di ES6.
Erez Cohen

Nota che per ora dovrebbe essere usato: github.com/stacktracejs/stacktrace.js/tree/stable?files=1 (la nuova versione non è stata ancora rilasciata)
Erez Cohen

9

Questo è solo un piccolo miglioramento dell'eccellente codice di Konstantin. Taglia un po 'a scapito del lancio-cattura e istanzia semplicemente lo stack di errori:

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

Di solito voglio un livello specifico di traccia dello stack (per il mio logger personalizzato), quindi questo è possibile anche quando chiamo:

getStackTrace()[2]; // get stack trace info 2 levels-deep

5

hai solo bisogno var stack = new Error().stack. questa è la versione semplificata della risposta @sgouros.

function foo() {
  bar();
}
function bar() {
  baz();
}
function baz() {
  console.log(new Error().stack);
}

foo();

Probabilmente non funzionerà in tutti i browser (funziona in Chrome).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.