【问题标题】:Using WebInspector's Javascript Debugger, how do I break out of an infinite loop?使用 WebInspector 的 Javascript 调试器,如何跳出无限循环?
【发布时间】:2011-05-27 18:41:40
【问题描述】:

我在我的 javascript 代码中编写了一个无限循环。使用 WebKit 的 Web Inspector,我如何终止执行?我必须退出 Safari 并重新打开它(当然是在更改我的代码之后)。

编辑:更具体地说,我正在寻找一种进入循环执行进程/线程的方法,以查看 为什么 循环没有终止。一个类比是在 GDB 中,我可以在其中执行 ^C 并进入该过程。我不是在寻找杀死我的网络浏览器的方法。我已经很擅长了。

【问题讨论】:

    标签: javascript webkit web-inspector


    【解决方案1】:

    我不熟悉WebKit,但这听起来像是一个常见的问题,我通常调试如下:在循环范围之外声明一个整数,并为每次迭代增加它,然后在迭代时抛出异常count 超过预期的最大可能迭代次数。因此,在伪代码中,可以使用如下代码来调试此问题:

    var iterations = 0;
    var greatestPossibleNumberOfValidIterations = 500;
    while(shouldLoopBooleanTest){
      iterations++;
      if(iterations>greatestPossibleNumberOfValidIterations){
         //do debugging/error handling
      }
    } 
    

    我不认为这足够具体以保证接受的答案,但我希望它可以帮助您解决问题。

    【讨论】:

    • 但这假设你知道无限循环在哪里。如果你知道它在哪里,你为什么要让它存在?
    • 不幸的是,这看起来是最好的选择。如果您的代码不是很大,您可以在每个循环中使用它,尽管这似乎是一个非常不理想的解决方案。我也希望可以强制 Javascript 在任何地方停止。
    • @javagamer,你可以通过包装循环逻辑和调试逻辑让它更好一点,所以你的api是差不多的。此外,您可以在 javascript 中引发异常。
    【解决方案2】:

    您是否尝试过top 查看进程树?找到程序的PID,然后输入kill -9 [PID]

    【讨论】:

    • 我会更具体地编辑我的问题,但这不是我正在寻找的解决方案:在 GDB 中,我可以“闯入”流程,然后逐步执行无限循环,我一边调试一边调试它。我想要类似的东西在这里。使用 top 杀死和我上面的解决方案相同(即杀死 Safari)
    【解决方案3】:

    您是否尝试过使用 F11?这是进入的关键:https://trac.webkit.org/wiki/WebInspector

    【讨论】:

      【解决方案4】:

      在使用 Firefox(我知道问题没有指定 Firefox,但我只是把它扔进去,以防它对某人有帮助)、Safari 和 Chrome,我发现没有一致的方法来打破进入一个无限循环,但是如果需要,有一些方法可以设置执行以进入一个循环。请参阅下面的测试代码。

      火狐

      彻头彻尾的垃圾。它只是站在那里旋转它的彩虹。我必须杀了它。

      Safari

      Safari 的好处在于它最终会弹出一个对话框,询问您是否要停止。你应该说是的。然后点击command-option i 调出Web Inspector。源应该弹出说 Javascript 超过了超时。点击右侧顶部的暂停按钮,然后刷新。代码将重新加载,现在逐步执行:我喜欢使用command-;,因为它会逐步执行每个调用。如果你有复杂的代码,你可能永远不会走到最后。不过不要点击continue (command-/),否则你会回到第一格。

      三者中最有用的。如果您天真地加载代码,它将永远持续下去。但是,在加载页面之前,打开 Web Inspector 并选择“始终加载资源”。然后重新加载页面。在页面尝试加载时,您可以单击脚本并在运行时暂停 Javascript。这就是我一直在寻找的。​​p>

      代码

      <html>
        <head></head>
        <body onload="TEST.forever.loop()">
          Nothing
        </body>
        <script type="text/javascript">
          TEST = {};
          TEST.forever = {
            loop : function() {
              var i = 0;
              while (i >= 0) {
                i++;
              }
            }
          };
        </script>
      </html>
      

      【讨论】:

      • 只为 Opera 添加:打开调试器 (dragonfly) Ctrl-Shift-I,然后选择“Sources”。导航到循环页面,然后按“-pause”按钮(即像“但更大”)然后调试器停止在循环中。在停止的情况下使用调用堆栈,例如在循环内的 jquery 调用中。
      猜你喜欢
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2014-09-11
      相关资源
      最近更新 更多