javascript 在 Javascript 中进入无限循环和递归调用时如何调试它?

Posted

技术标签:

【中文标题】javascript 在 Javascript 中进入无限循环和递归调用时如何调试它?【英文标题】:How to debug javascript when it goes into infinite loops and recursive calls in Javascript? 【发布时间】:2012-10-10 09:16:09 【问题描述】:

当您处于无限循环或递归调用中时,基本上浏览器会停止响应任何内容(在 Chrome 或 FF 上)。您看不到日志,无法进入调试器,甚至无法打开控制台本身。浏览器只是简单地冻结。这太烦人了。看来我只能坐在这里摸摸头了……任何人都可以阐明如何解决这个问题?

【问题讨论】:

在循环开始前在调试器中设置断点? @PhonicUK 有时是不可能的,例如滑块中只有一个值会导致无限循环,并且您不想在所有中间值处停止。 【参考方案1】:

您可以尝试的另一个技巧是打开 Chrome 中的 Web 开发人员工具,并在浏览器明显挂起时尝试​​点击暂停。然后它应该在当前执行的行处中断。通过一些步骤,您应该可以了解这一点。

假设您知道(或怀疑)发生无限循环的函数,您可以添加如下代码:

var calls = 0;
function iSuspectToBeLoopingInfititely() 
  calls += 1;
  if (calls > 100)  debugger; 

一旦方法被调用 100 次,这将停止 Chrome 中的 javascript 调试器。 注意:如果您确实打开了开发者工具窗口,Chrome 只会在 debugger; 调用时中断。

【讨论】:

【参考方案2】:

找到了另一种调试方式。在我的情况下,错误被捕获,因此没有错误记录到控制台。使用复选框 Pause on caught exceptions 找到了错误。您可以在 Sources 选项卡下的 den 开发工具中找到该选项。要显示和启用复选框,请单击最后一个图标:

启用此功能后,调试器会在每个捕获的异常处暂停。

【讨论】:

离题,不回答 OP 问题 @cdalxndr 为什么这应该是题外话?它可以在这种情况下提供帮助“浏览器停止响应任何东西(在 Chrome 或 FF 上)。你看不到日志,无法进入调试器......”实际上它在这种情况下帮助了我! OP 要求无限循环,而不是例外。无限循环不会抛出异常。 当循环中没有达到中止条件时,捕获的异常可能会导致无限循环! 如果捕获到的异常导致死循环,那就是糟糕的编程。捕获异常的重点是处理它们并修复无效的行为,这样它们就不会导致死循环!【参考方案3】:

我在 Chrome 中遇到问题,我会在浏览器窗口中看到“在调试器中暂停”,但看不到 Chrome 可能在哪里出现混淆,因为它处于循环中......在 Firefox 中,它认识到它花费了太长时间然后在 30 秒到 1 分钟后出现一个弹出窗口,说明文件和总行 # 它已冻结,这有助于进一步调试并在该区域周围设置断点。

【讨论】:

Chrome 对无限循环的处理非常糟糕,恕我直言,如果它在调试器打开时有一个,它不应该将开发者锁定。 这似乎很有用,虽然我很不幸! (?)它似乎没有进入 Firefox 中的任何无限循环,仅在 chrome 和 safari 中:/

以上是关于javascript 在 Javascript 中进入无限循环和递归调用时如何调试它?的主要内容,如果未能解决你的问题,请参考以下文章

javascript - 使用另一个函数中的变量 javascript - '今天未在对象中定义'

不懂急,请问javascript对象的问题?

在 Qml 和 javascript 中动态读取配置文件(javascript 文件或 json 文件)

javascript 在Javascript中捕获组

javascript 在Javascript中连接文本和变量

javascript 在javascript中搜索对象数组