Me gustaría instrumentar el código JavaScript para "registrar" valores de variables globales. Por ejemplo, me gustaría saber todos los valores que una variable particular foo tuvo durante la ejecución. El registro no es el problema.

¿Cuál sería la forma más fácil de implementar esto? Estaba pensando en usar Rhino (la implementación de JavaScript en Java creada por Mozilla) para generar un AST y modificar este AST.

2
Frank Groeneveld 16 oct. 2009 a las 15:23

7 respuestas

La mejor respuesta

Usando la versión cvshead de Rhino, instrumenté el código.

0
Frank Groeneveld 5 nov. 2009 a las 11:00

Puede configurar el depurador; como primera cosa en el evento de documento listo y solo paso a paso a través de su código.

..fredrik

0
fredrik 16 oct. 2009 a las 12:45

Puedes usar Dtrace:

http://opensolaris.org/os/project/mozilla-dtrace/

0
a2800276 16 oct. 2009 a las 12:35

No tengo idea de una solución genérica ni de nada que exista, sino que simplemente envolver esas variables alrededor de una clase de registro que trata con get / sets y esas cosas.

0
Daniel Goldberg 16 oct. 2009 a las 12:25

Firebug (complemento para firefox) tiene una función de registro, en la que puede escribir en una consola. Mucho mejor que usar alert ("foo"); para todo

Declaración de registro de ejemplo:

console.log("foo="+foo);

Consulte esta publicación para más información (incluido el uso más avanzado)

0
wiifm 16 oct. 2009 a las 11:29

Esto puede ser lo que estás buscando:

http://ejohn.org/blog/javascript-getters-and-setters/

Pon un registro en el setter y listo. Por supuesto, no sé dónde funciona esto realmente, si debe ser un código confiable, o cualquier página web, o qué.

Basado en el código de John Resig, agregaría a mi código de depuración algo como:

var placeLoggerInSetter = function(variableName, obj){ //obj may be window
    obj.__defineSetter__(variableName, function(val){
         console.log(val); //log whatever here
         obj[variableName] = val;
    });
}

var something = 0;
placeLoggerInSetter("something", window);
something = 1;
//out goes "1" in the console
something = 2
//out goes "2" in the console

¿Es eso más parecido? Nuevamente, no lo probé y la línea obj[variableName] me parece bastante recursiva ... ¿me dirá si funciona? :)

Además, con Firebug,

console.dir(obj)

Le permitirá ver todas las propiedades de ese objeto en la consola, en lugar de convertirlo en una cadena como con log(). Y también expandir las propiedades y así sucesivamente. Práctico.

1
Peter Mortensen 29 nov. 2010 a las 19:16

Si no está restringido a Rhino / Java, la gema Johnson Ruby integra el intérprete Spidermonkey / Tracemonkey en Ruby. Proporciona acceso a la AST. No he intentado modificar el AST; no estoy seguro de si eso es posible (podría serlo, a juzgar por los nombres en el código al mirarlo).

La gema Johnson está en el repositorio Johnson de jbarnette en github. (Cambiar id; Stackoverflow no quiere que ponga enlaces en este punto ...) Agregué recientemente el soporte de tracemonkey y aún no está integrado en la fuente maestra. Está en el repositorio Johnson de mi (smparkes) en github.

1
smparkes 16 oct. 2009 a las 13:47