有没有办法在不放置断点的情况下记录JavaScript堆栈跟踪?

时间:2011-09-17 11:09:58

标签: javascript debugging stack-trace

我希望能够对给定的JS应用程序执行操作,然后只需获取已调用的所有函数的大型日志。这在Chrome中是可行的,但只有在某处放置断点时才有可能。我的问题是,当我对一个给定的网站进行逆向工程时(当然,仅用于自学教学目的),通常需要花费大量时间来确定从哪里开始。这样的事情会对我有很大的帮助,因为我不再需要在代码中搜索,而是我会做一个用户操作,然后抓住堆栈日志。

我认为应该有一种拦截(或包装)每个函数调用的方法,以便在调用函数之前将其转储到日志中。

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

在Firebug中,您可以使用分析器记录所有调用的函数。使用console.profile() and console.profileEnd()以编程方式触发它。

但是,这不会给你正确的堆栈跟踪。 (你确定那是你想要的吗?)

要记录特定对象的方法,可以像这样覆盖它们:

for (var key in obj) {
    if (typeof obj[key] == 'function') {
        (function(){
            var origFun = obj[key];
            obj[key] = function () {
                var result = origFun.apply(this, arguments);
                console.log('call to method', key, 'with arguments', arguments,' - Result:', result);
                // console.trace(); // for a trace with every call
                return result;
            };
        })();
    }
}

答案 2 :(得分:0)

也许面向方面编程(AOP)可以提供答案。我刚刚发现aspectJS可以帮助拦截和记录函数调用

答案 3 :(得分:0)

您可以使用dynatrace。 Dynatrace是IE和FF的分析工具。 Dynatrace可以在应用程序运行时监控它,然后为您提供所有发生的事件的时间表。在时间轴中,有代表javascript活动的块。您可以右键单击它(purepath),然后遍历整个调用堆栈。您可以将其导出到excel或其他如果需要。 您可以在代码中添加标记,这些标记将显示在时间轴和purepath中: if(typeof(_dt_addMark)!=“undefined”)_ dt_addMark('MyCustomTimerName');

或者,如果您只想找到“拦截(或包装)每个函数调用的方法”, 如果你使用的是真正的webbapp(单载javascript应用程序),那么有一种低技术解决方案: 书签小

使用bookmarklet,一旦加载了页面,就可以执行一些自定义的javascript。那么你可以做的是,使用包含日志记录的相同函数覆盖你想要观察的函数方法(所以只需复制并粘贴函数,并在其中添加一些console.log)。这实际上甚至适用于本机js函数。