需要仪器Javascript:函数调用/ args - ANTLR?

时间:2012-02-28 17:25:35

标签: javascript parsing antlr inject

我需要加载Javascript并自动检测它:具体来说,我想记录对函数的每次调用,并提供调用该函数的参数列表。

我用Python做了一个半生不熟的方法:使用're'匹配'function'关键字 - 但它确实非常原始(不处理评论等等)。

我不是ANTRL的专家(离它很远)但是我可以轻松利用已经构建的Javascript Parser来执行此操作吗? (我们可以“挂钩”标准java来动态创建我需要的代码吗?)

顺便说一句:实际的日志记录将(可能)用log4javascript完成;但我也可能只是使用“警报” - 很难让代码注入工作....

因此,例如,我需要改变:

function foo(bar) {
...
}

成:

function foo(bar) {
alert("<scriptname.js>: foo was called with arguments: [bar="+bar+"]");
...
}

2 个答案:

答案 0 :(得分:5)

正则表达式不会这样做。如果您想要可靠地检测代码,则需要可靠的解析器和可信赖的机制来插入检测。

请参阅building test coverage tools by instrumenting code上的论文。它描述了如何使用源到源程序转换以非常通用的方式检测代码,以执行诸如您想要执行的操作之类的事情。

我的公司以这种方式建立了一系列强大的测试覆盖工具。

你可以用ANTLR做这件事,但它很笨拙;你已经在程序上编写了转换,然后你必须从解析树重新生成源代码。那是a lot harder than it looks

答案 1 :(得分:2)

您可以使用Google's Web Tracing Framework检测JavaScript代码。它提供instrumenting functions

还有Violin,这是一个用于检测JavaScript应用程序的实验。

如果您想知道调用函数的参数,我可以向您推荐Theseus。它提供了一个带有函数调用和参数的异步调用树。

以下是如何使用Theseus捕获参数的示例:

function foo(bar) {
  theseus.traceEnter("function-id", "...");
  try {
    // original code
  } catch (error) {
    theseus.traceException("function-id", error);
  } finally {
    theseus.traceExit("function-id", "...");
  }
}

您的arguments被传递到traceEntertraceExit以保存。您可以在Instrumenting JavaScript in JavaScript上了解更多相关信息。