0

Прервать выполнение бесконечного цикла в jsfiddle

12

Описание проблемы:

У меня возникла бесконечная петля в jsfiddle в Chrome, и единственный способ, который я знаю, — это закрыть вкладку. К сожалению, это означает, что я потеряю всю свою работу в текущем окне! Есть ли простой способ остановить бесконечно выполняющийся скрипт?

  1. У меня открыты инструменты разработчика, потому что я занимался отладкой.
  2. Я могу приостановить выполнение скрипта и пройтись по циклу шаг за шагом.
  3. Я не могу найти способ остановить выполнение скрипта.
  4. Я не могу изменить скрипт или переменные, чтобы остановить бесконечный цикл (поскольку выполнение скрипта происходит в iframe на другом домене, модификация данных в iframe с помощью JavaScript невозможна и вызывает исключение в консоли).

Все началось с того, что я решил изменить направление в своем цикле с

for (var c = 0; c <= 11; c++)

на

for (var c = 12; c > 0; c++)

Но, как вы видите выше, я забыл заменить c++ на c--.

Есть идеи? Я все еще держу вкладку открытой и надеюсь восстановить её без закрытия! 🙂

5 ответ(ов)

1

Чтобы сделать это без режима разработчика, выполните следующие шаги:

Для Windows:

  1. Откройте новую вкладку.
  2. Запустите Диспетчер задач, нажав Shift + Escape.
  3. Убейте задачу.
  4. Используйте кнопку «Назад» для закрытой вкладки (JSFiddle не запустит скрипт).
  5. Исправьте ошибку.
  6. Обновите страницу.

Для MacOS:

  1. Откройте Мониторинг системы.
  2. Убейте первый процесс "Google Chrome Helper (Renderer)". Скорее всего, это JSFiddle.
  3. Исправьте проблему.
  4. Запустите код.

Эти шаги помогут вам решить задачу без включения режима разработчика.

0

Включите режим разработчика, перейдите во вкладку "Ресурсы" и найдите ваш скрипт. Затем скопируйте и вставьте его в текстовый документ или новое окно. Если вы не можете найти скрипт в ресурсах, попробуйте выполнить поиск по переменной или строке кода, которую вы использовали.

0

Один из способов прерывания бесконечного цикла — это выбрасывание необработанного исключения, что остановит выполнение текущего стека вызовов. Чтобы сделать это:

  1. Приостановите отладчик.
  2. Найдите перспективное выражение внутри цикла, например, вызов функции: foo.bar(args).
  3. В консоли переопределите функцию так, чтобы она выбрасывала исключение: foo.bar=function(){throw 42;}.
  4. Возобновите выполнение отладчика.

Это сработало для меня. Хотя я этого не пробовал, но полагаю, что путем переопределения геттера или сеттера вы также можете использовать вышеописанный трюк для присваиваний и чтений, а не только для вызовов функций. Кроме того, если задать переменной значение undefined, это может привести к фатальной ошибке (и, таким образом, прервать цикл), если поле этой переменной используется в цикле. Например, delete foo.tab прервет foo.tab[42] или foo.tab.bar. Почему-то простая команда foo=undefined в консоли не сработает (возможно, она определяет переменную, локальную для окна консоли, с именем foo).

0

Запустите Process Explorer и завершите процесс Chrome, который загружает CPU на максимум. Это приведет к "срыву" страницы, и вы сможете загрузить её заново.

0

С той же проблемой столкнулся и я. Я открыл консоль JavaScript в приостановленном состоянии скрипта (приостановил его, используя инструменты разработчика). Затем я изменил значение переменной так, чтобы цикл while завершился.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь