2010-01-13 16 views
18

Para la depuración de javascript simple, usaré alertas para mostrar los valores de las variables y cosas por el estilo. ¿Hay alguna manera de obtener la pila de llamadas actual en JavaScript para poder mostrarla en una alerta?Al depurar javascript, ¿hay alguna manera de alertar la pila de llamadas actual?

Gracias.

+0

Es esto para la depuración o la producción? No estoy seguro de que exista una forma estándar de hacerlo en todos los navegadores, pero podría haber algunas características útiles específicas para algunos navegadores ... –

+0

Esto solo sería para eliminar fallas. – rosscj2533

Respuesta

36

rápida y sucia en los navegadores basados ​​en Gecko:

new Error().stack 

También puede arrastre manualmente algo de la pila utilizando Function.prototype.caller:

var thisFunction = arguments.callee; 
var caller = thisFunction.caller; 
var callerCaller = caller.caller; 
// ...and eventually, assuming no recursion: 
var bottomCaller = ...; 
assert(bottomCaller.caller === null); 

Uno (posiblemente grande) salvedad de que el truco .caller es que no maneja la recursividad - .caller se ve desde la parte superior de la pila downwar d para encontrar la primera instancia de la función en la pila y luego devuelve su llamador inmediato, por lo que sin tener cuidado puede bucle buscar infinitamente llamadores.

Otra advertencia a caller es que, en el futuro, si alguna de su código utiliza el modo estricto de ECMAScript 5, la propiedad caller de estrictas funciones del modo (o de funciones que a su vez han sido llamados a estrictas funciones del modo) es una so- llamada "píldora venenosa" que arroja un TypeError cuando se accede. La propiedad caller de las funciones "enlazadas" (aquellas creadas por el método Function.prototype.bind de ES5) también es una píldora venenosa. Estas restricciones rompen el algoritmo genérico de andar de pila, aunque uno podría imaginar formas específicas de uso para evitar esto (funciones de anotación de entrada y salida, tal vez).

Tenga en cuenta que caminar sobre la pila como este no es una gran idea en el código de producción (como un truco rápido para la depuración está bien, aunque); en este momento subir la pila como en el último ejemplo es algo costoso en el motor JS de Mozilla, y probablemente te saque del código de la máquina y vuelva al código interpretado. Además, el stack-walk es O (n), lo que puede importar si tiende a tener acumulaciones complejas y profundas.

+0

Gracias, esto es lo que estaba buscando. – rosscj2533

+0

¿Sigue siendo relevante esta respuesta hoy? – naaz

+0

Stack-walking no es tan caro como solía ser, pero todavía perjudicará el rendimiento hasta cierto punto. Algunos de los detalles más finos sobre cómo ha cambiado la función de las propiedades de la píldora venenosa en las recientes ediciones de ECMAScript, pero el impulso general es casi el mismo. Más allá de esos dos bits, el comentario sigue siendo fundamentalmente relevante, creo. –

6

Use depurador como Firebug para esto si está en Firefox. Chrome y Opera tienen un depurador incorporado. Y hay Developers Tools para Internet Explorer.

+0

Gracias, conozco esas opciones, pero me preguntaba si había una forma de hacerlo sin usar un depurador. – rosscj2533

+2

La forma más fácil y rápida de depurar javascript es usar depurador. –

+0

Usar un depurador no es un problema y, por lo general, es conveniente, solo estaba buscando una forma de buscar la pila de llamadas en la situación correcta. – rosscj2533

3

La mejor manera de depurar Javascript es usar Firebug, que incluye un depurador de Javascript completo.

Si está depurando en IE, puede usar Visual Web Developer Express (o cualquier otra edición de Visual Studio).
Si está depurando IE8, puede usar sus herramientas de desarrollador integradas, que incluyen un depurador.

Es posible obtener la pila de llamadas en Javascript; ver here.

3

¿Has mirado firebug - y un punto de interrupción. Si solo es para la depuración, entonces esto podría ser suficiente.

también - se puede echar un vistazo Here

20

en Firefox + Firebug y WebKit puede utilizar console.trace()

No muestra una alert() pero imprimir el stacktrace en la consola.

+0

exactamente lo que estaba buscando. Esto es especialmente útil si desea volcar la pila de llamadas mientras se carga la página. –

+0

esta debería ser la respuesta correcta – Ziarno

+0

¡Gracias! No sabía este truco. – kris

1

Esto le dará a todos la pila de llamadas funcionando bien para mí.

var y = 'arguments.callee.caller'; 
    while (eval(y) != undefined) { 
     stak += eval(y + '.toString()'); 
     y = y + '.caller'; 
    } 
    alert(stak); 
0

Para nodejs depuración, en el código de Visual Studio, a partir de v.1.14.2, es Ver-> Depuración (Ctrl + Shift + D)

Cuestiones relacionadas