2011-10-27 11 views
35

Similar a otras preguntas aquí, like this one.depuración de JavaScript: ¿hay alguna manera de romper con un cambio de valor variable?

¿Hay alguna forma de romper con el cambio de un valor de variable en cualquier depurador de JavaScript? (como IE Developer Tools, Visual Studio o Firebug?)

Supongo que es algo así como una "variable de observación", pero quiero poder ver la pila de llamadas y ponerla en pausa cuando ocurra realmente el cambio en la variable.

Un enfoque alternativo podría ser anular la configuración del valor con un setter personalizado, y poner un punto de interrupción en eso, pero lamentablemente eso no funcionará para IE afaik.

ACTUALIZACIÓN Parece que este tipo de comportamiento está disponible al menos para el código no administrado written in C++ Así que pensé que tal vez un motor de Javascript escrito en C++ (V8 de Google) podría tener algo similar, pero que no parecen tener lo que quiero tampoco.

+0

Manera simplista de romper totalmente el hilo es poner una alerta, sí molesto pero puedes alertar lo que quieras, tu variable, una cadena, lo que sea realmente. Y si usa algo como Firebug y tiene registros en su código, entonces puede recorrer su programa bastante fácilmente con alertas. – Ryan

+4

El problema es que no sé dónde se cambia la variable. Podría suceder en otro archivo (o uno de varios). No voy a ensuciar mi código con declaraciones de alerta en un intento de encontrar dónde cambia. En ese punto, podría pasar el código línea por línea con el depurador. Gracias sin embargo. – user420667

Respuesta

16

Ni siquiera necesita un IDE - se puede utilizar "Object.watch()":

Object.Watch Tutorial

Si utiliza cualquier depurador, recomiendo encarecidamente Firebug. Para todas sus Javascript, HTML y CSS necesita :-):

http://getfirebug.com/javascript

+4

+1 b/c Me imagino que esto funcionaría. Sin embargo, no creo que sea compatible con una gran cantidad de navegador atm, b/c es javascript 1.8.6 no estándar: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/watch – user420667

+0

Haven ' Pude probarlo, pero como el enlace anterior especifica el uso de métodos setter/getter, puede ser un mejor enfoque: https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects#Defining_getters_and_setters – GuruM

+8

Estamos en 2013 y todavía estoy esperando el navegador compatible con Object.watch() ... –

9

estoy teniendo éxito con esta biblioteca en Chrome y se ve a apoyar todos los principales navegadores.

https://gist.github.com/eligrey/384583

basta con incluir el archivo .js, a continuación, llamar:

yourObject.watch('someProperty', function() { 
    doWhatYouWant(); 
    debugger; 
    console.write('this too'); 
    alert('Object Changed'); //etc 
}); 
+0

esto se ve bien. también http://stackoverflow.com/a/1848414/420667. Gracias. – user420667

+0

No funcionó para mí con Chrome. Primero ejecuté el JavaScript Gist. Luego ejecuté 'watch (myObject, 'propertyName', function() {console.log ('changed!');});'. Aunque el valor de la propiedad estaba cambiando, el mensaje console.log nunca llegó. – Joncom

+0

Comprueba si hay un error en la consola cuando llamas a watch(). La biblioteca definitivamente funciona, así que supongo que no se está cargando o que su llamada no está teniendo éxito. – rainabba

-2

No sé si he entendido bien su pregunta. Si desea ver una expresión y detenerse cuando alcanza cierto valor mientras está en una sesión de depuración de js en Herramientas para desarrolladores de Chrome, es bastante trivial.

Simplemente puede colocar un punto de interrupción en la línea donde está el valor que desea verificar, luego haga clic con el botón derecho del mouse y seleccione "Editar punto de interrupción ...". Aparecerá un cuadro de diálogo solicitando una expresión, donde la ejecución se detendrá cuando su valor sea verdadero.

Por ejemplo, digamos que usted tiene un bucle y va a agregar una unidad a una variable dentro de ella y desea detener la ejecución cuando la variable es igual a 3. La expresión en bucle se vería así:

n = i++;

Debe establecer su punto de interrupción en esa línea y la expresión para mirar (después de lo indicado por "Editar punto de interrupción ...") sería n == 3. Cuando ejecuta su código, se detendrá allí cuando su variable alcance ese valor.

Notará que su condición está configurada porque su punto de interrupción cambia a naranja en lugar de azul.

+1

Si en una línea adyacente tienes n = i ++ (entonces ahora tienes un bucle donde i se incrementa dos veces) y no pones el punto de interrupción en la línea adyacente, ¿se detendrá cuando n pase 3 en la línea adyacente? Si no, esto no haría lo que estaba buscando. Alternativamente, si n era una propiedad de un objeto y podría establecerse en muchos lugares, ¿bastaría con poner el reloj en un setter de n para cubrir todas las configuraciones de n en todos los archivos? – user420667

+0

No he probado ese ejemplo preciso, pero que yo sepa, yo diría que sí, ya que la expresión para evaluar en el diálogo "Editar punto de interrupción ..." no necesita ser la misma que el código en la línea donde está el punto de corte colocado en. No necesita ser un "valor var var igual" tampoco; puede poner, por ejemplo, algo como 'i + j <= k * n'. Incluso puedes comentar la expresión para deshabilitarla. Funciona igual que poner 'if (n == 3) {dummy = true}' dentro de tu código y ubicar tu punto de interrupción en la línea 'dummy', pero simplemente mantenerlo en el" limbo "de los diálogos de punto de interrupción. Inténtalo tú mismo para confirmar;) – Pere

+0

Creo que la expresión solo se evalúa cuando se golpea el punto de interrupción. Entonces, en el ejemplo de dos líneas de n = i ++ con un punto de corte solo en uno de ellos, su punto de corte de n == 3 podría no ser afectado dependiendo de la línea en la que coloque el punto de interrupción y su valor inicial de i. – user420667

Cuestiones relacionadas