4

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

我用 Python 有一个半生不熟的方法:使用 're' 来匹配 'function' 关键字——但它真的很原始(不处理注释等)。

我不是 ANTLR 方面的专家(离它很远):但是我可以多么容易地利用已经构建的 Javascript Parser 来执行此操作?(我们可以“挂钩”到标准 java 以在正确的位置动态创建我需要的代码吗?)

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

因此,例如,我需要转为:

function foo(bar) {
...
}

进入:

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

2 回答 2

5

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

请参阅我关于通过检测代码构建测试覆盖工具的论文。它描述了如何以非常一般的方式检测代码,使用源到源的程序转换,来做各种事情,比如你想做的事情。

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

你可以用 ANTLR 做这种事情,但它更笨拙;您已经按程序编写了转换,然后您必须从解析树重新生成源代码。这比看起来要难得多

于 2012-02-28T17:54:49.390 回答
3

您可以使用Google 的 Web Tracing Framework检测您的 JavaScript 代码。它提供检测功能

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

由于您想知道调用函数的参数,我可以向您推荐忒修斯。它提供了一个带有函数调用和参数的异步调用树。

下面是一个关于如何用忒修斯捕捉你的论点的例子:

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

你的论点被传入traceEnter并被traceExit保存。您可以在JavaScript 中检测 JavaScript中阅读有关它的更多信息。

于 2016-05-25T12:37:02.903 回答