使用WebInspector的Javascript调试器,如何打破无限循环?

时间:2010-12-19 05:58:32

标签: javascript webkit web-inspector

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

编辑:更具体地说,我正在寻找一种方法来进入循环执行进程/线程,看看为什么循环没有终止。类比将在GDB中我可以做^ C并进入流程。我不是在想办法杀死我的网络浏览器。我已经相当擅长。

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

火狐

垃圾桶。它只是站在那里旋转它的彩虹。我不得不杀了它。

Safari浏览器

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

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

代码

<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>