当我在 RUNTIME 与基于 AJAX 的应用程序交互时,我希望控制台能显示出它调用的所有函数。(所以没有堆栈跟踪、断点、分析或任何东西)
举个例子,假设我按下了页面上的一个按钮,我希望它返回所有的函数:
所以我会在控制台中看到类似这样的内容(当我按下按钮时):
1. button1Clicked();
2. calculating();
3. printingResults();
这基本上意味着button 1Clicked()调用了calculating(),而calculating()调用了printingResults()
有没有实用程序,插件,浏览器,或者语言中的某种方式可以做到这一点?顺便说一句,我用的是谷歌浏览器。
p.s和否我不想逐一查看每个函数并添加一个"console.log("inside function X")"
B/c,这太麻烦了
p. p. s作为一个额外的好处,我希望看到参数也传递到函数中,但也许这是推动它。:〉
9条答案
按热度按时间5jdjgkvh1#
我想不出一个很好的方法来全局拦截所有函数调用以插入日志记录(尽管在下面的更新部分有一个不错的解决方案)。
相反,只给你关心的特定名称空间中的函数添加日志记录,你可以用下面的设置代码做到这一点:
然后,对于您想要添加日志记录的任何名称空间对象,只需调用:
这里有一把小提琴来看看它的运作。
请注意,您可以调用
functionLogger.addLoggingToNamespace(window);
,在调用时为所有全局函数添加日志记录。此外,如果您确实需要,您可以遍历树以找到任何函数并相应地更新它们。此方法的一个缺点是它只适用于当时存在的函数。因此,它仍然不是最好的解决方案。但这比手工添加日志记录语句要少得多:)qyzbxkaa2#
这就是所谓的profiling,Chrome和Firebug都内置了这个功能。在Chrome developer Tools中,进入profiles选项卡,点击record(圈)按钮。执行 AJAX ,在响应后,再次点击record按钮停止。profiling的结果将出现在右侧窗格中。
注意,这会给予你所有的东西,所以如果你使用像jQuery这样的库,绝大多数的函数调用对你来说都是垃圾,我已经试过几次了,我发现做
console.log('inside <method>')
的事情要有帮助得多。dgtucam13#
我刚发现你可以用
console.trace()
tjjdgumg4#
也许您可以让JavaScript为您完成一些添加console.log的工作:
Adding console.log to every function automatically
此外,这个博客由保罗爱尔兰可能会有所帮助:
http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
它包含一些专门针对日志参数的JavaScript的链接:
http://pastie.org/1033665
d7v8vwbk5#
给予一下diyism_trace_for_javascript.htm:
https://code.google.com/p/diyism-trace/downloads/list
在chrome或firefox的控制台选项卡中查看日志
kdfy810k6#
作为Briguy37解决方案的一个变体,我编写了一个在每个方法之前接受函数调用的解决方案。它还可以与ECMAScript 6类一起工作,其中的方法不是由for...in枚举的。我用它来修改对象原型,为我的对象的所有新示例添加日志记录。
5n0oy7gb7#
让我向你抛出第三个解决方案:* 无所不知的调试器 *。
请注意,所有其他答案都提供了两种解决方案:
这就是为什么我编写了Dbux-一个VSCode扩展,它提供了一个全知的调试器,包括动态执行分析工具、代码注解和一个完整的动态调用图可视化工具,旨在帮助开发人员理解和调试程序。
一些例子-
fibonacci(6)
的调用图:**4c8rllxm8#
您可以在putout code transformer的帮助下跟踪函数调用。
Plugin
的外观如下:让我们假设这是您想要跟踪的代码:
以下是一个完整的画面:
如果将已处理的源代码另存为
trace.js
并使用node运行它,则将具有:有putout issue related to tracing functions。
wwtsj6pe9#
我使用了@Briguy37的解决方案,但做了一些改进。在我的例子中,我不想跟踪某些库中的函数,所以我添加了一些代码来排除它们。下面是它的使用方法:
示例:
下面是我添加到@Briguy37解决方案中的代码:
我不得不修改@Briguy37的addLoggingToNamespace方法,以考虑到excludedFunctions散列: