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.


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.


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

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.


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

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.