IT TIP

Javascript에서 무한 루프를 어떻게 중지합니까?

itqueen 2020. 11. 30. 20:31
반응형

Javascript에서 무한 루프를 어떻게 중지합니까?


실수로 이것을 썼다고 가정 해 봅시다.

 do { } while (true);

... 그리고 그것을 실행했습니다. 브라우저를 종료하는 것 외에도 자바 스크립트 실행을 중지하는 방법이 있습니까 (기본에서 Ctrl + Break 또는 Ctrl + C와 동일)?

일반적으로 약 30 초 후에 브라우저에서 장기 실행 스크립트를 중지할지 묻는 메시지가 표시되지만 항상 그런 것은 아닙니다 (방금 알아 낸대로)!

참고 : 다음과 같은 간단한 루프로 for (i=1; i > 0; ++i);인해 브라우저가 중단됩니다 (Firefox 3.5b4). 내 부가 기능인지 확인하기 위해 테스트하고 싶지 않습니다. 브라우저를 계속해서 다시 시작하는 것은 월요일 밤에 즐거운 일이 아닙니다.


적어도 Chrome에서는 전체 애플리케이션이 아닌 개별 탭을 종료 할 수 있습니다.

Randolpho 는 또한 IE8이 비슷한 기능을 가지고 있다고 알려 왔습니다.


Chome 버전 45.0.2454.101을 사용하고 있습니다.

오른쪽 상단의 햄버거 메뉴에서 추가 도구> 작업 관리자를 클릭 한 다음 거기에서 탭을 종료합니다. 탭 닫기 시도가 실패한 경우입니다. 그렇지 않으면 탭의 단순한 'X'가 그것을 죽입니다.


2018 년 업데이트 :

Chrome 67에서 DevTools가 열려 있으면 ( F12) 전체 탭을 종료하지 않고 무한 루프를 종료 할 수 있습니다.

  • 소스 패널로 이동하여 "스크립트 실행 일시 중지"를 클릭합니다.
  • 같은 버튼을 누른 상태에서 "중지"아이콘을 선택하십시오.

여기에 이미지 설명 입력

https://developers.google.com/web/updates/2018/04/devtools#stop


ref : https://superuser.com/questions/92617/stop-never-ending-popup-alerts-in-firefox
Firefox는 특히 문제가 있습니다 ...

경고! 경고! 이것을 실행하지 마십시오!

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

이것은 "무한"상태가되며 스크립트가 CPU 시간을 충분히 빨리 소모하지 않기 때문에 내부 시간 초과를 소모하지 않습니다. FF 11에서는 "무응답 스크립트"낙태 기회가 없음을 보장합니다.

초기 브라우저 버전에서는 수동 개입을 사용하여 전체 브라우저를 웅크 리거나 중단하지 않고도 문제가되는 스크립트 만 정상적으로 중지 할 수있었습니다. 그러한 제어권을 갖지 못한다는 것은 주요 브라우저 소프트웨어 설계 결함입니다. 참고 문헌에 설명 된 "솔루션"의 수동 모터 역학에 영향을 미치려면 불합리한 손재주와 반사가 필요합니다.

주의 사항 : 스크립트가 시간 초과 및 경고 유형 프롬프트없이 "무한"상태가 될 수 있습니다. 이들은 특히 해롭고 성가시다. 기본적으로 스크립트는 CPU 시간주기 할당이 20 초 정도로 충분히 느리게 실행됩니다. 이벤트 트리거에 대한 재개 보류중인 실행 일시 중지에 의해 시간이 초과되기 전에 몇 분 또는 몇 시간에 걸쳐 늘어납니다. CPU주기를 타이밍하는 대신 스크립트가 실제 클럭킹에서 시간 초과하는 것이 훨씬 낫습니다. (페이지를 구성하기 위해 콘텐츠 검색을 시도하지만 실패한 스크립트를 어떻게 중단 할 수 없는지 눈치 채 셨나요? FF에서는 주소 표시 줄 버튼 reloadcancel/stop탭을 닫을 수는 있지만 비활성화되어 있습니다.) 일반 자바 스크립트 Timeout()setInterval() 통화는 이로 인해 영향을받지 않으며 일시 중단 된 동안 수동 개입이 "정상적으로"중단 될 수 있도록 조정됩니다.

경험적 관찰을위한 테스트 환경 :

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

추신. 스크립트

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

i허용되는 최대 값을 초과하면 결국 오버플로 오류가 발생 합니다.


대부분의 브라우저에는 제어 할 수없는 자바 스크립트를 실행하는 데 시간이 너무 오래 걸릴 때 표시되는 "느린 스크립트 성능"경고가 있습니다. 이 경고 대화 상자는 일반적으로 문제가되는 스크립트를 종료하는 옵션을 제공합니다.


브라우저에 따라 다릅니다. 일부는 "중지"버튼을 클릭하여 자바 스크립트 실행을 중지 할 수 있습니다. 다른 사람들은 그렇지 않습니다.

가장 좋은 방법은 브라우저 나 탭을 완전히 종료하는 것입니다.


Chrome을 사용하는 경우 응답하지 않는 탭을 쉽게 종료 할 수 있습니다.

무한 JavaScript 루프가 발생한 경우 다음 단계를 수행하십시오.

1. 이미 다른 탭을 연 경우 해당 탭으로 이동하거나 새 탭을 엽니 다.

2. "Shift + Esc"를 눌러 Chrome의 작업 관리자를 엽니 다.

3. 목록에서 탭을 찾고 (목록에서 가장 많은 메모리 소비가 있어야 함) "프로세스 종료"버튼을 클릭합니다.


다른 탭으로 이동하는 것은 중요합니다. JavaScript는 키 누름을 포착하고 무한 루프로 인해 아무 작업도 수행하지 않기 때문입니다.


대부분의 괜찮은 브라우저는 "응답하지 않는 스크립트"경고를 표시합니다 ... 그렇지 않은 경우 가장 좋은 조치는 경고가 표시되지 않는 이유를 찾는 것입니다.


에서 https://superuser.com/questions/92617/stop-never-ending-popup-alerts-in-firefox#comment93927_92617 에 의해 익명 :

이것은 만족스러운 범용 솔루션은 아니지만 Greasmonkey (또는 Ubiquity 또는 Jetpack)를 사용하면 window.confirm을 호출하고 선택적으로 오류를 발생시켜 모든 스크립트 실행을 중지하는 함수로 window.alert를 덮어 쓸 수 있습니다. 경고를 중지하기 위해 플래그를 전환합니다. 계속 돌아가는 사이트가이 동작을 나타내는 경우 유용 할 수 있습니다.


Chrome을 사용할 때 내가하는 일은 shift + ctrl + esc를 눌러 Windows 작업 관리자를 불러오는 것입니다. 그런 다음 프로세스 탭으로 전환하고 chrome.exe 프로세스 (크롬에는 열린 탭마다 하나의 프로세스가 있음)를 스크롤하여 다른 것보다 훨씬 더 많은 CPU 사용량을 가진 프로세스를 찾습니다. 저에게는 약 30 %가있는 반면 다른 모든 사람들은 0 ~ 2 %가되는 경향이 있습니다. 그러면 그 과정을 끝내겠습니다. 실제로 도구> 작업 관리자 또는 크롬의 shift + esc로 이동하여 프로세스에 대한 사용자 정의 작업 관리자를 열면 동일한 작업을 수행 할 수 있습니다. 탭에 대한 더 많은 정보를 표시하므로 사용하기가 더 쉬울 수 있습니다.

참고 URL : https://stackoverflow.com/questions/905322/how-do-you-stop-an-infinite-loop-in-javascript

반응형