Прервать выполнение бесконечного цикла в jsfiddle
Описание проблемы:
У меня возникла бесконечная петля в jsfiddle в Chrome, и единственный способ, который я знаю, — это закрыть вкладку. К сожалению, это означает, что я потеряю всю свою работу в текущем окне! Есть ли простой способ остановить бесконечно выполняющийся скрипт?
- У меня открыты инструменты разработчика, потому что я занимался отладкой.
- Я могу приостановить выполнение скрипта и пройтись по циклу шаг за шагом.
- Я не могу найти способ остановить выполнение скрипта.
- Я не могу изменить скрипт или переменные, чтобы остановить бесконечный цикл (поскольку выполнение скрипта происходит в iframe на другом домене, модификация данных в iframe с помощью JavaScript невозможна и вызывает исключение в консоли).
Все началось с того, что я решил изменить направление в своем цикле с
for (var c = 0; c <= 11; c++)
на
for (var c = 12; c > 0; c++)
Но, как вы видите выше, я забыл заменить c++
на c--
.
Есть идеи? Я все еще держу вкладку открытой и надеюсь восстановить её без закрытия! 🙂
5 ответ(ов)
Чтобы сделать это без режима разработчика, выполните следующие шаги:
Для Windows:
- Откройте новую вкладку.
- Запустите Диспетчер задач, нажав
Shift + Escape
. - Убейте задачу.
- Используйте кнопку «Назад» для закрытой вкладки (JSFiddle не запустит скрипт).
- Исправьте ошибку.
- Обновите страницу.
Для MacOS:
- Откройте Мониторинг системы.
- Убейте первый процесс "Google Chrome Helper (Renderer)". Скорее всего, это JSFiddle.
- Исправьте проблему.
- Запустите код.
Эти шаги помогут вам решить задачу без включения режима разработчика.
Включите режим разработчика, перейдите во вкладку "Ресурсы" и найдите ваш скрипт. Затем скопируйте и вставьте его в текстовый документ или новое окно. Если вы не можете найти скрипт в ресурсах, попробуйте выполнить поиск по переменной или строке кода, которую вы использовали.
Один из способов прерывания бесконечного цикла — это выбрасывание необработанного исключения, что остановит выполнение текущего стека вызовов. Чтобы сделать это:
- Приостановите отладчик.
- Найдите перспективное выражение внутри цикла, например, вызов функции:
foo.bar(args)
. - В консоли переопределите функцию так, чтобы она выбрасывала исключение:
foo.bar=function(){throw 42;}
. - Возобновите выполнение отладчика.
Это сработало для меня. Хотя я этого не пробовал, но полагаю, что путем переопределения геттера или сеттера вы также можете использовать вышеописанный трюк для присваиваний и чтений, а не только для вызовов функций. Кроме того, если задать переменной значение undefined
, это может привести к фатальной ошибке (и, таким образом, прервать цикл), если поле этой переменной используется в цикле. Например, delete foo.tab
прервет foo.tab[42]
или foo.tab.bar
. Почему-то простая команда foo=undefined
в консоли не сработает (возможно, она определяет переменную, локальную для окна консоли, с именем foo).
Запустите Process Explorer и завершите процесс Chrome, который загружает CPU на максимум. Это приведет к "срыву" страницы, и вы сможете загрузить её заново.
С той же проблемой столкнулся и я. Я открыл консоль JavaScript в приостановленном состоянии скрипта (приостановил его, используя инструменты разработчика). Затем я изменил значение переменной так, чтобы цикл while
завершился.
Цвета в консоли JavaScript
Как установить точку останова JavaScript из кода в Chrome?
Разработка скриптов Tampermonkey в полноценной IDE с автоматическим деплоем в репозиторий OpenUserJs
Обнаружение iOS Chrome
Можно ли задать имя файла объекта PDF, отображаемого в Chrome?