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

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

【问题讨论】:

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

标签: javascript debugging


【解决方案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 中:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2017-10-10
    相关资源
    最近更新 更多