Используя отладчик Javascript от WebInspector, как мне выйти из бесконечного цикла? - PullRequest
2 голосов
/ 19 декабря 2010

Я написал бесконечный цикл в моем коде JavaScript.Используя WebKit Web Inspector, как мне прекратить выполнение?Я должен выйти из Safari и снова открыть его (после изменения моего кода, конечно).

РЕДАКТИРОВАТЬ: Чтобы быть более конкретным, я ищу способ войти в процесс / поток выполнения цикла, чтобы увидеть почему цикл не заканчивается.Аналогия была бы в GDB, где я мог сделать ^ C и ворваться в процесс.Я не ищу способ убить мой веб-браузер.Я уже достаточно хорош в этом.

Ответы [ 4 ]

1 голос
/ 28 декабря 2010

Я не знаком с WebKit, но это звучит как распространенная проблема, которую я обычно отлаживаю следующим образом: объявлять целое число вне области цикла и увеличивать его для каждой итерации, а затем выдавать исключение при итерациичисло превышает максимально ожидаемое возможное количество итераций.Итак, в псевдокоде для устранения этой проблемы можно использовать что-то вроде следующего:

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

Я не думаю, что это достаточно конкретно, чтобы оправдать принятый ответ, но я надеюсь, что это поможет вамрешить вашу проблему.

0 голосов
/ 28 декабря 2010

Вы пробовали использовать F11? Это ключ для шага в: https://trac.webkit.org/wiki/WebInspector

0 голосов
/ 28 декабря 2010

При использовании Firefox (я знаю, что вопрос не определяет Firefox, но я просто добавляю это, в случае, если это кому-то помогает), Safari и Chrome, я обнаружил, что нет единого способа сломатьв бесконечный цикл, но есть способы настроить выполнение, чтобы разорвать в цикл, если вам нужно.Смотрите мой тестовый код ниже.

Firefox

Чрезвычайный мусор.Он просто стоял, вращая свою радугу.Мне пришлось его убить.

Safari

Приятная вещь в Safari - это то, что он в конечном итоге выдает диалоговое окно с вопросом, хотите ли вы остановиться.Ты должен сказать да.Затем нажмите command-option i, чтобы вызвать веб-инспектора.Должен появиться источник, сообщающий, что Javascript превысил время ожидания.Нажмите кнопку паузы справа вверху, затем обновите.Код будет перезагружен, теперь шаг за шагом: мне нравится использовать command-;, потому что он проходит через каждый вызов.Если у вас сложный код, вы можете никогда не дойти до конца.Не нажимайте continue (command-/), иначе вы вернетесь на круги своя.

Chrome

Самый полезный из трех.Если вы наивно загрузите код, он будет работать вечно.Но перед загрузкой страницы откройте веб-инспектор и выберите «Загружать ресурсы все время».Затем перезагрузите страницу.Пока страница пытается загрузить, вы можете нажать на сценарии и приостановить 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>
0 голосов
/ 19 декабря 2010

Вы пытались top посмотреть на дерево процессов? Найдите PID программы и затем введите kill -9 [PID].

...