2

我想检测 JavaScript 代码以“记录”全局变量的值。例如,我想知道特定变量foo在执行期间的所有值。日志记录不是问题。

实现这一点的最简单方法是什么?我正在考虑使用Rhino(Mozilla 创建的 Java 中的 JavaScript 实现)来生成AST并修改这个 AST。

4

7 回答 7

1

这可能是您正在寻找的:

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

在设置器中放一个日志,就是这样。当然,我不知道这实际上在哪里起作用,如果它必须是受信任的代码,或者任何网页,或者什么。

基于 John Resig 的代码,我将在调试代码中添加如下内容:

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

是不是更像?再一次,我没有测试它,这obj[variableName]条线对我来说看起来很递归......你会在这里告诉它是否有效吗?:)

此外,使用Firebug

console.dir(obj)

将让您在控制台中查看该对象的所有属性,而不是像使用log(). 并且还展开属性等等。便利。

于 2009-10-16T13:03:57.737 回答
1

如果您不限于 Rhino/Java,Johnson Ruby gem 将 Spidermonkey/Tracemonkey 解释器集成到 Ruby 中。它确实提供了对 AST 的访问。我没有尝试修改 AST;不确定这是否可能(从查看的代码中的名称来看,可能是这样)。

Johnson gem 位于 jbarnette 在 github 上的 Johnson 存储库中。(切换 id 的;Stackoverflow 不希望我在这一点上放置链接......)我最近添加了 tracemonkey 支持,它还没有集成到主源中。它在我(smparkes)在 github 上的 Johnson 存储库中。

于 2009-10-16T13:47:21.190 回答
0

Firebug(firefox 插件)具有日志记录功能,您可以将其写入控制台。比使用 alert("foo"); 好多了 为一切

示例日志语句:

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

有关更多信息,请参阅此帖子(包括更高级的用法)

于 2009-10-16T11:29:34.077 回答
0

我不知道通用解决方案或任何存在的东西,但只需将这些变量包装在处理 get/sets 和东西的日志类周围。

于 2009-10-16T12:25:29.050 回答
0

您可以使用 Dtrace:

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

于 2009-10-16T12:35:46.660 回答
0

您可以设置调试器;作为文档就绪事件的第一件事,只需逐步完成您的代码。

..弗雷德里克

于 2009-10-16T12:45:35.613 回答
0

使用 cvshead 版本的 Rhino,我检测了代码。

于 2009-11-05T11:00:41.337 回答