如何在浏览器中调试内存泄漏、无限循环和执行Javascript?

如何在浏览器中调试内存泄漏、无限循环和执行Javascript?,javascript,debugging,Javascript,Debugging,在浏览器中检查javascript中无限循环的推荐方法是什么?假设我打开了Chrome,它崩溃了,有没有办法找到断点或以某种方式找到发生故障的地方 然后我想知道,我如何在浏览器中看到一个正在运行的脚本列表(比如说,我忘记了某个计时器正在运行,它正在减慢速度)?最好使用Chrome/Safari,但Firefox也可以 我一直在使用element inspector/控制台,只是还没有找到有效调试这三件事的方法 谢谢 一,。内存泄漏 (即) (即) (FF) 2.有限环 我不太明白在复杂的无限

在浏览器中检查javascript中无限循环的推荐方法是什么?假设我打开了Chrome,它崩溃了,有没有办法找到断点或以某种方式找到发生故障的地方

然后我想知道,我如何在浏览器中看到一个正在运行的脚本列表(比如说,我忘记了某个计时器正在运行,它正在减慢速度)?最好使用Chrome/Safari,但Firefox也可以

我一直在使用element inspector/控制台,只是还没有找到有效调试这三件事的方法

谢谢

一,。内存泄漏
  • (即)
  • (即)
  • (FF)
2.有限环 我不太明白在复杂的无限循环扩展到数百个函数的情况下,浏览器能给你指出什么。当然,我希望浏览器能够精确定位一些简单的循环,比如一些函数在15秒内不会返回。但至少我们有一些东西,浏览器告诉您a)脚本运行缓慢,b)调用了哪些函数以及每个函数花费了多少时间。此外,您还可以设置断点并观察它一步一步地运行

3.监测计时器和时间间隔 打开WebKit的时间线面板,点击“录制”,并监控您可能想要了解的关于每个计时器和间隔的所有信息。 如果您不使用WebKit,您可以自己编写一些简单的代码:

_setTimeout = setTimeout
setTimeout = function(fn, time) {
  var timeout = _setTimeout(function() {
    console.log('Timeout #' + timeout + ' fired on ' + (fn.name || 'anonymous'))
    fn()
  }, time)
  return timeout
}
通常我只是在触发超时/间隔时使document.title闪烁

4.通用代码性能
  • 谷歌浏览器
  • 对于Firefox
  • -一个小信息框,可帮助您监控FPS和内存分配

对于使浏览器崩溃的脚本,您可以在代码崩溃之前在其任何位置插入断点。然后手动一步一步地检查所有代码,直到崩溃。如果无法在浏览器崩溃之前插入断点,可以在代码中的某个位置添加“debugger;”语句。这基本上是在代码中的该点插入断点

查看从JS运行的内容的一种方法是对其进行概要分析。所有的开发工具都带有一个分析器。只需在页面加载后对代码进行几秒钟的评测,就可以让您大致了解仍在运行的代码。如果您使用的是jQuery之类的库,您将看到许多内部jQuery函数和一些您自己的函数。查看占用最多运行时间(每次调用)的函数,并尽量减少它们的使用,因为它们的成本最高


如果在“非线程”JS中有一个无限循环,那么页面将根本无法完全加载。Firefox应该告诉您加载脚本需要很长时间,并让您调试它(这会告诉您它在哪里)。对于“线程化”JS(通过回调或setTimeout运行的JS),您可以使用探查器跟踪它们

+1用于覆盖
setTimeout
。如果将
console.log
更改为
console.error
,那么每次调用都会得到堆栈跟踪!假设您的浏览器(就像Chrome一样)可以跨异步调用跟踪堆栈。