Como obter o resultado do console.trace () como string em javascript com cromo ou firefox?

98

console.trace()exibe seu resultado no console.
Quero obter os resultados como string e salvá-los em um arquivo.

Não defino nomes para funções e também não consigo obter seus nomes com callee.caller.name.

js_
fonte
1
isso não funciona no PhantomJS :(
ekkis

Respostas:

103

Não tenho certeza sobre o firefox, mas na v8 / chrome você pode usar um método no construtor de erro chamado captureStackTrace. ( Mais informações aqui )

Portanto, uma maneira rápida de conseguir isso seria:

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

console.log(getStackTrace());

Normalmente, getStackTraceestaria na pilha quando fosse capturado. O segundo argumento exclui getStackTracede ser incluído no rastreamento de pilha.

chjj
fonte
18
Obrigado por sua informação. Isso funcionou no cromo, mas não no Firefox. Então eu procurei novamente e encontrei Error().stack. Embora os nomes de objeto e função sejam perdidos no firefox e o nome do objeto seja perdido no cromo (o mesmo que Error.captureStackTrace), Error().stackfunciona em ambos os navegadores e me dá informações suficientes para depurar.
js_
Exata o mesmo resultado da resposta de @Konstantin Smolyanin. Os mesmos detalhes limitados como resultado.
Codebeat
Esta não deve ser a resposta aceita. A pilha que você obtém aqui é "reduzida" contendo apenas uma "parte superior", enquanto console.trace () mostrará a pilha completa. Veja um exemplo com profundidade de pilha 30 aqui: stackoverflow.com/questions/62768598/…
mathheadinclouds
34

Error.stack é o que você precisa. Funciona no Chrome e Firefox. Por exemplo

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

dará no 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 no 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
Homem Molecular
fonte
2
Obrigado pela sua resposta. Mas isso funciona apenas quando ocorre uma exceção. Preciso obter rastreamento de pilha, sem exceção.
js_
8
E sobre(new Error).stack
JasonSmith
Isso deve lançar uma exceção em a.debug () - é uma maneira cara de obter a pilha, mas deve funcionar.
fijiaaron
Essa abordagem também é útil ao tentar obter um rastreamento de algum código que só pode ser executado, por exemplo, PhantomJS ou similar por qualquer motivo.
waxspin
18

Isso fornecerá um rastreamento de pilha (como uma matriz de strings) para o Chrome moderno, 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);
}

Uso:

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

Ele exclui da pilha sua própria chamada, bem como o título "Erro" que é usado pelo Chrome e Firefox (mas não pelo IE).

Não deve travar em navegadores mais antigos, mas apenas retornar um array vazio. Se você precisar de uma solução mais universal, olhe stacktrace.js . A sua lista de navegadores suportados é realmente impressionante, mas a meu ver é muito grande para aquela pequena tarefa a que se destina: 37Kb de texto reduzido incluindo todas as dependências.

Konstantin Smolyanin
fonte
12

Há uma biblioteca chamada stacktrace.js que fornece rastreamentos de pilha entre navegadores. Você pode usá-lo simplesmente incluindo o script e chamando a qualquer momento:

var trace = printStackTrace();
Fijiaaron
fonte
Eu veria github.com/stacktracejs/stacktrace.js, pois a implementação mudou para oferecer suporte às promessas ES6.
Erez Cohen
Observe que, por enquanto, deve ser usado: github.com/stacktracejs/stacktrace.js/tree/stable?files=1 (a nova versão ainda não foi lançada)
Erez Cohen
9

Este é apenas um pequeno aprimoramento ao excelente código de Konstantin. Ele reduz um pouco as despesas de arremesso e captura e apenas instancia a pilha de erros:

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

Normalmente, quero um nível específico de rastreamento de pilha (para meu logger personalizado), então isso também é possível ao chamar:

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

você só precisa var stack = new Error().stack. esta é uma versão simplificada da resposta @sgouros.

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

foo();

Provavelmente não funcionará em todos os navegadores (funciona no Chrome).

jcubic
fonte