Respostas:
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, getStackTrace
estaria na pilha quando fosse capturado. O segundo argumento exclui getStackTrace
de ser incluído no rastreamento de pilha.
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().stack
funciona em ambos os navegadores e me dá informações suficientes para depurar.
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
(new Error).stack
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.
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();
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
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).