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.