Як припинити виконання сценарію при налагодженні в Google Chrome?


210

Переглядаючи код JavaScript у відладчику Google Chrome, як я припиняю виконання сценарію, якщо не хочу продовжувати? Єдиний спосіб, який я знайшов - це закрити вікно браузера.

Натискаючи кнопку "Перезавантажити цю сторінку", виконується решта коду і навіть подається форми, як якщо б натиснути F8 "Продовжити".

ОНОВЛЕННЯ :

При натисканні клавіші F5 (Оновити) під час призупинення сценарію:

  • Google Chrome (v22) запускає сценарій. Якщо сценарій подає HTTP-запит, відображається відповідь HTTP на цей запит. Оригінальна сторінка не оновлюється.
  • IE 9 просто замерзає. Однак IE має опцію "Зупинити налагодження", яка при натисканні (за умови, що ви не натискали F5 раніше) продовжує запускати сценарій поза налагоджувачем.
  • Firebug поводиться однаково з Chrome.

Закриття та повторне відкриття вікна веб-переглядача - це не завжди наступний найпростіший спосіб, оскільки це вб'є стан сеансу браузера, і це може бути важливо. Усі ваші точки проходу також втрачені.

ОНОВЛЕННЯ (січень 2014 р.) :

Оновити під час налагодження:

  • Chrome v31: дозволяє запускати сценарії та зупинятись на подальших точках зупинки (але не надсилає запити на ajax), а потім оновлює.
  • IE 11: оновлення нічого не робить, але ви можете натиснути F5 для продовження.
  • Firefox v26: дозволяє запускати сценарії, але не зупиняється на подальших точках зупинки, подає запити ajax, а потім оновлює.

Вид прогресу!

Перейдіть на ту саму сторінку під час налагодження:

  • Chrome v31: те саме, що оновити.
  • IE 11: сценарії припиняються, починається новий сеанс браузера (такий же, як закриття та повторне відкриття).
  • Firefox v26: нічого не відбувається.

Також juacala запропонував ефективне рішення. Наприклад, якщо ви використовуєте jQuery, запуск видалення $ з консолі зупинить виконання після того, як буде знайдено будь-який метод jQuery. Я перевірив його у всіх перелічених браузерах і можу підтвердити, що він працює.

ОНОВЛЕННЯ (березень 2015 р.) :

Нарешті, після 2 років і майже 10К переглядів, правильну відповідь дав Олександр К. Google Chrome має власний диспетчер завдань, який може вбити процес вкладки, не закриваючи вкладку, зберігаючи всі точки перерви та інші речі недоторканими.

Я навіть зайшов до BrowserStack.com, щоб перевірити його в Chrome v22 і виявив, що це працює таким чином навіть у той час.

Проблема Juacala все ще корисна при налагодженні в IE або Firefox.

ОНОВЛЕННЯ (січень 2019) :

Нарешті, інструменти для розробників Chrome додали правильний спосіб зупинити виконання сценарію, що є приємним (хоча і трохи прихованим). Детальну інформацію див. У відповіді Джеймса Гентеса.


12
введіть debugger;у консоль інструментів розробки, і вона негайно поставить речі в налагоджувач і зупинить сценарій.
Джейк

3
Відповідь Джеймса Гентеса здається кращим рішенням у 2019 році
Шпіколін

1
Чому всі говорять про зупинку сценарію? Йдеться про припинення / розірвання всього коду "наступного / плануваного", який буде поданий.
Андре Елріко

Відповіді:


188

У Chrome є "Диспетчер завдань", доступний через Shift+ ESCабо через

Меню → Інші інструменти → Диспетчер завдань

Ви можете вибрати завдання сторінки та закінчити її натисканням кнопки "Завершити процес".


4
chrome 48це лише ЗАКРИТИ інструмент Dev, а не припинить його, повторно відкривши його, ви можете побачити програму, яка ще працює ( tried setInterval())
Abdelouahab

11
Я не бачу "Диспетчера завдань" у розділі "Інші інструменти", а shift + esc нічого не робить ... (Chrome 50, OSX) Shift + ESC працює під Chrome / Windows, хоча ...
Майкл

2
Вау - я так довго хотів цього, і це вже роками! Це найкорисніша відповідь StackOverflow, яку я бачив протягом усього року!
Майкл Шепер

4
У Macintosh (Chrome v.63) ця опція відображається у меню "Вікно", у третій групі. Немає явного комбінації клавіатур.
Аполлон

2
Це вб'є вкладку
htafoya

105

З квітня 2018 року ви можете зупинити нескінченні петлі в Chrome :

  1. Відкрийте панель " Джерела " в Інструментах для розробників ( Ctrl+ Shift+ I**).
  2. Натисніть кнопку " Пауза", щоб призупинити виконання сценарію .

Також зверніть увагу на клавіші швидкого доступу: F8і Ctrl+\

введіть тут опис зображення


Такий прихований дорогоцінний камінь на тому інтерфейсі.
Норберт

Відповідач має ключ до секретів Всесвіту.
Сем

Ярлик особливо корисний, коли у вас є нескінченно запущений сценарій, який ви хочете зупинити, щоб перевірити консоль. Дякую.
Олексій

@DanDascalescu У мене Chrome 80.0.3987.149, і це виглядає так
Джеймс Гентес

Може бути, ми дивимось на кнопку в різних станах виконання? Моє те, що я вибрав bodyелемент тут на SO, встановив "перерву -> модифікації піддіаграму", а потім клацнув куди завгодно. Кнопка виглядає як на екрані, який я розмістив.
Дан Даскалеску

37

Один із способів зробити це - призупинити сценарій, подивитися, який код випливає, де ви зупинилися, наприклад:

var something = somethingElse.blah;

На консолі виконайте такі дії:

delete somethingElse;

Потім відіграйте сценарій: він спричинить фатальну помилку при спробі доступу somethingElse, і сценарій загине. Вуала, сценарій ви припинили.

EDIT: Спочатку я видалив змінну. Це недостатньо добре. Вам потрібно видалити функцію або об'єкт, до якого JavaScript намагається отримати доступ до ресурсу.


3
you have to delete a function or an objectтакий бридкий хак! (в інтерфейсі користувача це чудово впишеться, оскільки знищить всі кнопки)
Mars Robertson

Це досить неприємно, але я не можу придумати іншого способу.
Джакала

Через рік я повертаюся до того ж питання ... І я не можу цього зрозуміти! Чи є спосіб зробити це більш загальним?
Марс Робертсон

Ви не можете зрозуміти, як припинити виконання сценарію? Я завжди міг це зробити. Чи є у вас приклад, який не дозволяє вбити сценарій таким чином?
juacala

1
@Hashim, вам потрібно вміти ставити крапку всередині функції. Тому переконайтеся, що внутрішня частина функції знаходиться в окремому рядку від визначення функції. У вашому випадку вам потрібно буде в консолі, як тільки вона призупинена, ввести "document.getElementById ('see_older'). ParentNode.removeChild (document.getElementById ('see_older'));". Це тому, що у вас немає нічого в JavaScript, щоб перерватися. На жаль, це змінює і HTML. Якщо ви можете змінити код на "var el = document.getElementById ('see_older'); \ n el.getEl ...", ви можете просто зробити "delete el;" і це зупинить це.
juacala

12

Оновлення квітня 2020 року

Що стосується Chrome 80, жоден із поточних відповідей не працює. Немає видимої кнопки "Призупинити" - вам потрібно довго натиснути кнопку "Відтворити", щоб отримати доступ до піктограми "Стоп":

Зупинити виконання сценарію в Chrome DevTools


2
Дякую, Боже! Справжня відповідь на питання ОП.
користувач1023110

1
@ user1023110: Я не знаю про Бога, але ласкаво просимо :)
Дан Даскалеску

5

Якщо ви стикаєтесь з цим під час використання debuggerоператора,

debugger;

... тоді я думаю, що сторінка буде продовжувати працювати довіку до отримання результатів виконання js або до наступного перерви. Якщо припустити, що ви перебуваєте в режимі помилки (помилка піктограми паузи), ви можете переконатися, що перерва відбувається, замість цього виконайте щось на кшталт:

debugger;throw 1;

або, можливо, викликати неіснуючу функцію:

debugger;z();

(Звичайно, це не допомагає, якщо ви намагаєтеся перейти через функції, хоча, можливо, ви могли б динамічно додати throw 1або z()або дещо на панелі "Джерела", ctrl-S для збереження, а потім ctrl-R для оновлення ... це Однак може пропустити одну точку розриву, але може працювати, якщо ви знаходитесь у циклі.)

Якщо ви робите цикл і очікуєте, що він знову запустить debuggerоператор, ви можете просто ввести його throw 1.

throw 1;

Потім, коли ви натиснете ctrl-R, наступний кидок буде потрапляти, і сторінка оновиться.

(перевірено Chrome v38, близько квітня 2017)


3

Тут добре запитання. Я думаю, ви не можете припинити виконання сценарію. Хоча я ніколи цього не шукав, але на роботі хромовий налагоджувач досить довго використовую. Зазвичай я встановлюю точки пробою у своєму коді JavaScript, а потім налагоджую частину коду, який мене цікавить. Коли я закінчу налагодження цього коду, зазвичай просто запускаю іншу частину програми або оновлюю браузер.

Якщо ви хочете запобігти виконанню решти сценарію (наприклад, через дзвінки AJAX, які будуть здійснюватися), єдине, що ви можете зробити - це видалити цей код у консолі на ходу, тим самим запобігаючи цим викликам від виконання , ви можете без проблем виконати код, що залишився.

Я сподіваюся, що це допомагає!

PS: Я намагався знайти варіант для припинення виконання в деяких підручниках / посібниках, таких як наступні, але не зміг його знайти. Як я вже говорив раніше, напевно, такого варіанту немає.

http://www.codeproject.com/Articles/273129/Beginner-Guide-to-Page-and-Script-Debugging-with-C

http://www.nsbasic.com/app/tutorials/TT10.htm


Чи допомагав я? Здається, що немає варіанту припинення, але для того, щоб запобігти виконанню наступного коду, ви можете або прокоментувати його раніше, або видалити наступний код / ​​зателефонувати "наживо" у відладчику Chrome (ця остання опція зробить кнопку продовження вести себе як термінат). Я знаю, що вони не є ідеальними рішеннями, але я думаю, що вони є найбільш прийнятними. Будь-які коментарі?
Ромен Родрігес-Гіл

1
У багатьох випадках код, який потрібно запобігти виконанню, - це стек викликів (функції, які отримають контроль після повернення поточної функції). Звичайно, я можу переходити та редагувати функції до стека викликів, а потім знаходити та редагувати всі функції, які можуть бути викликані асинхронно. Я впевнений, що браузер повинен бути тривіальною справою, щоб оновити сторінку зі сценарієм, який все ще знаходиться в призупиненому стані, якщо воно було призупинено під час натискання кнопки оновлення сторінки. Я також вважаю, що це має бути очікуваною поведінкою для будь-якого браузера (на жаль, це не так).
srgstm

2
Насправді я знайшов рішення для досягнення припинення виконання сценарію! Я запускаю сторінку. Виконання пауз на точці розриву. Потім я вивчаю проблему і розумію, що викликає помилку. Щоб завершити виконання, натискаю кнопку X поруч із URL-адресою (щоб зупинити завантаження сторінки), а потім, продовжуючи сценарій (F8), воно припиняється. Думаю, досить простий спосіб досягти цього. Що ви думаєте про це?
Ромен Родрігес-Гіл

Кнопка X в Chrome замінюється кнопкою Refresh (Оновити) після завантаження сторінки, тому немає можливості натискати X після цього (я також спробував її в IE, у якого X є весь час, але він незмінно застигає). Я також перевірив вашу пропозицію під час завантаження сторінки і виявив, що сценарій не припиняється після натискання клавіші X, а потім F8. Цілком імовірно, що сценарії, які ще не були завантажені в браузер під час натискання X, після цього не завантажуються, але це повинно бути очевидним.
srgstm

Ой ви праві, це було швидке випробування і було нерепрезентативним ... Тоді здається, що рішення немає.
Ромен Родрігес-Гіл

3

Посилаючись на відповідь, надану @scottndecker на наступне запитання , chrome тепер надає параметр "відключити JavaScript" у розділі Інструменти для розробників:

  • Вертикальний ...вгорі праворуч
  • Налаштування
  • А в розділі "Налаштування" перейдіть до розділу "Налагоджувач" в самому дні та виберіть "Вимкнути JavaScript"

Хороша річ, що ви можете зупинити та повторно запустити лише перевіривши / знявши його.


1
Якщо ви переконуєтесь через те, що ви переплутані між меню Інструменти розробника та меню Chrome, це дуже сумно :(
theFreedomBanana

Не працювало для мене. Я встановив прапорець "Відключити JavaScript", але сценарій просто продовжує працювати.
Пол Горбас

1

Ви можете це зробити, але спершу потрібно підготувати свій код.

Інструкції щодо зупинки виконання скриптів у Google Chrome Dev Tools:

(1) Спершу підготуйте свій код, створивши глобальну змінну:

var devquit=0;
$(document).ready({
    //the rest of your code

(2) У будь-якому місці, де ви хочете вийти, перевірити значення цієї змінної:

//Lotsa code
if (devquit > 0) return false;

(3) Призупинити виконання сценарію ввімкнути або перед цим вище тестовими рядками

(4) Перехід на консоль

(5) Тип:

> devquit
0
> devquit=1   <=== only this line is necessary
> devquit
1

(6) Продовжити виконання сценарію. Сценарій буде return falseвиконувати тест із кроку (2) вище


Примітки:

(A) Цей трюк працює з глобальними змінними та об'єктами, але він не працюватиме з локальними змінними. Зауважте, що це:
newVar = 'never used before';
створює нову властивість об’єкта вікна (працює з вищевикладеним фокусом), в той час як це:
var newVar = 'never used before';
створює локальну змінну (НЕ працює з вищеназваним фокусом!)

(B) Отже, ви все одно можете використовувати цей трюк з уже запущеним кодом, якщо у вас є глобальна змінна або об’єкт, який поверне помилковий, якщо він має задане значення.

(C) У крайньому випадку ви можете використовувати хитрість juacala та видалити елемент з DOM (на вкладці «елементи»), що спричинить помилку javascript. Наприклад, припустимо, що у вас є код var cartype = $('#cartype').val();Якщо ви видалите елемент з ідентифікатором = cartypeперед цим рядком коду, то js перерветься в цьому рядку. Однак елемент все одно бракує при спробі повторного запуску коду. Описаний вище трюк дозволяє запускати та повторно запускати код ad infinitum.


Більше приміток:

(а) Вставте точку розриву в код: просто введіть debugger;рядок самостійно. Якщо DevTools відкритий, скрипт стрибне в налагоджувач в цій точці. Якщо DevTools не відкриється, код ігнорує оператор.

(b) Хочете уникнути попадання в бібліотеку jQuery під час налагодження коду? Blackbox це. Дивіться інструкції щодо чорної скриньки для Chrome - або - для Firefox


Подяка (будь ласка, відвідайте та підкажіть):

Налагодження Javascript рядок за рядком за допомогою Google Chrome

Чи можливо змінити значення змінних javascript під час налагодження в Google Chrome?


2
Any place where you may wish to quit, test the value of this variableЦе жахливо! Я хочу кинути, куди б я могла трапитися, на даний момент крокую, я не знаю заздалегідь, де це могло бути!
Майкл

Якщо ви готові взяти участь у роботі з кодовою стороною, це найбільш зручний для клієнта клієнт, який намагається зупинити виконання сценарію.
Гусь

??? Вам не потрібна жодна глобальна змінна. Просто натисніть цю кнопку .
Дан Даскалеску

0

Ви можете зробити паузу на будь-якій схемі XHR, яка мені дуже корисна під час налагодження подібних сценаріїв.

Наприклад, я вказав точку розриву на шаблоні URL, що містить "/"

введіть тут опис зображення


0

Якщо у вас є негідний цикл, призупиніть код у відладчику Google Chrome (маленька ||кнопка " ", перебуваючи на вкладці "Джерела").

Поверніться до самого Chrome, відкрийте "Диспетчер завдань" ( Shift+ ESC), виберіть вкладку, натисніть кнопку "Завершити процес".

Ви отримаєте повідомлення Aww Snap, після чого зможете перезавантажити ( F5).

Як зазначали інші, перезавантаження сторінки в точці паузи - це те саме, що перезапуск циклу шахраїв і може спричинити неприємні блокування, якщо відладчик також блокується (у деяких випадках призводить до перезавантаження хрому або навіть ПК). Налагоджувачу потрібна кнопка "Стоп". Nb: Прийнята відповідь застаріла, оскільки деякі її аспекти зараз, мабуть, неправильні. Якщо ви проголосуєте мене, поясніть, будь ласка :) .



-1

Відкрийте вкладку "Джерело" в "Інструменти для розробників", натисніть на номер рядка у запущеному сценарії, це створить точку розриву і налагоджувач там зламається.


-1

Як було сказано вище в цій публікації, існує багато відповідних рішень цієї проблеми, але я знайшов невеликий хак, який можна вставити в сценарій або вставити в консоль Chromes (налагоджувач) для його досягнення:

jQuery(window).keydown(function(e) { if (e.keyCode == 123) debugger; });

Це спричинить призупинення виконання при натисканні F12.


Що робити, якщо ви (сподіваємось) не використовуєте jQuery?
Дан Даскалеску

тоді використовуйте чистий Javascript, як document.addEveneListner .., щоб отримати подію на клавіатуру ..
Муртаза
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.