Làm cách nào để chấm dứt thực thi tập lệnh khi gỡ lỗi trong Google Chrome?


210

Khi bước qua mã JavaScript trong trình gỡ lỗi Google Chrome, làm cách nào để chấm dứt thực thi tập lệnh nếu tôi không muốn tiếp tục? Cách duy nhất tôi tìm thấy là đóng cửa sổ trình duyệt.

Nhấn "Tải lại trang này" sẽ chạy phần còn lại của mã và thậm chí gửi biểu mẫu như thể nhấn F8 "Tiếp tục".

CẬP NHẬT :

Khi nhấn F5 (Làm mới) trong khi tập lệnh bị tạm dừng:

  • Google Chrome (v22) chạy tập lệnh. Nếu tập lệnh gửi yêu cầu HTTP, phản hồi HTTP cho yêu cầu đó được hiển thị. Trang gốc không được làm mới.
  • IE 9 chỉ đóng băng. Tuy nhiên IE có tùy chọn "Dừng gỡ lỗi", khi được nhấn (với điều kiện bạn không nhấn F5 trước đó), sẽ tiếp tục chạy tập lệnh bên ngoài trình gỡ lỗi.
  • Firebird hành xử giống hệt với Chrome.

Đóng và sau đó mở lại cửa sổ trình duyệt không phải lúc nào cũng là cách dễ nhất tiếp theo bởi vì nó sẽ giết trạng thái phiên của trình duyệt và điều đó có thể quan trọng. Tất cả các điểm dừng của bạn cũng bị mất.

CẬP NHẬT (tháng 1 năm 2014) :

Làm mới trong khi gỡ lỗi:

  • Chrome v31: cho phép các tập lệnh chạy và dừng trên các điểm dừng tiếp theo (nhưng không gửi yêu cầu ajax), sau đó làm mới.
  • IE 11: refresh không làm gì cả, nhưng bạn có thể nhấn F5 để tiếp tục.
  • Firefox v26: cho phép các tập lệnh chạy nhưng không dừng ở các điểm dừng tiếp theo, gửi yêu cầu ajax, sau đó làm mới.

Loại tiến bộ!

Điều hướng đến cùng một trang trong khi gỡ lỗi:

  • Chrome v31: giống như Làm mới.
  • IE 11: tập lệnh bị chấm dứt, phiên trình duyệt mới được bắt đầu (giống như đóng và mở lại).
  • Firefox v26: không có gì xảy ra.

Ngoài ra juacala đề nghị một cách giải quyết hiệu quả. Ví dụ: nếu bạn đang sử dụng jQuery, việc chạy xóa $ từ bảng điều khiển sẽ dừng thực thi khi gặp bất kỳ phương thức jQuery nào. Tôi đã thử nghiệm nó trong tất cả các trình duyệt trên và có thể xác nhận nó đang hoạt động.

CẬP NHẬT (Tháng 3 năm 2015) :

Cuối cùng, sau hơn 2 năm và gần 10 nghìn lượt xem, câu trả lời đúng được đưa ra bởi Alexander K. Google Chrome có Trình quản lý tác vụ riêng có thể giết chết quá trình tab mà không đóng chính tab, giữ nguyên các điểm dừng và các nội dung khác.

Tôi thậm chí đã đi xa như BrowserStack.com để thử nghiệm nó trong Chrome v22 và thấy rằng điều này đang hoạt động theo cách này ngay cả tại thời điểm đó.

Cách giải quyết của Juacala vẫn hữu ích khi gỡ lỗi trong IE hoặc Firefox.

CẬP NHẬT (tháng 1 năm 2019) :

Chrome Dev Tools cuối cùng đã thêm một cách thích hợp để dừng thực thi tập lệnh, điều này thật tuyệt (mặc dù hơi bị ẩn). Tham khảo câu trả lời của James Gentes để biết chi tiết.


12
debugger;vào bảng điều khiển công cụ dev và nó sẽ ngay lập tức đưa mọi thứ vào trình gỡ lỗi và dừng tập lệnh.
Jake

3
Câu trả lời của James Gentes dường như là một giải pháp tốt hơn vào năm 2019
Spikolynn

1
Tại sao mọi người nói về việc dừng kịch bản? Đây là về việc chấm dứt / phá vỡ tất cả các mã "theo sau / rút gọn" sắp tới.
Andre Elrico

Câu trả lời:


188

Trong Chrome, có "Trình quản lý tác vụ", có thể truy cập qua Shift+ ESChoặc thông qua

Menu → Công cụ khác → Trình quản lý tác vụ

Bạn có thể chọn tác vụ trang của mình và kết thúc nó bằng cách nhấn nút "Kết thúc quá trình".


4
chrome 48điều này sẽ chỉ ĐÓNG công cụ Dev và không chấm dứt nó, mở lại nó, bạn có thể thấy chương trình vẫn đang chạy ( tried setInterval())
Abdelouahab

11
Tôi không thấy "Trình quản lý tác vụ" trong "Công cụ khác" và shift + esc không làm gì cả ... (Chrome 50, OSX) Shift + ESC không hoạt động trong Chrome / Windows mặc dù ...
Michael

2
Wow, tôi đã muốn điều này rất lâu, và nó đã ở đó trong nhiều năm! Đây là câu trả lời StackOverflow hữu ích nhất mà tôi đã thấy cả năm!
Michael Scheper

4
Trên Macintosh (Chrome v.63) tùy chọn này hiển thị trong menu "Cửa sổ", trong nhóm thứ ba. Không có phím tắt rõ ràng.
Apollo

2
Điều này sẽ giết tab
htafoya

105

Kể từ tháng 4 năm 2018, bạn có thể dừng các vòng lặp vô hạn trong Chrome :

  1. Mở bảng Nguồn trong Công cụ dành cho nhà phát triển ( Ctrl+ Shift+ I**).
  2. Nhấp vào Pause nút để Pause thực hiện kịch bản .

Cũng lưu ý các phím tắt: F8Ctrl+\

nhập mô tả hình ảnh ở đây


Thật là một viên ngọc ẩn trên UI đó.
norbert

Người trả lời có một chìa khóa cho những bí mật của Vũ trụ.
Sam

Phím tắt đặc biệt hữu ích khi bạn có một tập lệnh chạy vô tận mà bạn muốn dừng để kiểm tra bảng điều khiển. Cảm ơn.
Alexei

@DanDascalescu Tôi có Chrome 80.0.3987.149 và nó trông giống nhau
James Gentes

Có lẽ chúng ta đang nhìn vào nút trong các trạng thái thực thi khác nhau? Của tôi là tôi đã chọn bodyphần tử ở đây trên SO, đặt "break on -> sửa đổi cây con", sau đó nhấp vào bất cứ đâu. Nút trông giống như trong ảnh chụp màn hình tôi đã đăng.
Dan Dascalescu

37

Một cách bạn có thể làm là tạm dừng tập lệnh, xem mã nào theo sau nơi bạn hiện đang dừng, ví dụ:

var something = somethingElse.blah;

Trong bảng điều khiển, làm như sau:

delete somethingElse;

Sau đó phát tập lệnh: nó sẽ gây ra lỗi nghiêm trọng khi cố truy cập somethingElse và tập lệnh sẽ chết. Voila, bạn đã chấm dứt kịch bản.

EDIT: Ban đầu, tôi đã xóa một biến. Đó chưa đủ tốt. Bạn phải xóa một chức năng hoặc một đối tượng mà JavaScript cố gắng truy cập vào một thuộc tính.


3
you have to delete a function or an objectThật là một hack khó chịu! (trong giao diện người dùng, nó sẽ rất phù hợp khi tắt tất cả nút)
Mars Robertson

Điều này khá khó chịu, nhưng tôi không thể nghĩ ra một cách khác.
juacala

Năm sau tôi trở lại cùng một câu hỏi ... Và tôi không thể hiểu được! Có cách nào để làm cho nó chung chung hơn?
Mars Robertson

Bạn không thể tìm ra cách chấm dứt thực thi tập lệnh? Tôi đã luôn luôn có thể làm điều này. Bạn có một ví dụ không cho phép bạn giết tập lệnh theo cách này không?
juacala 14/07/2015

1
@Hashim, bạn cần có thể đặt một điểm dừng bên trong hàm. Vì vậy, hãy chắc chắn rằng bên trong hàm nằm trên một dòng riêng biệt với định nghĩa hàm. Trong trường hợp của bạn, bạn sẽ cần trong bảng điều khiển, khi nó bị tạm dừng, hãy nhập "document.getEuityById ('see_older'). ParentNode.removeChild (document.getEuityById ('see_older'));". Điều này là do bạn không có bất cứ điều gì trong javascript để phá vỡ. Thật không may, điều này cũng thay đổi HTML. Nếu bạn có thể thay đổi mã thành "var el = document.getEuityById ('see_older'); \ n el.getEl ..." thì bạn chỉ có thể thực hiện "xóa el;" và điều đó sẽ ngăn chặn nó.
juacala

11

Cập nhật tháng 4 năm 2020

Kể từ Chrome 80, không có câu trả lời hiện tại nào hoạt động. Không có nút "Tạm dừng" hiển thị - bạn cần nhấp dài vào nút "Phát" để truy cập biểu tượng Dừng:

Dừng thực thi tập lệnh trong DevTools của Chrome


2
Cảm ơn chúa! Một câu trả lời thực sự cho câu hỏi của OP.
dùng1023110

1
@ user1023110: Tôi không biết về Chúa nhưng bạn được chào đón :)
Dan Dascalescu

5

Nếu bạn gặp phải điều này trong khi sử dụng debuggercâu lệnh,

debugger;

... sau đó tôi nghĩ rằng trang sẽ tiếp tục chạy mãi cho đến khi thời gian chạy js mang lại hoặc nghỉ tiếp theo. Giả sử bạn đang ở chế độ ngắt kết nối (chuyển đổi biểu tượng tạm dừng), bạn có thể đảm bảo nghỉ xảy ra bằng cách thay vào đó làm một việc như:

debugger;throw 1;

hoặc có thể gọi một hàm không tồn tại:

debugger;z();

(Tất nhiên điều này không hữu ích nếu bạn đang cố gắng thực hiện các chức năng, mặc dù có lẽ bạn có thể tự động thêm vào một throw 1hoặcz() hoặc somesuch trong bảng Nguồn, ctrl-S để lưu và sau đó ctrl-R để làm mới ... điều này tuy nhiên có thể bỏ qua một điểm dừng, nhưng có thể hoạt động nếu bạn đang ở trong một vòng lặp.)

Nếu bạn đang thực hiện một vòng lặp và mong muốn kích hoạt lại debuggercâu lệnh, bạn chỉ có thể gõ throw 1thay thế.

throw 1;

Sau đó, khi bạn nhấn ctrl-R, lần ném tiếp theo sẽ được nhấn và trang sẽ được làm mới.

(đã thử nghiệm với Chrome v38, vào khoảng tháng 4 năm 2017)


3

Câu hỏi hay ở đây. Tôi nghĩ bạn không thể chấm dứt thực thi tập lệnh. Mặc dù tôi chưa bao giờ tìm kiếm nó, tôi đã sử dụng trình gỡ lỗi chrome trong một thời gian khá dài tại nơi làm việc. Tôi thường đặt các điểm dừng trong mã javascript của mình và sau đó tôi gỡ lỗi phần mã tôi quan tâm. Khi tôi gỡ lỗi mã đó, tôi thường chỉ chạy phần còn lại của chương trình hoặc làm mới trình duyệt.

Nếu bạn muốn ngăn phần còn lại của tập lệnh được thực thi (ví dụ do các cuộc gọi AJAX sẽ được thực hiện) , điều duy nhất bạn có thể làm là xóa mã đó trong bảng điều khiển nhanh chóng, do đó ngăn các cuộc gọi đó từ việc được thực thi , sau đó bạn có thể thực thi mã còn lại mà không gặp vấn đề gì.

Tôi hi vọng cái này giúp được!

PS: Tôi đã cố gắng tìm ra một tùy chọn để chấm dứt thực thi trong một số hướng dẫn / hướng dẫn như những điều sau đây, nhưng không thể tìm thấy nó. Như tôi đã nói trước đây, có lẽ không có lựa chọn như vậy.

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

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


Tôi đã giúp? Có vẻ như không có tùy chọn chấm dứt, nhưng để ngăn việc thực thi mã sau, bạn có thể nhận xét trước hoặc xóa mã sau / gọi "trực tiếp" trong trình gỡ lỗi Chrome (tùy chọn sau này sẽ tạo nút tiếp tục cư xử như chấm dứt). Tôi biết chúng không phải là giải pháp lý tưởng, nhưng tôi nghĩ chúng là những giải pháp được chấp nhận nhất. Có ý kiến ​​gì không?
Romén Rodríguez-Gil

1
Trong nhiều trường hợp, mã cần được ngăn chặn để thực thi là lên ngăn xếp cuộc gọi (các hàm sẽ có quyền kiểm soát sau khi hàm hiện tại trả về). Chắc chắn, tôi có thể đi và chỉnh sửa các chức năng trong ngăn xếp cuộc gọi, sau đó tìm và chỉnh sửa tất cả các chức năng có thể được gọi là không đồng bộ. Tôi chắc chắn, nó phải là một điều tầm thường đối với trình duyệt để làm mới một trang với tập lệnh vẫn ở trạng thái tạm dừng NẾU nó bị tạm dừng tại thời điểm nhấn nút Làm mới trang. Tôi cũng nghĩ rằng đó là một hành vi được mong đợi cho bất kỳ trình duyệt nào (thật không may, nó không phải vậy).
srgstm

2
Trên thực tế, tôi đã tìm thấy một cách giải quyết để đạt được việc chấm dứt thực thi tập lệnh!: Trong chrome, tôi mở trình gỡ lỗi để gỡ lỗi một trong các ứng dụng của mình và tôi đặt điểm dừng. Tôi chạy trang. Việc thực hiện tạm dừng tại điểm dừng. Sau đó, tôi kiểm tra vấn đề và nhận ra những gì gây ra lỗi. Để chấm dứt thực thi, tôi bấm vào nút X bên cạnh URL (để dừng tải trang) và sau đó, khi tiếp tục tập lệnh (F8), nó sẽ chấm dứt. Cách khá dễ dàng để đạt được nó, tôi nghĩ. Bạn nghĩ gì về cái này?
Romén Rodríguez-Gil

Nút X trong Chrome được thay thế bằng nút Làm mới sau khi trang được tải, do đó không có cách nào để nhấn X sau đó (Tôi cũng đã thử nó trong IE có sẵn X mọi lúc, nhưng nó luôn đóng băng). Tôi cũng đã kiểm tra đề xuất của bạn trong khi tải trang và thấy rằng tập lệnh không chấm dứt sau khi nhấn X và sau đó là F8. Có khả năng các tập lệnh chưa được tải vào trình duyệt tại thời điểm X được nhấn sẽ không được tải sau đó nhưng điều đó là hiển nhiên.
srgstm

Ồ bạn nói đúng, đó là một thử nghiệm nhanh và không mang tính đại diện ... Sau đó, có vẻ như không có giải pháp.
Romén Rodríguez-Gil

3

Đề cập đến câu trả lời được đưa ra bởi @scottndecker cho câu hỏi sau đây , chrome hiện cung cấp tùy chọn 'vô hiệu hóa JavaScript' trong Công cụ dành cho nhà phát triển:

  • Theo chiều dọc ... ở phía trên bên phải
  • Cài đặt
  • Và trong phần 'Tùy chọn', đi đến phần 'Trình gỡ lỗi' ở dưới cùng và chọn 'Tắt JavaScript'

Điều tốt là bạn có thể dừng và chạy lại chỉ bằng cách kiểm tra / bỏ chọn nó.


1
Nếu bạn downvote vì bạn nhầm lẫn giữa menu Công cụ dành cho nhà phát triển và menu Chrome thì thật đáng buồn :(
theFreedomBanana

Không làm việc cho tôi. Tôi đã kiểm tra hộp Vô hiệu JavaScript, nhưng tập lệnh vẫn tiếp tục chạy.
Paul Gorbas

1

Bạn có thể làm điều đó, nhưng bạn phải chuẩn bị mã của bạn trước.

Hướng dẫn tạm dừng thực thi tập lệnh trong Google Chrome Dev Tools:

(1) Chuẩn bị mã của bạn trước, bằng cách tạo một biến toàn cục:

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

(2) Bất kỳ nơi nào bạn muốn thoát, hãy kiểm tra giá trị của biến này:

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

(3) Tạm dừng thực thi tập lệnh trên hoặc trước dòng thử nghiệm ở trên

(4) Chuyển sang bàn điều khiển

(5) Loại:

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

(6) Tiếp tục thực thi tập lệnh. Script sẽ return falsekhi nó thực hiện kiểm tra từ bước (2) ở trên


Ghi chú:

(A) Thủ thuật này hoạt động với các biến và đối tượng toàn cầu, nhưng nó sẽ không hoạt động với các biến cục bộ. Lưu ý rằng:
newVar = 'never used before';
tạo một thuộc tính mới của đối tượng cửa sổ (hoạt động với thủ thuật trên), trong khi điều này:
var newVar = 'never used before';
tạo một biến cục bộ (KHÔNG hoạt động với thủ thuật trên!)

(B) Vì vậy, bạn vẫn có thể sử dụng thủ thuật này với mã đã chạy nếu bạn có một biến toàn cục hoặc một đối tượng sẽ trả về false nếu nó có một giá trị nhất định.

(C) Trong một nhúm, bạn có thể sử dụng thủ thuật của juacala và xóa một phần tử khỏi DOM (trên tab phần tử) sẽ gây ra lỗi javascript. Ví dụ: giả sử bạn có mã var cartype = $('#cartype').val();Nếu bạn xóa phần tử có ID = cartypetrước dòng mã đó, thì js sẽ ngắt trên dòng đó. Tuy nhiên, phần tử vẫn sẽ bị thiếu khi bạn cố chạy lại mã. Thủ thuật được mô tả ở trên cho phép bạn chạy và chạy lại mã quảng cáo infinitum.


Ghi chú thêm:

(a) Chèn điểm dừng vào mã: chỉ cần gõ debugger; trên một dòng. Nếu DevTools mở, tập lệnh sẽ nhảy vào trình gỡ lỗi tại thời điểm đó. Nếu DevTools không mở, mã sẽ bỏ qua câu lệnh.

(b) Bạn muốn tránh nhảy vào thư viện jQuery khi gỡ lỗi mã? Hộp đen đó. Xem hướng dẫn hộp đen cho Chrome - hoặc - cho Firefox


Lòng biết ơn (vui lòng truy cập và upvote):

Gỡ lỗi Javascript theo từng dòng bằng Google Chrome

Có thể thay đổi giá trị biến javascript trong khi gỡ lỗi trong Google Chrome không?


2
Any place where you may wish to quit, test the value of this variableThật kinh khủng! Tôi muốn rời khỏi bất cứ nơi nào tôi có thể bước tới vào lúc này, tôi không biết trước nơi đó có thể là gì!
Michael

Nếu bạn sẵn sàng đưa công việc vào phía mã, đây là ứng dụng thân thiện nhất với máy khách đang cố gắng dừng thực thi tập lệnh.
Ngỗng

??? Bạn không cần bất kỳ biến toàn cầu. Chỉ cần nhấp vào nút này .
Dan Dascalescu

0

Bạn có thể tạm dừng trên bất kỳ mẫu XHR nào mà tôi thấy rất hữu ích trong quá trình gỡ lỗi các loại kịch bản này.

Ví dụ: tôi đã đưa ra điểm dừng trên một mẫu URL có chứa "/"

nhập mô tả hình ảnh ở đây


0

Nếu bạn có vòng lặp lừa đảo, hãy tạm dừng mã trong trình gỡ lỗi Google Chrome (nhỏ "|| nút " trong khi trong tab Nguồn).

Quay trở lại Chrome, mở "Trình quản lý tác vụ" ( Shift+ESC ), chọn tab của bạn, nhấp vào nút "Kết thúc quá trình".

Bạn sẽ nhận được thông báo Aww Snap và sau đó bạn có thể tải lại ( F5).

Như những người khác đã lưu ý, tải lại trang tại điểm tạm dừng cũng giống như khởi động lại vòng lặp lừa đảo và có thể gây ra các khóa khó chịu nếu trình gỡ lỗi cũng khóa (trong một số trường hợp dẫn đến khởi động lại chrome hoặc thậm chí PC). Trình gỡ lỗi cần nút "Dừng". Nb: Câu trả lời được chấp nhận đã lỗi thời vì một số khía cạnh của nó hiện đang sai. Nếu bạn bỏ phiếu cho tôi xuống, xin vui lòng giải thích :) .



-1

Mở tab nguồn trong 'Công cụ dành cho nhà phát triển', nhấp vào số dòng trong tập lệnh đang chạy, điều này sẽ tạo điểm dừng và trình gỡ lỗi sẽ ngắt ở đó.


-1

Có nhiều giải pháp phù hợp cho vấn đề này như đã đề cập ở trên trong bài đăng này, nhưng tôi đã tìm thấy một bản hack nhỏ có thể được đưa vào tập lệnh hoặc dán trong bảng điều khiển Chromes (trình gỡ lỗi) để đạt được nó:

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

Điều này sẽ khiến việc thực thi bị tạm dừng khi bạn nhấn F12.


Nếu bạn (hy vọng) không sử dụng jQuery thì sao?
Dan Dascalescu

sau đó sử dụng Javascript thuần túy, như document.addEveneListner .. để có được sự kiện keydown ..
Murtaza Hussain
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.