我需要加载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+"]");
...
}
答案 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被传递到traceEnter
和traceExit
以保存。您可以在Instrumenting JavaScript in JavaScript上了解更多相关信息。