2009-05-25 18 views
35

Powiedzmy, że przypadkowo napisał:Jak zatrzymać nieskończoną pętlę w JavaScript?

do { } while (true); 

... a potem prowadził ją. Czy oprócz zabicia przeglądarki istnieje sposób na zatrzymanie wykonywania javascript (odpowiednik Ctrl + Break w wersji podstawowej lub Ctrl + C)?

Zwykle po około 30 sekundach przeglądarka zapyta, czy chcesz zatrzymać długo działający skrypt, ale nie zawsze tak się dzieje (jak się dowiedziałem)!

FYI: Prosta pętla, taka jak ta: for (i=1; i > 0; ++i); spowoduje awarię przeglądarki (Firefox 3.5b4). Nie mam ochoty testować, żeby zobaczyć, czy to jeden z moich dodatków. Ciągłe ponowne uruchamianie przeglądarki nie jest moim pomysłem na zabawną poniedziałkową noc.

+0

Z ciekawości, czy jesteś w stanie określić, co spowodowało, że Twoja przeglądarka nie rzuci ostrzeżenia o "powolnym skrypcie"? – alex

+2

bez śladu! (ten limit 15 znaków jest denerwujący) – nickf

+0

Czy to należy do SuperUser? – Chetan

Odpowiedz

15

Przynajmniej w Chrome możesz zabić jedną kartę, a nie całą aplikację.

Randolpho poinformował mnie również, że IE8 ma podobną funkcjonalność.

+3

Czy możesz opracować, jak zabić jedną kartę? Czy szukamy odpowiedniego chrome.exe i zabijamy go w menedżerze zadań? – mellamokb

+12

Naciśnij Shift + Esc –

+1

negatory, nie działa! przynajmniej nie w wersji 36.0.1985.125 dla linuxa – Octopus

4

Zależy od przeglądarki. Niektóre pozwalają na kliknięcie przycisku "stop", aby zatrzymać wykonywanie javascript. Inni nie.

Sugeruję, że najlepiej jest po prostu całkowicie usunąć przeglądarkę lub kartę.

4

Większość przeglądarek ma ostrzeżenie o "powolnym działaniu skryptu", które pojawia się, gdy wymknięcie się spod kontroli zajmuje bardzo dużo czasu. To okno dialogowe z ostrzeżeniem zwykle daje opcję zabicia obraźliwego skryptu.

+5

-1 zbędny. OP: "Zwykle po około 30 sekundach przeglądarka zapyta, czy chcesz zatrzymać długo działający skrypt, ale nie zawsze tak się dzieje (jak się dowiedziałem)!" Doświadczyłem tego samego problemu, a dialog nie zawsze się pojawiał. – mellamokb

+0

Zobacz stackoverflow.com/questions/905322/... z możliwego powodu, dla którego "dialog nie zawsze pojawia się". – user66001

0

Najbardziej przyzwoite przeglądarki wyświetlają ostrzeżenie "brak reakcji" ... Jeśli nie, to sądzę, że najlepszym sposobem działania byłoby ustalenie, dlaczego ostrzeżenie nie pojawia się.

9

ref: https://superuser.com/questions/92617/stop-never-ending-popup-alerts-in-firefox
Firefox jest szczególnie problematyczne ...

Ostrzeżenie! Zastanówcie się! NIE uruchamiaj tego!

javascript: 
    while (true) alert("irritated and exhausted - yet?"); 

To go „nieskończony”, a nie wyczerpie wewnętrzny limit czasu, ponieważ skrypt nie żuć czasu procesora wystarczająco szybko. W FF 11 gwarantuje to, że nie będzie możliwości aborcji w "niereagujących scenariuszach".

Wyczerpujące zatrzymywanie tylko niepokojącego skryptu było możliwe i banalne we wczesnych wersjach przeglądarkowych, przy użyciu ręcznej interwencji, bez kumkania i przerywania całej przeglądarki. Brak takiej kontroli to główna luka w oprogramowaniu przeglądarki. Nieuzasadniona zręczność i odruch są wymagane, aby wywoływać mechanikę mechaniczną "rozwiązań" opisanych w odnośniku.

Zastrzeżenie: Możliwe jest, aby skrypty działały "nieskończone" bez limitów czasu i bez alertów typu alertów. Są to szczególnie szkodliwe i denerwujące. Zasadniczo, skrypty działają na tyle wolno, że przydział czasu procesora CPU wynosi 20 sekund. jest rozciągnięty na kilka minut lub godzin lub ..., przed upływem czasu, przez zawieszenie wykonania do czasu wznowienia w momencie uruchomienia zdarzenia. Zamiast taktowania cykli procesora byłoby znacznie lepiej dla skryptów do przekroczenia czasu na zegarkach świata rzeczywistego. (Zauważasz, że nie możesz przerwać skryptu, który próbuje odzyskać zawartość - ale bez powodzenia - do skonstruowania strony? W FF oba przyciski paska adresu: reload i cancel/stop są wyłączone, chociaż zakładka może być przynajmniej zamknięta.) Normalne wywołania javascript Timeout() i setInterval() nie cierpią z tego powodu i są tak warunkowane, że podczas zawieszenia, ręczna interwencja jest możliwa do usunięcia "z wdziękiem".

środowisko testowe dla obserwacji empirycznych:

window.navigator.userAgent= 
Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0 

PS. skrypt

for (i=1; i > 0; ++i); 

ostatecznie pułapka na błąd przepełnienia gdy i przekracza maksymalną dozwoloną wartość.

+0

+1 dla dokładnych i użytecznych informacji! – user66001

0

Od https://superuser.com/questions/92617/stop-never-ending-popup-alerts-in-firefox#comment93927_92617 przez anonymous:

To nie jest zadowalającym rozwiązaniem ogólnego przeznaczenia, ale z Greasemonkey (albo Ubiquity lub Jetpack) można zastąpić window.alert z funkcji, która wywołuje okno. potwierdź i opcjonalnie wyrzuć błąd, zatrzymując wykonywanie wszystkich skryptów lub przełącza flagę, aby zatrzymać alerty. To może być przydatne, jeśli strona, do której wracasz, przedstawia to zachowanie.

0

Co robię podczas korzystania z Chrome, a dzieje się tak, naciskając shift + ctrl + esc, aby wywołać menedżera zadań Windows. Następnie przejdź do zakładki procesów i przewijaj procesy chrome.exe (chrome ma jeden proces dla każdej otwartej karty), aż znajdę jeden z znacznie wyższym wykorzystaniem procesora niż oters. Ma on dla mnie około 30%, podczas gdy wszyscy inni lubią 0-2% Potem zakończę ten proces. W rzeczywistości to samo można zrobić, przechodząc do narzędzi> menedżer zadań lub shift + esc w chrome, aby otworzyć niestandardowy menedżer zadań dla swoich procesów. Może być łatwiejsze w użyciu, ponieważ pokazuje więcej informacji o zakładkach.

27

Używam Chome Wersja 45.0.2454.101

W prawym górnym rogu, w menu hamburger, kliknij więcej Narzędzia> Menedżer zadań, a następnie zabić kartę stamtąd. Dzieje się tak, jeśli próba zamknięcia karty zakończy się niepowodzeniem. W przeciwnym razie proste "X" na karcie zabije go.

+0

To działa najlepiej –

+0

posiadające nieskończoną pętlę w wywołaniu Ajax powoduje, że zwykły X nie powiedzie się, gdy masz devtools otwarte. – masterX244

0

Jeśli nie chcesz zabijać zakładki lub przeglądarki, oto technika, która zadziała, jeśli spełnione są dwa warunki (Chrome pozwala na to również i inne przeglądarki).

  1. Przeglądarka pozwala wstrzymać kod wykonywany
  2. Przeglądarka pozwala modyfikować stan zmiennej

Celem jest, aby wstrzymać kod i zmienić wartość zmiennej, dzięki czemu będzie prowokować wyjątek.

+0

Czy możesz opracować, jak można wstrzymać kod wykonawczy lub zmodyfikować zmienną? – SafaOrhan

Powiązane problemy