Google Chrome'da hata ayıklarken komut dosyası yürütmeyi nasıl sonlandırabilirim?


210

Google Chrome hata ayıklayıcısında JavaScript kodundan geçerken, devam etmek istemiyorsam komut dosyası yürütmeyi nasıl sonlandırabilirim? Bulduğum tek yol tarayıcı penceresini kapatmak.

"Bu sayfayı yeniden yükle" düğmesine basmak kodun geri kalanını çalıştırır ve hatta formları F8 "Devam" düğmesine basmış gibi gönderir.

GÜNCELLEME :

Bir komut dosyası duraklatılmış durumdayken F5'e (Yenile) basarken:

  • Google Chrome (v22) komut dosyasını çalıştırır. Komut dosyası HTTP isteğini gönderirse, bu istek için HTTP yanıtı görüntülenir. Orijinal sayfa yenilenmez.
  • IE 9 sadece donuyor. Ancak IE, (daha önce F5'e basmamanız koşuluyla) komut dosyasını hata ayıklayıcı dışında çalıştırmaya devam eden "Hata Ayıklamayı Durdur" seçeneğine sahiptir.
  • Firebug, Chrome ile aynı şekilde çalışır.

Tarayıcı penceresinin kapatılıp yeniden açılması her zaman bir sonraki en kolay yol değildir çünkü tarayıcı oturum durumunu öldürür ve bu önemli olabilir. Tüm kesme noktalarınız da kaybolur.

GÜNCELLEME (Oca 2014) :

Hata ayıklama sırasında yenile:

  • Chrome v31: komut dosyalarının çalışmasına izin verir ve daha fazla kesme noktasında durur (ancak ajax istekleri göndermez), ardından yeniler.
  • IE 11: refresh hiçbir şey yapmaz, ancak devam etmek için F5 tuşuna basabilirsiniz.
  • Firefox v26: komut dosyalarının çalışmasına izin verir, ancak daha fazla kesme noktasında durmaz, ajax isteklerini gönderir, sonra yeniler.

Bir tür ilerleme!

Hata ayıklama sırasında aynı sayfaya gidin:

  • Chrome v31: Yenile ile aynı.
  • IE 11: komut dosyaları sonlandırılır, yeni tarayıcı oturumu başlatılır (kapatma ve yeniden açma ile aynı).
  • Firefox v26: hiçbir şey olmuyor.

Ayrıca juacala etkili bir çözüm önerdi. Örneğin, jQuery kullanıyorsanız, herhangi bir jQuery yöntemi ile karşılaşıldığında delete $ komutunun konsoldan çalıştırılması durdurulur. Yukarıdaki tüm tarayıcılarda test ettim ve çalıştığını onaylayabilirim.

GÜNCELLEME (Mar 2015) :

Son olarak, 2 yıldan fazla ve neredeyse 10 bin görüntülemeden sonra, Alexander K tarafından doğru cevap verildi. Google Chrome'un, bir sekme işlemini olmadan öldürebilen kendi Görev Yöneticisi vardır bozulmamış tüm kesme noktaları ve diğer şeyler tutarak sekme kendisi kapanış.

Hatta Chrome v22'de test etmek için BrowserStack.com'a kadar gittim ve bunun o zaman bile bu şekilde çalıştığını buldum.

Juacala'nın geçici çözümü IE veya Firefox'ta hata ayıklama sırasında hala yararlıdır.

GÜNCELLEME (Oca 2019) :

Chrome Dev Tools nihayet güzel (biraz gizli olsa da) komut dosyası yürütmeyi durdurmak için uygun bir yol ekledi. Ayrıntılar için James Gentes'in cevabına bakınız.


12
yazın debugger;dev araçları konsoluna ve hemen ayıklayıcıya şeyler koymak ve senaryoyu duracaktır.
Jake

3
James Gentes'in cevabı 2019'da daha iyi bir çözüm gibi görünüyor
Spikolynn

1
Neden herkes senaryoyu durdurmaktan bahsediyor? Bu, gelecekteki "takip eden / yönetilen" kodun sonlandırılması / kesilmesi ile ilgilidir.
Andre Elrico

Yanıtlar:


188

Chrome'da Shift+ ESCveya üzerinden erişilebilen "Görev Yöneticisi" var

Menü → Diğer Araçlar → Görev Yöneticisi

Sayfa görevinizi seçip "İşlemi Sonlandır" düğmesine basarak bitirebilirsiniz.


4
chrome 48bu sadece Dev aracını KAPATACAK ve sonlandırmayacak, yeniden açacak, programın hala çalıştığını görebilirsiniz ( tried setInterval())
Abdelouahab

11
"Diğer Araçlar" altında "Görev Yöneticisi" ni görmüyorum ve shift + esc hiçbir şey yapmıyor ... (Chrome 50, OSX) Shift + ESC, Chrome / Windows altında da çalışıyor ...
Michael

2
Vay canına — Bunu çok uzun zamandır istedim ve yıllardır orada! Bu, tüm yıl boyunca gördüğüm en yararlı StackOverflow cevabı!
Michael Scheper

4
Macintosh'ta (Chrome v.63) bu seçenek üçüncü grupta "Pencere" menüsünün altında gösterilir. Belirgin bir klavye kısayolu yoktur.
Apollo

2
Bu sekmeyi öldürecek
htafoya

105

Nisan 2018 itibarıyla, Chrome'da sonsuz döngüleri durdurabilirsiniz :

  1. Geliştirici Araçları'nda Kaynaklar panelini açın ( Ctrl+ Shift+ I**).
  2. Kod yürütmesini duraklatmak için Duraklat düğmesine tıklayın .

Ayrıca kısayol tuşlarına da dikkat edin: F8ve Ctrl+\

resim açıklamasını buraya girin


UI'de böyle gizli bir mücevher.
norbert

Cevaplayıcının Evrenin sırları için bir anahtarı vardır.
Sam

Kısayol özellikle, konsolu kontrol etmek için durdurmak istediğiniz durmak bilmeyen bir betiğiniz olduğunda kullanışlıdır. Teşekkürler.
Alexei

@DanDascalescu Chrome 80.0.3987.149'um var ve aynı görünüyor
James Gentes

Belki farklı yürütme durumlarındaki düğmeye bakıyoruz? Benim bodyöyleyse burada öğeyi SO'da seçtim, bir "break on -> subtree modifikasyonları" ayarladım, sonra her yere tıkladım. Düğme, gönderdiğim ekran görüntüsünde gibi görünüyor.
Dan Dascalescu

37

Bunu yapmanın bir yolu betiği duraklatmaktır, şu anda durduğunuz yerde hangi kodun takip edildiğine bakın, örneğin:

var something = somethingElse.blah;

Konsolda aşağıdakileri yapın:

delete somethingElse;

Sonra komut dosyasını oynatın: erişmeye çalıştığında ölümcül bir hataya neden olur somethingElseve komut dosyası ölür. Voila, senaryoyu sonlandırdın.

EDIT: Aslında bir değişkeni sildim. Yeterince iyi değil. JavaScript'in bir özelliğe erişmeye çalıştığı bir işlevi veya nesneyi silmeniz gerekir.


3
you have to delete a function or an objectne kadar kötü bir hack! (kullanıcı arayüzünde tüm düğmeleri öldürmek için uygun olurdu )
Mars Robertson

Oldukça kötü, ama başka bir yol düşünemiyorum.
juacala

Yıl sonra aynı soruya dönüyorum ... Ve çözemiyorum! Daha genel hale getirmenin bir yolu var mı?
Mars Robertson

Komut dosyası yürütmeyi nasıl sonlandıracağınızı anlayamıyorsunuz? Bunu her zaman yapabildim. Senaryoyu bu şekilde öldürmene izin vermeyen bir örneğin var mı?
juacala

1
@Hashim, işlevin içine bir kırılma noktası koymanız gerekir. Bu nedenle, işlevin içinin işlev tanımından ayrı bir satırda olduğundan emin olun. Sizin durumunuzda, duraklatıldıktan sonra konsolda "document.getElementById ('see_older'). ParentNode.removeChild (document.getElementById ('see_older'));" yazın. Bunun nedeni, javascript'te kırılacak hiçbir şeyin olmamasıdır. Ne yazık ki, bu HTML'yi de değiştirir. Kodu "var el = document.getElementById ('see_older'); \ n el.getEl ..." olarak değiştirebilirseniz "delete el;" ve bu onu durduracak.
juacala

12

2020 Nisan güncellemesi

Chrome 80'den itibaren, mevcut yanıtların hiçbiri işe yaramıyor. Görünür bir "Duraklat" düğmesi yoktur - Durdur simgesine erişmek için "Oynat" düğmesini uzun tıklamanız gerekir:

Chrome DevTools'ta komut dosyası yürütülmesini durdurma


2
Tanrıya şükür! OP sorusuna gerçek bir cevap.
user1023110

1
@ user1023110: Tanrı'yı ​​bilmiyorum ama rica ederim :)
Dan Dascalescu

5

İfadeyi kullanırken bununla karşılaşıyorsanız debugger,

debugger;

... o zaman js çalışma zamanı verene veya bir sonraki molaya kadar sayfa sonsuza kadar çalışmaya devam edeceğini düşünüyorum. Hata kırılma modunda olduğunuzu varsayarsak (duraklatma simgesi geçişi), bunun gibi bir şey yaparak bir ara verilmesini sağlayabilirsiniz:

debugger;throw 1;

veya var olmayan bir işlevi çağırabilir:

debugger;z();

(Tabii ki bu işlevler arasında adım atmaya çalışıyorsanız, belki de dinamik olarak bir throw 1veyaz() ya Kaynakları panelinde somesuch, ctrl-S kaydetmek için, ve sonra ctrl-R ... Bu yenilemek için ancak bir kesme noktasını atlayabilir, ancak bir döngüdeyseniz çalışabilir.)

Bir döngü yapıyorsanız ve debuggerifadeyi tekrar tetiklemeyi düşünüyorsanız, throw 1bunun yerine yazmanız yeterlidir.

throw 1;

Sonra ctrl-R'ye bastığınızda, sonraki atış vurulur ve sayfa yenilenir.

(Chrome v38 ile test edildi, Nisan 2017 dolaylarında)


3

Güzel soru burada. Senaryoyu yürütmeyi sonlandıramayacağınızı düşünüyorum. Daha önce hiç aramadığım halde, krom hata ayıklayıcıyı uzun süredir işte kullanıyorum. Genellikle javascript kodumda kesme noktaları ayarlamak ve sonra ilgilendiğim kod kısmı hata ayıklama. Bu kodda hata ayıklama bitirdiğimde, genellikle sadece programın geri kalanını çalıştırın veya tarayıcı yenileyin.

Komut dosyasının geri kalanının yürütülmesini önlemek istiyorsanız (örneğin, yapılacak AJAX çağrıları nedeniyle) yapabileceğiniz tek şey, bu kodu anında konsolda kaldırmak, böylece bu çağrıları önlemek idam edilmekten , o zaman sorunsuz kalan kod yürütebilir.

Umarım bu yardımcı olur!

Not: Aşağıdaki gibi bazı öğreticiler / rehberlerde yürütmeyi sonlandırmak için bir seçenek bulmaya çalıştım, ancak bulamadım. Daha önce söylediğim gibi, muhtemelen böyle bir seçenek yoktur.

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

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


Yardım ettim mi? Bir sonlandırma seçeneği yok gibi görünüyor, ancak aşağıdaki kodun yürütülmesini önlemek için kodu daha önce yorumlayabilir veya Chrome hata ayıklayıcısında aşağıdaki kodu silebilir / "canlı" olarak çağırabilirsiniz (bu son seçenek devam düğmesini yapar sonlandırmak gibi davran). İdeal çözüm olmadığını biliyorum, ama en kabul edilebilir çözüm olduğunu düşünüyorum. Herhangi bir yorum?
Romén Rodríguez-Gil

1
Birçok durumda, yürütülmesi engellenmesi gereken kod, çağrı yığınıdır (geçerli işlev döndükten sonra kontrolü alacak işlevler). Elbette, çağrı yığınına kadar işlevleri düzenleyebilir ve ardından eşzamansız olarak çağrılabilecek tüm işlevleri bulabilir ve düzenleyebilirim. Eminim, bir sayfayı Sayfa Yenileme düğmesine basıldığında duraklatılmışsa, bir sayfanın hala duraklatılmış durumdayken sayfayı yenilemesi önemsiz bir şey olmalıdır. Ayrıca herhangi bir tarayıcı için beklenen bir davranış olması gerektiğini düşünüyorum (ne yazık ki, değil).
srgstm

2
Aslında betik yürütmesinin sonlandırılması için bir çözüm buldum !: Chrome'da, uygulamalarımdan birinde hata ayıklamak için hata ayıklayıcıyı açtım ve bir kesme noktası belirledim. Sayfayı çalıştırıyorum. Yürütme kesme noktasında duraklar. Sonra sorunu inceliyorum ve hataya neyin neden olduğunu anlıyorum. Yürütmeyi sonlandırmak için URL'nin yanındaki X düğmesini tıklatıyorum (sayfa yüklenmesini durdurmak için) ve sonra komut dosyasına (F8) devam ederken sonlandırılacak. Bunu başarmanın oldukça kolay yolu sanırım. Bunun hakkında ne düşünüyorsun?
Romén Rodríguez-Gil

Bir sayfa yüklendikten sonra Chrome'daki X düğmesi Yenile düğmesi ile değiştirilir, bu nedenle X'e daha sonra basmanın bir yolu yoktur (X'de her zaman kullanılabilir olan IE'de de denedim, ancak her zaman donuyor). Ayrıca sayfa yükleme sırasında öneriyi test ettim ve X ve ardından F8'e bastıktan sonra komut dosyasının sona ermediğini buldum. X'e basıldığında henüz tarayıcıya yüklenmemiş olan komut dosyalarının daha sonra yüklenmemiş olması muhtemeldir, ancak bu açık olmalıdır.
srgstm

Oh haklısın, hızlı bir testti ve temsili değildi ... O zaman çözüm yok gibi görünüyor.
Romén Rodríguez-Gil

3

Aşağıdakilere @scottndecker verdiği yanıta atıfta soruya , krom şimdi Geliştirici Araçları altında 'devre dışı JavaScript' seçeneği sağlar:

  • ...Sağ üstte dikey
  • Ayarlar
  • 'Tercihler' altında, en alttaki 'Hata Ayıklayıcı' bölümüne gidin ve 'JavaScript'i devre dışı bırak' seçeneğini belirleyin

İyi bir şey, sadece kontrol / işaretini kaldırarak durup tekrar çalıştırabilmenizdir.


1
Geliştirici Araçları menüsü ile Chrome menüsü arasında kafanız karıştığı için oy vermeniz çok üzücü :(
theFreedomBanana

Benim için çalışmadı. JavaScript'i Devre Dışı Bırak kutusunu işaretledim, ancak komut dosyası çalışmaya devam ediyor.
Paul Gorbas

1

Bunu yapabilirsiniz, ancak önce kodunuzu hazırlamanız gerekir.

Google Chrome Geliştirme Araçları'nda komut dosyası yürütülmesini durdurma talimatları:

(1) Önce global bir değişken oluşturarak kodunuzu hazırlayın :

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

(2) Çıkmak isteyebileceğiniz herhangi bir yer, bu değişkenin değerini test edin:

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

(3) Yukarıdaki test satır (lar) ında veya öncesinde komut dosyasının yürütülmesini duraklat

(4) Konsola geç

(5) Türü:

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

(6) Komut dosyasının yürütülmesine devam edin. Komut dosyası, return falseyukarıdaki adım (2) 'den testi gerçekleştirdiğinde çalışır


Notlar:

(A) Bu hile global değişkenler ve nesnelerle çalışır, ancak yerel değişkenlerle çalışmaz. Bunun:
newVar = 'never used before';
pencere nesnesinin yeni bir özelliğini oluşturduğunu unutmayın (yukarıdaki hile ile çalışır), bununla birlikte:
var newVar = 'never used before';
yerel bir değişken oluşturur (yukarıdaki hile ile çalışmaz!)

(B) Öyleyse, hala kod zaten çalışan ile bu hileyi kullanabilirsiniz eğer bir değişkeniniz varsa veya belirli bir değere sahipse false döndürecek bir nesneniz .

(C) Bir tutamda, juacala'nın hünerini kullanabilir ve bir javascript hatasına neden olacak DOM'dan (öğeler sekmesinde) bir öğe silebilirsiniz. Örneğin, kodunuz olduğunu varsayalım Bu kod satırından önce var cartype = $('#cartype').val();ID = olan öğeyi silerseniz cartype, js bu satırda kesilir. Ancak, kodu yeniden çalıştırmayı denediğinizde öğe yine de eksik olacaktır. Yukarıda açıklanan hile, kod reklam sonsuzunu çalıştırmanıza ve yeniden çalıştırmanıza olanak tanır .


Diğer notlar:

(a) Kod içine kesme noktası ekleyin: sadece debugger;kendi başına bir satır yazın . DevTools açıksa, komut dosyası bu noktada hata ayıklayıcıya atlar. DevTools açık değilse, kod deyimi yok sayar.

(b) Kod hatalarını ayıklarken jQuery kitaplığına atlamaktan kaçınmak ister misiniz? Kara kutu. Chrome için blackbox talimatlarına bakın - veya Firefox için -


Şükran (lütfen ziyaret edin ve oy verin):

Javascript Google Chrome kullanarak satır satır hata ayıklama

Google Chrome'da hata ayıklama sırasında javascript değişken değerlerini değiştirmek mümkün müdür?


2
Any place where you may wish to quit, test the value of this variableBu korkunç! Şu anda adım attığım yerden çıkmak istiyorum, bunun nerede olabileceğini önceden bilmiyorum!
Michael

İşi kod tarafına koymak istiyorsanız, komut dosyasının yürütülmesini durdurmaya çalışan istemcideki en kullanıcı dostu budur.
Kaz

??? Global değişkene ihtiyacınız yok. Sadece bu düğmeye tıklayın .
Dan Dascalescu

0

Bu tür senaryolarda hata ayıklama sırasında çok yararlı bulduğum herhangi bir XHR desenini duraklatabilirsiniz.

Örneğin, "/" içeren bir URL kalıbında kesme noktası verdim

resim açıklamasını buraya girin


0

Bir dolandırıcılık döngünüz varsa, kodu Google Chrome hata ayıklayıcısında (küçük "|| Kaynaklar sekmesindeyken " düğmesi) .

Chrome'un kendisine geri dönün, "Görev Yöneticisi" ni açın ( Shift+ESC ) açın, sekmenizi seçin, "İşlemi Sonlandır" düğmesini tıklayın.

Aww Snap mesajını alırsınız ve sonra yeniden yükleyebilirsiniz ( F5).

Diğerlerinin de belirttiği gibi, sayfayı duraklama noktasında yeniden yüklemek, haydut döngüsünü yeniden başlatmakla aynıdır ve hata ayıklayıcı da kilitlenirse kötü kilitlenmelere neden olabilir (bazı durumlarda kromun veya PC'nin yeniden başlatılmasına neden olur). Hata ayıklayıcı bir "Durdur" düğmesine ihtiyaç duyar. Not: Kabul edilen cevap güncel değil, çünkü bazı yönleri şimdi yanlış görünüyor. Bana oy verirsen, lütfen açıkla :) .



-1

'Geliştirici Araçları' içindeki kaynak sekmesini açın, çalışan bir komut dosyasında bir satır numarasını tıklayın, bu bir kesme noktası oluşturur ve hata ayıklayıcı orada kırılır.


-1

Bu yazıda yukarıda belirtildiği gibi bu soruna birçok uygun çözüm vardır, ancak ben komut dosyasına yerleştirilebilir veya bunu elde etmek için Chromes konsolunda (hata ayıklayıcı) yapıştırılabilir küçük bir kesmek bulduk:

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

Bu, vurduğunuzda yürütmenin duraklatılmasına neden olur F12.


Ya (umarım) jQuery kullanmıyorsanız?
Dan Dascalescu

sonra keydown olayını almak için document.addEveneListner .. gibi saf Javascript kullanın ..
Murtaza Hussain
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.