Respuestas:
No estoy seguro de Firefox, pero en v8 / chrome puedes usar un método en el constructor Error llamado captureStackTrace
. ( Más info aquí )
Así que una forma hacky de conseguirlo sería:
var getStackTrace = function() {
var obj = {};
Error.captureStackTrace(obj, getStackTrace);
return obj.stack;
};
console.log(getStackTrace());
Normalmente, getStackTrace
estaría en la pila cuando se captura. El segundo argumento no getStackTrace
se incluye en el seguimiento de la pila.
Error().stack
. Aunque los nombres de objeto y función se pierden en Firefox y el nombre de objeto se pierde en Chrome (igual que Error.captureStackTrace
), Error().stack
funciona en ambos navegadores y me da suficiente información para depurar.
Error.stack es lo que necesita. Funciona en Chrome y Firefox. Por ejemplo
try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}
dará en 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)
y en 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
Esto dará un seguimiento de la pila (como una matriz de cadenas) para Chrome, Firefox, Opera e IE10 + modernos.
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'));
Excluye de la pila su propia llamada, así como el título "Error" que utilizan Chrome y Firefox (pero no IE).
No debería fallar en navegadores más antiguos, solo devolver una matriz vacía. Si necesita una solución más universal, consulte stacktrace.js . Su lista de navegadores compatibles es realmente impresionante, pero en mi opinión es muy grande para esa pequeña tarea para la que está destinada: 37 Kb de texto minimizado, incluidas todas las dependencias.
Existe una biblioteca llamada stacktrace.js que le brinda seguimientos de pila entre navegadores. Puede usarlo simplemente incluyendo el script y llamando en cualquier momento:
var trace = printStackTrace();
Esta es solo una pequeña mejora del excelente código de Konstantin. Reduce un poco el costo de lanzar-atrapar y simplemente crea una instancia de la pila de errores:
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);
}
Por lo general, quiero un nivel específico de seguimiento de pila (para mi registrador personalizado), por lo que esto también es posible al llamar:
getStackTrace()[2]; // get stack trace info 2 levels-deep
solo necesitas var stack = new Error().stack
. esta es una versión simplificada de la respuesta de @sgouros.
function foo() {
bar();
}
function bar() {
baz();
}
function baz() {
console.log(new Error().stack);
}
foo();
Probablemente no funcione en todos los navegadores (funciona en Chrome).