Come terminare l'esecuzione dello script durante il debug in Google Chrome?


210

Quando si passa attraverso il codice JavaScript nel debugger di Google Chrome, come posso terminare l'esecuzione dello script se non voglio continuare? L'unico modo che ho trovato è chiudere la finestra del browser.

Premendo "Ricarica questa pagina" si esegue il resto del codice e si inoltra anche i moduli come se si premesse F8 "Continua".

AGGIORNAMENTO :

Quando si preme F5 (Aggiorna) mentre uno script è in pausa:

  • Google Chrome (v22) esegue lo script. Se lo script invia una richiesta HTTP, viene visualizzata la risposta HTTP per quella richiesta. La pagina originale non viene aggiornata.
  • Internet Explorer 9 si blocca. Tuttavia, IE ha un'opzione "Stop Debugging" che, se premuto (a condizione che non sia stato premuto F5 in precedenza), continua a eseguire lo script all'esterno del debugger.
  • Firebug si comporta in modo identico a Chrome.

Chiudere e riaprire nuovamente la finestra del browser non è sempre il modo più semplice successivo perché ucciderà lo stato della sessione del browser e questo potrebbe essere importante. Anche tutti i tuoi punti di interruzione vengono persi.

AGGIORNAMENTO (gennaio 2014) :

Aggiorna durante il debug:

  • Chrome v31: consente l'esecuzione degli script e si arresta su ulteriori punti di interruzione (ma non invia richieste Ajax), quindi si aggiorna.
  • IE 11: l'aggiornamento non fa nulla, ma è possibile premere F5 per continuare.
  • Firefox v26: consente l'esecuzione degli script ma non si interrompe su ulteriori punti di interruzione, invia richieste Ajax, quindi aggiorna.

Tipo di progresso!

Passa alla stessa pagina durante il debug:

  • Chrome v31: uguale a Aggiorna.
  • IE 11: gli script sono terminati, la nuova sessione del browser viene avviata (come chiudere e riaprire).
  • Firefox v26: non succede nulla.

Anche juacala ha suggerito una soluzione efficace. Ad esempio, se si utilizza jQuery, l'esecuzione di delete $ dalla console interromperà l'esecuzione quando si incontra un metodo jQuery. L'ho testato in tutti i browser sopra e posso confermare che funziona.

AGGIORNAMENTO (marzo 2015) :

Infine, dopo oltre 2 anni e quasi 10.000 visualizzazioni, Alexander K. ha fornito la risposta giusta con un proprio Task Manager che può uccidere un processo di tabulazione senza chiudere la scheda stessa, mantenendo intatti tutti i punti di interruzione e altre cose.

Sono persino arrivato a BrowserStack.com per testarlo in Chrome v22 e ho scoperto che funzionava in questo modo anche a quel tempo.

La soluzione alternativa di Juacala è ancora utile durante il debug in Internet Explorer o Firefox.

AGGIORNAMENTO (gennaio 2019) :

Chrome Dev Tools alla fine ha aggiunto un modo corretto per interrompere l'esecuzione degli script, il che è carino (anche se un po 'nascosto). Fare riferimento alla risposta di James Gentes per i dettagli.


12
digita debugger;nella console degli strumenti di sviluppo e metterà immediatamente le cose nel debugger e fermerà lo script.
Jake,

3
La risposta di James Gentes sembra essere una soluzione migliore nel 2019
Spikolynn,

1
Perché tutti parlano di interrompere la sceneggiatura? Si tratta di terminare / rompere tutto il codice "follow / sceduled" a venire.
Andre Elrico,

Risposte:


188

In Chrome è presente "Task Manager", accessibile tramite Shift+ ESCo tramite

Menu → Altri strumenti → Task Manager

È possibile selezionare l'attività della pagina e terminarla premendo il pulsante "Termina processo".


4
chrome 48questo chiuderà solo lo strumento Dev e non lo terminerà, riaprendolo, è possibile vedere il programma ancora in esecuzione ( tried setInterval())
Abdelouahab

11
Non vedo "Task Manager" in "Altri strumenti" e shift + esc non fa nulla ... (Chrome 50, OSX) Shift + ESC funziona su Chrome / Windows però ...
Michael,

2
Wow, lo volevo da così tanto tempo ed è stato lì per anni! Questa è la risposta StackOverflow più utile che ho visto tutto l'anno!
Michael Scheper,

4
Su Macintosh (Chrome v.63) questa opzione è disponibile nel menu "Finestra", nel terzo gruppo. Non è evidente alcuna scorciatoia da tastiera.
Apollo,

2
Questo ucciderà la scheda
htafoya,

105

A partire da aprile 2018, puoi interrompere loop infiniti in Chrome :

  1. Apri il pannello Sorgenti in Strumenti per gli sviluppatori ( Ctrl+ Shift+ I**).
  2. Fare clic sul Pausa pulsante per sospendere l'esecuzione di script .

Nota anche i tasti di scelta rapida: F8e Ctrl+\

inserisci qui la descrizione dell'immagine


Una gemma così nascosta su quell'interfaccia utente.
norbert,

Il risponditore ha una chiave per i segreti dell'Universo.
Sam,

Il collegamento è particolarmente utile quando si dispone di uno script in esecuzione senza fine che si desidera interrompere per controllare la console. Grazie.
Alexei,

@DanDascalescu Ho Chrome 80.0.3987.149 e sembra lo stesso
James Gentes

Forse stiamo guardando il pulsante in diversi stati di esecuzione? Il mio è che ho scelto l' bodyelemento qui su SO, ho impostato "break on -> subtree modifiche", quindi ho fatto clic ovunque. Il pulsante appare come nello screenshot che ho pubblicato.
Dan Dascalescu

37

Un modo per farlo è mettere in pausa lo script, guardare quale codice segue dove sei attualmente fermato, ad esempio:

var something = somethingElse.blah;

Nella console, procedi come segue:

delete somethingElse;

Quindi riproduci lo script: causerà un errore irreversibile quando proverà ad accedere somethingElsee lo script morirà. Voilà, hai terminato la sceneggiatura.

EDIT: originariamente, ho eliminato una variabile. Non è abbastanza buono. Devi eliminare una funzione o un oggetto di cui JavaScript tenta di accedere a una proprietà.


3
you have to delete a function or an objectun trucco così brutto! (nell'interfaccia utente si adatterebbe perfettamente come pulsante di eliminazione di tutti )
Mars Robertson,

È piuttosto brutto, ma non riesco a pensare ad un altro modo.
juacala,

L'anno dopo sto tornando alla stessa domanda ... E non riesco a capirlo! C'è un modo per renderlo più generico?
Mars Robertson,

Non riesci a capire come terminare l'esecuzione dello script? Sono sempre stato in grado di farlo. Hai un esempio che non ti consente di uccidere la sceneggiatura in questo modo?
juacala,

1
@Hashim, devi essere in grado di inserire un punto di interruzione all'interno della funzione. Quindi assicurati che l'interno della funzione sia su una linea separata dalla definizione della funzione. Nel tuo caso, dovrai farlo nella console, una volta messo in pausa, digita "document.getElementById ('see_older'). ParentNode.removeChild (document.getElementById ('see_older'));". Questo perché non hai nulla in javascript da interrompere. Sfortunatamente, anche questo cambia l'HTML. Se puoi cambiare il codice in "var el = document.getElementById ('see_older'); \ n el.getEl ..." allora puoi semplicemente fare "elimina el;" e questo lo fermerà.
juacala,

12

Aggiornamento di aprile 2020

A partire da Chrome 80, nessuna delle risposte correnti funziona. Non è visibile il pulsante "Pausa": è necessario fare clic a lungo sul pulsante "Riproduci" per accedere all'icona Stop:

Interrompere l'esecuzione degli script in Chrome DevTools


2
Grazie Dio! Una vera risposta alla domanda del PO.
user1023110

1
@ user1023110: Non conosco Dio ma sei il benvenuto :)
Dan Dascalescu il

5

Se lo riscontri durante l'utilizzo debuggerdell'istruzione,

debugger;

... quindi penso che la pagina continuerà a funzionare per sempre fino a quando il js runtime cede o alla prossima interruzione. Supponendo che tu sia in modalità break-on-error (l'icona di pausa icona), puoi assicurarti che si verifichi una pausa invece facendo qualcosa del tipo:

debugger;throw 1;

o forse chiamare una funzione inesistente:

debugger;z();

(Naturalmente questo non aiuta se si sta cercando di passo attraverso le funzioni, anche se forse si potrebbe aggiungere in modo dinamico in una throw 1o z()o somesuch nel pannello Fonti, ctrl-S per salvare, e poi Ctrl-R per aggiornare ... questo può comunque saltare un punto di interruzione, ma può funzionare se sei in un ciclo.)

Se stai eseguendo un ciclo e prevedi di attivare debuggernuovamente l' istruzione, puoi semplicemente digitare throw 1.

throw 1;

Quindi quando premi Ctrl-R, verrà lanciato il lancio successivo e la pagina verrà aggiornata.

(testato con Chrome v38, circa aprile 2017)


3

Bella domanda qui Penso che non sia possibile interrompere l'esecuzione dello script. Anche se non l'ho mai cercato, ho usato il debugger di Chrome per molto tempo al lavoro. Di solito imposto punti di interruzione nel mio codice javascript e quindi eseguo il debug della parte di codice che mi interessa. Al termine del debug di quel codice, di solito eseguo semplicemente il resto del programma o aggiorno il browser.

Se si desidera impedire l'esecuzione del resto dello script (ad es. A causa di chiamate AJAX che verranno effettuate), l'unica cosa che si può fare è rimuovere quel codice nella console al volo, evitando così quelle chiamate dall'esecuzione , quindi è possibile eseguire il codice rimanente senza problemi.

Spero che aiuti!

PS: ho provato a scoprire un'opzione per terminare l'esecuzione in alcuni tutorial / guide come i seguenti, ma non sono riuscito a trovarlo. Come ho detto prima, probabilmente non esiste tale opzione.

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

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


Ho aiutato? Sembra che non ci sia un'opzione di terminazione, ma per impedire l'esecuzione del seguente codice è possibile commentarlo prima o eliminare il seguente codice / chiamare "live" all'interno del debugger di Chrome (quest'ultima opzione farà il pulsante continua comportarsi come un termine). So che non sono soluzioni ideali, ma penso che siano le più accettabili. Qualche commento?
Romén Rodríguez-Gil,

1
In molti casi, il codice che deve essere impedito all'esecuzione è nello stack di chiamate (le funzioni che otterranno il controllo dopo il ritorno della funzione corrente). Certo, posso andare e modificare le funzioni nello stack di chiamate, quindi trovare e modificare tutte le funzioni che potrebbero essere chiamate in modo asincrono. Sono sicuro che deve essere una cosa banale per un browser aggiornare una pagina con lo script ancora nello stato di pausa SE è stato messo in pausa al momento della pressione del pulsante Aggiorna pagina. Penso anche che dovrebbe essere un comportamento previsto per qualsiasi browser (purtroppo non lo è).
srgstm,

2
In realtà ho trovato una soluzione alternativa per terminare l'esecuzione dello script !: In Chrome, apro il debugger per eseguire il debug di una delle mie applicazioni e ho impostato un punto di interruzione. Corro la pagina. L'esecuzione si interrompe al punto di interruzione. Quindi esamino il problema e realizzo cosa sta causando il bug. Per terminare l'esecuzione, faccio clic sul pulsante X accanto all'URL (per interrompere il caricamento della pagina) e quindi, continuando lo script (F8), verrà chiuso. Penso che sia un modo piuttosto semplice per raggiungerlo. Cosa ne pensi di questo?
Romén Rodríguez-Gil,

Il pulsante X in Chrome viene sostituito con il pulsante Aggiorna dopo che una pagina è stata caricata, quindi non c'è modo di premere X in seguito (l'ho provato anche in IE che ha X sempre disponibile, ma si blocca invariabilmente). Ho anche testato il tuo suggerimento durante il caricamento della pagina e ho scoperto che lo script non termina dopo aver premuto X e poi F8. È probabile che gli script che non sono stati ancora caricati nel browser al momento della pressione di X non vengano caricati in seguito, ma ciò dovrebbe essere evidente.
srgstm,

Oh hai ragione, è stato un test rapido ed è stato non rappresentativo ... Quindi sembra che non ci sia soluzione.
Romén Rodríguez-Gil,

3

Facendo riferimento alla risposta data da @scottndecker alla seguente domanda , Chrome ora fornisce un'opzione "disabilita JavaScript" sotto Strumenti di sviluppo:

  • Verticale ...in alto a destra
  • impostazioni
  • E sotto 'Preferenze' vai alla sezione 'Debugger' in fondo e seleziona 'Disabilita JavaScript'

La cosa buona è che puoi fermarti ed eseguire di nuovo semplicemente selezionandolo / deselezionandolo.


1
Se decidi di votare perché sei confuso tra il menu Strumenti per sviluppatori e il menu Chrome, è molto triste :(
theFreedomBanana

Non ha funzionato per me. Ho selezionato la casella Disabilita JavaScript, ma lo script continua a funzionare.
Paul Gorbas,

1

Puoi farlo, ma devi prima preparare il tuo codice.

Istruzioni per interrompere l'esecuzione degli script in Google Chrome Dev Tools:

(1) Preparare prima il codice, creando una variabile globale :

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

(2) Qualsiasi luogo in cui potresti voler uscire, verifica il valore di questa variabile:

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

(3) Metti in pausa l'esecuzione dello script prima o dopo le righe di test sopra

(4) Passa alla console

(5) Tipo:

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

(6) Continua l'esecuzione dello script. Lo script return falseeseguirà il test dal passaggio (2) sopra


Appunti:

(A) Questo trucco funziona con variabili e oggetti globali, ma non con variabili locali. Nota che:
newVar = 'never used before';
crea una nuova proprietà dell'oggetto finestra (funziona con il trucco sopra), mentre questo:
var newVar = 'never used before';
crea una variabile locale (NON funziona con il trucco sopra!)

(B) Quindi, puoi ancora usare questo trucco con il codice già in esecuzione se hai una variabile globale o un oggetto che restituirà false se ha un dato valore.

(C) In un pizzico, puoi usare il trucco di juacala ed eliminare un elemento dal DOM (nella scheda degli elementi) che causerà un errore javascript. Ad esempio, supponi di avere un codice var cartype = $('#cartype').val();Se elimini l'elemento con ID = cartypeprima di quella riga di codice, allora js si interromperà su quella riga. Tuttavia, l'elemento mancherà comunque quando si tenta di rieseguire il codice. Il trucco sopra descritto consente di eseguire e rieseguire il codice all'infinito.


Altre note:

(a) Inserire il punto di interruzione nel codice: basta digitare debugger;su una riga da solo. Se DevTools è aperto, lo script passerà al debugger a quel punto. Se DevTools non si apre, il codice ignorerà l'istruzione.

(b) Vuoi evitare di saltare nella libreria jQuery durante il debug del codice? Blackbox esso. Consulta le istruzioni della blackbox per Chrome - o - per Firefox


Gratitudine (visita e vota):

Debug Javascript riga per riga utilizzando Google Chrome

È possibile modificare i valori delle variabili javascript durante il debug in Google Chrome?


2
Any place where you may wish to quit, test the value of this variableÈ orribile! Voglio smettere ovunque mi trovo a fare un passo in questo momento, non so in anticipo dove potrebbe essere!
Michael,

Se sei disposto a lavorare sul lato del codice, questo è il più intuitivo sul client che cerca di interrompere l'esecuzione dello script.
Oca,

??? Non hai bisogno di alcuna variabile globale. Basta fare clic su questo pulsante .
Dan Dascalescu,

0

Puoi mettere in pausa qualsiasi modello XHR che trovo molto utile durante il debug di questo tipo di scenari.

Ad esempio, ho fornito il punto di interruzione su un pattern URL contenente "/"

inserisci qui la descrizione dell'immagine


0

Se hai un loop non autorizzato, metti in pausa il codice nel debugger di Google Chrome (il piccolo ||pulsante " " mentre sei nella scheda Sorgenti).

Torna a Chrome stesso, apri "Task Manager" ( Shift+ ESC), seleziona la scheda, fai clic sul pulsante "Termina processo".

Riceverai il messaggio Aww Snap e potrai ricaricare ( F5).

Come altri hanno notato, ricaricare la pagina al punto di pausa è lo stesso di riavviare il loop non autorizzato e può causare cattivi blocchi se anche il debugger si blocca (in alcuni casi portando a riavviare Chrome o persino il PC). Il debugger necessita di un pulsante "Stop". Nb: la risposta accettata non è aggiornata in quanto alcuni aspetti di essa sono ora apparentemente sbagliati. Se mi voti in basso, spiega :) .



-1

Apri la scheda sorgente in "Strumenti per gli sviluppatori", fai clic su un numero di riga in uno script in esecuzione, questo creerà un punto di interruzione e il debugger si interromperà lì.


-1

Esistono molte soluzioni appropriate a questo problema, come menzionato sopra in questo post, ma ho trovato un piccolo trucco che può essere inserito nella sceneggiatura o incollato nella console di Chromes (debugger) per ottenerlo:

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

Ciò causerà la sospensione dell'esecuzione quando si colpisce F12.


Che cosa succede se (si spera) non usi jQuery?
Dan Dascalescu,

quindi utilizza Javascript puro, come document.addEveneListner .. per ottenere l'evento keydown ..
Murtaza Hussain
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.