Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以在不放置断点的情况下记录JavaScript堆栈跟踪?_Javascript_Debugging_Stack Trace - Fatal编程技术网

有没有一种方法可以在不放置断点的情况下记录JavaScript堆栈跟踪?

有没有一种方法可以在不放置断点的情况下记录JavaScript堆栈跟踪?,javascript,debugging,stack-trace,Javascript,Debugging,Stack Trace,我希望能够在给定的JS应用程序上执行操作,然后简单地获取所有调用函数的大型日志。这在Chrome中是可能的,但前提是在某个地方设置断点。我的问题是,当我对一个给定的网站进行反向工程(当然,只是为了自学目的)时,我常常要花很多时间才能弄清楚从哪里开始。类似的东西将极大地帮助我,因为我不再需要在代码中搜索,而是只需执行一个用户操作,然后抓取堆栈日志 我认为应该有一种方法来截取(或包装)每个函数调用,以便在调用函数之前将其转储到日志中。在Firebug中,您可以使用探查器记录调用的每个函数。用于以编程

我希望能够在给定的JS应用程序上执行操作,然后简单地获取所有调用函数的大型日志。这在Chrome中是可能的,但前提是在某个地方设置断点。我的问题是,当我对一个给定的网站进行反向工程(当然,只是为了自学目的)时,我常常要花很多时间才能弄清楚从哪里开始。类似的东西将极大地帮助我,因为我不再需要在代码中搜索,而是只需执行一个用户操作,然后抓取堆栈日志


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

在Firebug中,您可以使用探查器记录调用的每个函数。用于以编程方式触发它

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

要记录特定对象的方法,可以按如下方式覆盖它们:

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;
            };
        })();
    }
}

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

试试这篇文章: 或本帖:


而且,可能是这样的:

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

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


使用bookmarklets,加载页面后,可以执行一些自定义javascript。因此,您可以在那里做的是,用包含日志的同一个函数覆盖您想要观察的函数方法(因此只需复制并粘贴该函数,并在其中添加一些console.log)。这实际上甚至适用于本机js函数。

我认为您不能包装任何
func()
调用,因为它使用内部
[[Call]]
方法,但如果是,我很想知道。分析很好,甚至Webkit也有,但是,我不能真正以执行它们的方式获得结果,而是按照它们在工作应用程序上的性能开销进行排序。也许我会尝试一下这段代码片段,包装一些真正通用的构造函数,比如Object,或者至少在层次结构的更高层的某个地方