需要插入Javascript:函数调用/args-ANTLR

Need to instrument Javascript: function calls / args - ANTLR?

本文关键字:函数调用 args-ANTLR Javascript 插入      更新时间:2023-09-26

我需要加载Javascript并自动检测它:特别是,我想记录对函数的每次调用,并提供调用函数时使用的参数列表。

我用Python有一种半生不熟的方法:使用"re"来匹配"function"关键字,但它确实非常原始(不处理注释等)。

我不是ANTLR的专家(远非如此):但我能用一个已经构建的Javascript Parser来执行这项工作有多容易?(我们能"挂钩"到标准java,在正确的位置动态创建我需要的代码吗?)

BTW:实际的日志记录将(可能)使用log4javascript完成;但我也可能只是使用"警报"——最困难的是让代码注入工作。。。。

例如,我需要把一些东西变成:

function foo(bar) {
...
}

进入:

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

正则表达式做不到。如果你想可靠地插入代码,你需要可靠的解析器和可靠的插入机制。

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

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

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

您可以使用Google的Web跟踪框架来插入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", "...");
  }
}

您的参数将被传递到要保存的traceEntertraceExit中。您可以在JavaScript中的Instrumenting JavaScript上阅读更多关于它的信息。