Comment mettre fin à l'exécution du script lors du débogage dans Google Chrome?

210

Lorsque vous parcourez le code JavaScript dans le débogueur Google Chrome, comment puis-je mettre fin à l'exécution du script si je ne souhaite pas continuer? La seule façon que j'ai trouvée est de fermer la fenêtre du navigateur.

Appuyer sur "Recharger cette page" exécute le reste du code et envoie même des formulaires comme si vous appuyez sur F8 "Continuer".

MISE À JOUR :

Lorsque vous appuyez sur F5 (Actualiser) alors qu'un script est en pause:

  • Google Chrome (v22) exécute le script. Si le script soumet une demande HTTP, la réponse HTTP pour cette demande s'affiche. La page d'origine n'est pas actualisée.
  • IE 9 se bloque simplement. Cependant, IE a une option "Arrêter le débogage" qui, une fois enfoncée (à condition que vous n'ayez pas appuyé sur F5 plus tôt), continue d'exécuter le script en dehors du débogueur.
  • Firebug se comporte de manière identique à Chrome.

La fermeture puis la réouverture de la fenêtre du navigateur n'est pas toujours la solution la plus simple, car elle tuera l'état de la session du navigateur et cela peut être important. Tous vos points d'arrêt sont également perdus.

MISE À JOUR (janvier 2014) :

Actualiser pendant le débogage:

  • Chrome v31: permet aux scripts de s'exécuter et s'arrête sur d'autres points d'arrêt (mais ne soumet pas de demandes ajax), puis s'actualise.
  • IE 11: l'actualisation ne fait rien, mais vous pouvez appuyer sur F5 pour continuer.
  • Firefox v26: permet aux scripts de s'exécuter mais ne s'arrête pas sur d'autres points d'arrêt, soumet des requêtes ajax, puis actualise.

Genre de progrès!

Accédez à la même page pendant le débogage:

  • Chrome v31: identique à Actualiser.
  • IE 11: les scripts sont terminés, une nouvelle session de navigateur est lancée (identique à la fermeture et à la réouverture).
  • Firefox v26: rien ne se passe.

Juacala a également suggéré une solution de contournement efficace. Par exemple, si vous utilisez jQuery, l'exécution de delete $ de la console arrêtera l'exécution une fois qu'une méthode jQuery sera rencontrée. Je l'ai testé dans tous les navigateurs ci-dessus et je peux confirmer qu'il fonctionne.

MISE À JOUR (mars 2015) :

Enfin, après plus de 2 ans et près de 10K vues, la bonne réponse a été donnée par Alexander K. Google Chrome a son propre gestionnaire de tâches qui peut tuer un processus de tabulation sans fermer l'onglet lui - même, en gardant tous les points d' arrêt et d' autres choses intactes.

Je suis même allé jusqu'à BrowserStack.com pour le tester dans Chrome v22 et j'ai constaté que cela fonctionnait de cette façon même à cette époque.

La solution de contournement de Juacala est toujours utile lors du débogage dans IE ou Firefox.

MISE À JOUR (janvier 2019) :

Chrome Dev Tools a enfin ajouté un moyen approprié d'arrêter l'exécution du script, ce qui est bien (bien qu'un peu caché). Reportez-vous à la réponse de James Gentes pour plus de détails.

srgstm
la source
12
tapez debugger;dans la console des outils de développement et il mettra immédiatement les choses dans le débogueur et arrêtera le script.
Jake
3
La réponse de James Gentes semble être une meilleure solution en 2019
Spikolynn
1
Pourquoi tout le monde parle d'arrêter le script? Il s'agit de terminer / casser tout le code "suivant / programmé" à venir.
Andre Elrico

Réponses:

188

Dans Chrome, il y a "Task Manager", accessible via Shift+ ESCou via

Menu → Plus d'outils → Gestionnaire des tâches

Vous pouvez sélectionner votre tâche de page et la terminer en appuyant sur le bouton "Terminer le processus".

Alexander K
la source
4
chrome 48cela ne fera que FERMER l'outil Dev, et ne pas le terminer, le rouvrir, vous pouvez voir le programme toujours en cours d'exécution ( tried setInterval())
Abdelouahab
11
Je ne vois pas "Gestionnaire des tâches" sous "Plus d'outils" et shift + esc ne fait rien ... (Chrome 50, OSX) Shift + ESC fonctionne cependant sous Chrome / Windows ...
Michael
2
Wow, je le veux depuis si longtemps, et ça existe depuis des années! C'est la réponse StackOverflow la plus utile que j'ai vue toute l'année!
Michael Scheper
4
Sur Macintosh (Chrome v.63), cette option apparaît sous le menu "Fenêtre", dans le troisième groupe. Il n'y a pas de raccourci clavier évident.
Apollo
2
Cela tuera l'onglet
htafoya
105

Depuis avril 2018, vous pouvez arrêter des boucles infinies dans Chrome :

  1. Ouvrez le panneau Sources dans Developer Tools ( Ctrl+ Shift+ I**).
  2. Cliquez sur le bouton Pause pour suspendre l'exécution du script .

Notez également les touches de raccourci: F8et Ctrl+\

entrez la description de l'image ici

James Gentes
la source
Un tel joyau caché sur cette interface utilisateur.
norbert
Le répondeur a une clé des secrets de l'Univers.
Sam
Le raccourci est particulièrement utile lorsque vous avez un script en cours d'exécution sans fin que vous souhaitez arrêter pour vérifier la console. Merci.
Alexei
@DanDascalescu J'ai Chrome 80.0.3987.149 et il a la même apparence
James Gentes
Peut-être que nous regardons le bouton dans différents états d'exécution? Le mien est que j'ai choisi l' bodyélément ici sur SO, défini une "pause sur -> modifications de sous-arbre", puis cliqué n'importe où. Le bouton ressemble à la capture d'écran que j'ai publiée.
Dan Dascalescu
37

Une façon de le faire est de suspendre le script, regardez quel code suit où vous êtes actuellement arrêté, par exemple:

var something = somethingElse.blah;

Dans la console, procédez comme suit:

delete somethingElse;

Ensuite, jouez le script: il provoquera une erreur fatale lorsqu'il essaiera d'accéder somethingElse, et le script mourra. Voila, vous avez terminé le script.

EDIT: À l'origine, j'ai supprimé une variable. Ce n'est pas assez bon. Vous devez supprimer une fonction ou un objet dont JavaScript tente d'accéder à une propriété.

juacala
la source
3
you have to delete a function or an objectun tel hack méchant! (dans l'interface utilisateur, il conviendrait bien comme bouton de suppression de tout )
Mars Robertson
C'est assez méchant, mais je ne peux pas penser à une autre façon.
juacala
Un an plus tard, je reviens à la même question ... Et je ne peux pas le comprendre! Existe-t-il un moyen de le rendre plus générique?
Mars Robertson
Vous ne savez pas comment mettre fin à l'exécution du script? J'ai toujours pu faire ça. Avez-vous un exemple qui ne vous permet pas de tuer le script de cette façon?
juacala
1
@Hashim, vous devez pouvoir mettre un point d'arrêt à l'intérieur de la fonction. Assurez-vous donc que l'intérieur de la fonction est sur une ligne distincte de la définition de la fonction. Dans votre cas, vous devrez dans la console, une fois qu'elle est en pause, tapez "document.getElementById ('see_older'). ParentNode.removeChild (document.getElementById ('see_older'));". C'est parce que vous n'avez rien en javascript pour vous interrompre. Malheureusement, cela change aussi le HTML. Si vous pouvez changer le code en "var el = document.getElementById ('see_older'); \ n el.getEl ..." alors vous pouvez simplement faire "delete el;" et cela l'arrêtera.
juacala
12

Mise à jour d'avril 2020

Depuis Chrome 80, aucune des réponses actuelles ne fonctionne. Il n'y a pas de bouton "Pause" visible - vous devez cliquer longuement sur le bouton "Lecture" pour accéder à l'icône Stop:

Arrêter l'exécution du script dans Chrome DevTools

Dan Dascalescu
la source
2
Dieu merci! Une vraie réponse à la question du PO.
user1023110
1
@ user1023110: Je ne connais pas Dieu mais vous êtes les bienvenus :)
Dan Dascalescu
5

Si vous rencontrez cela lors de l'utilisation de l' debuggerinstruction,

debugger;

... alors je pense que la page continuera de fonctionner indéfiniment jusqu'à ce que le runtime js donne, ou la prochaine pause. En supposant que vous êtes en mode pause sur erreur (le basculement de l'icône pause), vous pouvez vous assurer qu'une pause se produit en faisant quelque chose comme:

debugger;throw 1;

ou peut-être appeler une fonction inexistante:

debugger;z();

(Bien sûr, cela n'aide pas si vous essayez de parcourir les fonctions, bien que vous puissiez peut-être ajouter dynamiquement un throw 1ou z()ou un peu dans le panneau Sources, ctrl-S pour enregistrer, puis ctrl-R pour actualiser ... ce peut cependant ignorer un point d'arrêt, mais peut fonctionner si vous êtes dans une boucle.)

Si vous effectuez une boucle et prévoyez de déclencher debuggerà nouveau l' instruction, vous pouvez simplement taper à la throw 1place.

throw 1;

Ensuite, lorsque vous appuyez sur ctrl-R, le lancer suivant sera atteint et la page sera actualisée.

(testé avec Chrome v38, vers avril 2017)

ninjagecko
la source
3

Bonne question ici. Je pense que vous ne pouvez pas terminer l'exécution du script. Bien que je ne l'ai jamais cherché, j'utilise le débogueur Chrome depuis assez longtemps au travail. Je définis généralement des points d'arrêt dans mon code javascript, puis je débogue la partie de code qui m'intéresse. Lorsque je termine le débogage de ce code, je lance généralement le reste du programme ou actualise le navigateur.

Si vous voulez empêcher le reste du script d'être exécuté (par exemple en raison d'appels AJAX qui vont être effectués), la seule chose que vous pouvez faire est de supprimer ce code dans la console à la volée, empêchant ainsi ces appels d'être exécuté , vous pouvez alors exécuter le code restant sans problème.

J'espère que ça aide!

PS: J'ai essayé de trouver une option pour terminer l'exécution dans certains tutoriels / guides comme les suivants, mais je ne l'ai pas trouvée. Comme je l'ai déjà dit, il n'y a probablement pas une telle option.

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

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

Romén Rodríguez-Gil
la source
Ai-je aidé? Il semble qu'il n'y ait pas d'option de fin, mais afin d'empêcher l'exécution du code suivant, vous pouvez le commenter avant ou supprimer le code suivant / appeler "live" dans le débogueur Chrome (cette dernière option fera le bouton continuer se comporter comme une terminaison). Je sais que ce ne sont pas des solutions idéales, mais je pense que ce sont les plus acceptables. Des commentaires?
Romén Rodríguez-Gil
1
Dans de nombreux cas, le code qui doit être empêché de s'exécuter est dans la pile d'appels (les fonctions qui prendront le contrôle après le retour de la fonction actuelle). Bien sûr, je peux aller éditer des fonctions dans la pile d'appels, puis trouver et éditer toutes les fonctions qui pourraient être appelées de manière asynchrone. Je suis sûr, cela doit être une chose triviale pour un navigateur de rafraîchir une page avec le script toujours dans l'état de pause SI il a été suspendu au moment où le bouton Actualiser la page a été enfoncé. Je pense également que cela devrait être un comportement attendu pour n'importe quel navigateur (malheureusement, ce n'est pas le cas).
srgstm
2
En fait, j'ai trouvé une solution de contournement pour mettre fin à l'exécution du script!: Dans Chrome, j'ouvre le débogueur pour déboguer l'une de mes applications et je définis un point d'arrêt. Je lance la page. L'exécution s'arrête au point d'arrêt. J'examine ensuite le problème et réalise ce qui cause le bogue. Pour terminer l'exécution, je clique sur le bouton X à côté de l'URL (pour arrêter le chargement de la page), puis, lors de la poursuite du script (F8), il se terminera. Je pense que c'est un moyen plutôt facile de le réaliser. Que pensez-vous de celui-ci?
Romén Rodríguez-Gil
Le bouton X dans Chrome est remplacé par le bouton Actualiser après le chargement d'une page, il n'y a donc aucun moyen d'appuyer sur X par la suite (je l'ai également essayé dans IE qui a X disponible tout le temps, mais il se bloque invariablement). J'ai également testé votre suggestion lors du chargement de la page et constaté que le script ne se termine pas après avoir appuyé sur X puis sur F8. Il est probable que les scripts qui n'ont pas encore été chargés dans le navigateur au moment où X a été pressé ne soient pas chargés par la suite, mais cela devrait être évident.
srgstm
Oh tu as raison, ce fut un test rapide et n'était pas représentatif ... Alors il semble qu'il n'y ait pas de solution.
Romén Rodríguez-Gil
3

En se référant à la réponse donnée par @scottndecker à la question suivante , Chrome propose désormais une option "désactiver JavaScript" sous Outils de développeur:

  • Vertical ...en haut à droite
  • Paramètres
  • Et sous 'Préférences' allez dans la section 'Débogueur' tout en bas et sélectionnez 'Désactiver JavaScript'

La bonne chose est que vous pouvez arrêter et réexécuter simplement en le cochant / décochant.

theFreedomBanana
la source
1
Si vous dévaluez parce que vous êtes confus entre le menu des outils de développement et le menu Chrome, c'est très triste :(
theFreedomBanana
Ça n'a pas marché pour moi. J'ai coché la case Désactiver JavaScript, mais le script continue de fonctionner.
Paul Gorbas
1

Vous pouvez le faire, mais vous devez d'abord préparer votre code.

Instructions pour arrêter l'exécution du script dans Google Chrome Dev Tools:

(1) Préparez d'abord votre code, en créant une variable globale :

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

(2) N'importe quel endroit où vous voudrez peut-être arrêter, testez la valeur de cette variable:

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

(3) Suspendre l'exécution du script sur ou avant la ou les lignes de test ci-dessus

(4) Passer à la console

(5) Type:

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

(6) Continuez l'exécution du script. Le script return falseexécutera le test de l'étape (2) ci-dessus


Remarques:

(A) Cette astuce fonctionne avec des variables et des objets globaux, mais elle ne fonctionnera pas avec des variables locales. Notez que ceci:
newVar = 'never used before';
crée une nouvelle propriété de l'objet fenêtre (fonctionne avec l'astuce ci-dessus), tandis que ceci:
var newVar = 'never used before';
crée une variable locale (ne fonctionne PAS avec l'astuce ci-dessus!)

(B) Donc, vous pouvez toujours utiliser cette astuce avec du code déjà en cours d'exécution si vous avez une variable globale ou un objet qui retournera false s'il a une valeur donnée.

(C) Dans un pincement, vous pouvez utiliser l'astuce de juacala et supprimer un élément du DOM (sur l'onglet éléments) qui provoquera une erreur javascript. Par exemple, supposons que vous ayez du code var cartype = $('#cartype').val();Si vous supprimez l'élément avec ID = cartypeavant cette ligne de code, les js se briseront sur cette ligne. Cependant, l'élément sera toujours manquant lorsque vous essayez de réexécuter le code. L'astuce décrite ci-dessus vous permet d'exécuter et de réexécuter le code à l' infini.


Plus de notes:

(a) Insérez un point d'arrêt dans le code: tapez simplement debugger;sur une ligne par lui-même. Si DevTools est ouvert, le script sautera dans le débogueur à ce stade. Si DevTools ne s'ouvre pas, le code ignorera l'instruction.

(b) Vous voulez éviter de sauter dans la bibliothèque jQuery lors du débogage du code? Blackbox it. Voir les instructions de la boîte noire pour Chrome - ou - pour Firefox


Gratitude (veuillez visiter et voter):

Débogage Javascript ligne par ligne à l'aide de Google Chrome

Est-il possible de modifier les valeurs des variables javascript lors du débogage dans Google Chrome?

cssyphus
la source
2
Any place where you may wish to quit, test the value of this variableC'est horrible! Je veux arrêter partout où je pourrais marcher en ce moment, je ne sais pas à l'avance où cela pourrait être!
Michael
Si vous êtes prêt à travailler sur le côté du code, c'est le plus convivial pour le client qui essaie d'arrêter l'exécution du script.
Goose
??? Vous n'avez besoin d'aucune variable globale. Cliquez simplement sur ce bouton .
Dan Dascalescu
0

Vous pouvez faire une pause sur n'importe quel modèle XHR que je trouve très utile lors du débogage de ce type de scénarios.

Par exemple, j'ai donné un point d'arrêt sur un modèle d'URL contenant "/"

entrez la description de l'image ici

Abhi
la source
0

Si vous avez une boucle non autorisée, mettez le code en pause dans le débogueur Google Chrome (le petit ||bouton "" dans l'onglet Sources).

Revenez à Chrome lui-même, ouvrez le "Gestionnaire des tâches" ( Shift+ ESC), sélectionnez votre onglet, cliquez sur le bouton "Terminer le processus".

Vous obtiendrez le message Aww Snap et vous pourrez ensuite recharger ( F5).

Comme d'autres l'ont noté, le rechargement de la page au moment de la pause équivaut au redémarrage de la boucle non autorisée et peut provoquer des verrous désagréables si le débogueur se verrouille également (entraînant dans certains cas le redémarrage de Chrome ou même du PC). Le débogueur a besoin d'un bouton "Stop". Nb: La réponse acceptée est obsolète dans la mesure où certains aspects de celle-ci sont maintenant apparemment faux. Si vous me votez contre, veuillez expliquer :) .

www-0av-Com
la source
1
Il y a une meilleure façon .
Dan Dascalescu
-1

Ouvrez l'onglet source dans 'Developer Tools', cliquez sur un numéro de ligne dans un script en cours d'exécution, cela créera un point d'arrêt et le débogueur s'arrêtera là.

Todd
la source
-1

Il existe de nombreuses solutions appropriées à ce problème, comme mentionné ci-dessus dans ce post, mais j'ai trouvé un petit hack qui peut être inséré dans le script ou collé dans la console Chromes (débogueur) pour y parvenir:

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

Cela entraînera une interruption de l'exécution lorsque vous frappez F12.

Murtaza Hussain
la source
Et si vous (j'espère) n'utilisez pas jQuery?
Dan Dascalescu
puis utilisez du Javascript pur, comme document.addEveneListner .. pour obtenir l'événement keydown ..
Murtaza Hussain