如何debugging挂起浏览器的JavaScript?

我正在研究一个相当大的丰富的网页JavaScript应用程序。 出于某种原因,最近的更改导致它随机挂起浏览器。

我怎样才能缩小问题所在? 由于浏览器无响应,我没有看到任何错误,并且不能使用FireBug Break on next

您应该使用debugging控制台日志 ,而不是将您的代码注释掉。

您应该使用大多数现代浏览器提供的console.log()function,或者如果使用不支持的浏览器,则可以对其进行仿真。

每次调用console.log('sometext') ,浏览器的debugging控制台中的日志条目将使用指定的文本创build,通常后跟实际时间。

您应该在应用程序stream的每个关键部分之前设置一个日志条目,然后越来越多,直到find没有被调用的日志。 这意味着该日志之前的代码挂在浏览器。

您还可以使用附加的function编写自己的个人日志function,例如某些特定variables的状态或包含程序stream程的更详细方面的对象等。

 console.log('step 1'); while(1) {} console.log('step 2'); 

无限循环将暂停程序,但是在程序暂停之前,仍然可以看到logging了程序stream的控制台日志。

所以在这个例子中,你不会在控制台日志中看到“第2步”,但是你会看到“第1步”。 这意味着程序在步骤1和步骤2之间暂停。

然后,您可以在两个步骤之间的代码中添加其他控制台日志,以深入查找问题,直到find它。

你可以添加debugger; 在您的JS代码的任何地方手动设置断点。 它会暂停执行,并允许您恢复/检查代码(Firebug / FF)。

Firebug Wiki页面: http : //getfirebug.com/wiki/index.php/Debugger;_keyword

要隔离问题,您可以先删除/禁用/注释代码的不同部分,直到您将代码范围缩小到可以让您find错误的一小部分。 另一种可能性是查看您的源代码pipe理签入历史logging,了解最近提交的不同更改。 希望你能理解问题的来源。

我很惊讶,这还没有得到妥善的回答,而且投票最多的答案基本上是“把控制台日志放在任何地方,直到你找出来”,这不是一个真正的解决scheme,特别是对于更大的应用程序,除非你真的想要花费所有的时间复制粘贴“控制台日志”。

无论如何,所有你需要的是debugger; 有人已经提到这个,但没有真正解释如何使用它:

在铬(和大多数其他浏览器), debugger; 将暂停执行,带你到开发控制台,并向您显示当前正在执行的代码在左边,堆栈跟踪在右边。 在控制台的右上angular有一些像button的箭头。 第一个是“简历脚本执行”。 我们想要的是下一个“跨越下一个函数调用”。

基本上,所有你需要做的就是在你的代码的任何地方放一个debugging器,在你知道这个页面还没有被冻结的地方,然后运行它,然后反复点击“step over next function call”,这看起来像一个箭头跳过一个圈子。 它将一行一行,通过调用脚本,通过脚本的执行,直到它挂起/陷入无限循环。 此时,您将能够准确查看代码卡住的位置,以及当前位于范围内的所有variables/值,这将有助于您理解脚本被卡住的原因。

我只是在试图find一些相当复杂的JS的挂环,我正在使用这种方法在大约30秒内find它。

安装谷歌浏览器 ,进入你的页面,按f12 ,开发者控制台将popup。 然后select脚本button,然后从控制台左上angular的下拉列表中select您的脚本 (例如:myScript.js)。 然后点击第一行(或者你认为没有挂起的那一行),就会出现一个断点 。 在javascript到达你的断点后,点击控制台右上angular的button之一(你会看到一个button像暂停符号,然后其他4个button)。 按下2ºbutton (或暂停后button跳过)或3ºbutton(步入)。 把鼠标放在button上,他们会向你解释他们的意思。 然后你会像这样去代码,直到它挂起,然后你可以更好地debugging它。

谷歌Chromedebugging器比萤火虫更好,速度更快。 我从萤火虫做出了改变,这真的太棒了! ;)

今天的浏览器Firefox / Seamonkey(Ctrl-Shift-I / Debugger / PAUSE-Icon),Chrome,…通常有一个内置的JSdebugging器,随时都可以使用PAUSEbutton。 只需在循环/ CPU密集型页面上点击,最有可能的“调用堆栈”类窗格将指出您的问题 – 准备好进一步检查…

根据我的经验,导致浏览器无响应的问题通常是无限循环或类似的问题。

作为一个起点,调查你的循环愚蠢的东西,不要增加你以后依赖的东西。

正如之前的海报所说,除此之外,注释掉一些代码来隔离这个问题。 你可以使用分而治之的方法,接近字面地注释JS的一半,如果它与另一个错误一起工作,你可能find了正确的位!

然后把它分成两半等,直到find罪魁祸首。

我知道这是很原始的,但是我喜欢用'alert'来散布我的js代码,以便在发生问题之前查看代码的运行距离。 如果警报窗口太烦人,你可能会设置一个textarea你可以附加日志:

 <textarea id='txtLog' ...></textarea> <script> ... function log(str) { $('#txtLog').append(str + '\n'); } log("some message, like 'Executing Step #2'..."); ... </script> 

我知道这个问题是旧的,但在VS2013,你可以按下暂停button,并得到一个完整的JS堆栈跟踪。 这让我疯狂,因为循环里面有angular,所以我不能真正把警报,断点等,因为我不知道把它们放在哪里。 我不知道它是否适用于免费快递版本,但是值得一试。

我也读过,Chrome有一个暂停function,所以这可能是一个select,但我没有尝试过自己。

我认为你可以像这样使用控制台日志

 console.log(new Date() + " started Function Name or block of lines from # to #"); // functions or few lines of code console.log(new Date() + " finished Function Name or block of lines from # to #") 

在运行你的网页的最后,你可以确定在执行期间花费那么多时间的区域,b