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

use*_*232 8 javascript debugging stack-trace

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

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

use*_*621 0

在 Firebug 中,您可以使用探查器来记录每个调用的函数。使用console.profile()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;
            };
        })();
    }
}
Run Code Online (Sandbox Code Playgroud)