¿Cómo terminar la ejecución del script al depurar en Google Chrome?

210

Al recorrer el código JavaScript en el depurador de Google Chrome, ¿cómo finalizo la ejecución del script si no quiero continuar? La única forma que encontré es cerrando la ventana del navegador.

Al presionar "Recargar esta página" se ejecuta el resto del código e incluso se envían formularios como si se presiona F8 "Continuar".

ACTUALIZACIÓN :

Al presionar F5 (Actualizar) mientras un script está en pausa:

  • Google Chrome (v22) ejecuta el script. Si el script envía una solicitud HTTP, se muestra la respuesta HTTP para esa solicitud. La página original no se actualiza.
  • IE 9 simplemente se congela. Sin embargo, IE tiene una opción "Detener depuración" que, cuando se presiona (siempre que no haya presionado F5 anteriormente), continúa ejecutando el script fuera del depurador.
  • Firebug se comporta de manera idéntica a Chrome.

Cerrar y volver a abrir la ventana del navegador no siempre es la siguiente forma más fácil porque matará el estado de la sesión del navegador y eso puede ser importante. Todos tus puntos de interrupción también se pierden.

ACTUALIZACIÓN (enero de 2014) :

Actualizar durante la depuración:

  • Chrome v31: permite que los scripts se ejecuten y se detiene en otros puntos de interrupción (pero no envía solicitudes ajax), luego se actualiza.
  • IE 11: la actualización no hace nada, pero puede presionar F5 para continuar.
  • Firefox v26: permite que se ejecuten los scripts pero no se detiene en otros puntos de interrupción, envía solicitudes ajax y luego se actualiza.

Tipo de progreso!

Navegue a la misma página mientras se depura:

  • Chrome v31: igual que Actualizar.
  • IE 11: las secuencias de comandos finalizan, se inicia una nueva sesión del navegador (igual que cerrar y abrir de nuevo).
  • Firefox v26: no pasa nada.

También juacala sugirió una solución efectiva. Por ejemplo, si está utilizando jQuery, ejecutar delete $ desde la consola detendrá la ejecución una vez que se encuentre cualquier método jQuery. Lo he probado en todos los navegadores anteriores y puedo confirmar que funciona.

ACTUALIZACIÓN (Mar 2015) :

Finalmente, después de más de 2 años y casi 10K vistas, la respuesta correcta fue dada por Alexander K. Google Chrome tiene su propio Administrador de tareas que puede matar un proceso de pestaña sin cerrar la pestaña en sí, manteniendo intactos todos los puntos de interrupción y otras cosas.

Incluso fui hasta BrowserStack.com para probarlo en Chrome v22 y descubrí que esto funcionaba de esta manera incluso en ese momento.

La solución alternativa de Juacala sigue siendo útil cuando se depura en IE o Firefox.

ACTUALIZACIÓN (enero de 2019) :

Chrome Dev Tools finalmente agregó una forma adecuada de detener la ejecución del script que es agradable (aunque un poco oculto). Consulte la respuesta de James Gentes para más detalles.

srgstm
fuente
12
escriba debugger;en la consola de herramientas de desarrollo e inmediatamente pondrá las cosas en el depurador y detendrá el script.
Jake
3
La respuesta de James Gentes parece ser una mejor solución en 2019
Spikolynn
1
¿Por qué todos hablan de detener el guión? Se trata de terminar / romper todo el código "siguiente / programado" por venir.
Andre Elrico

Respuestas:

188

En Chrome, hay "Administrador de tareas", accesible a través de Shift+ ESCo mediante

Menú → Más herramientas → Administrador de tareas

Puede seleccionar su tarea de página y finalizarla presionando el botón "Finalizar proceso".

Alexander K
fuente
44
chrome 48esto solo CERRARÁ la herramienta Dev, y no la terminará, volviendo a abrirla, puede ver que el programa aún se está ejecutando ( tried setInterval())
Abdelouahab
11
No veo "Administrador de tareas" en "Más herramientas" y shift + esc no hace nada ... (Chrome 50, OSX) Shift + ESC funciona en Chrome / Windows aunque ...
Michael
2
Wow: ¡he querido esto por tanto tiempo, y ha estado allí por años! ¡Esta es la respuesta más útil de StackOverflow que he visto durante todo el año!
Michael Scheper
44
En Macintosh (Chrome v.63), esta opción se muestra en el menú "Ventana", en el tercer grupo. No hay un atajo de teclado evidente.
Apolo el
2
Esto matará la pestaña
htafoya
105

A partir de abril de 2018, puede detener bucles infinitos en Chrome :

  1. Abra el panel Orígenes en Herramientas para desarrolladores ( Ctrl+ Shift+ I**).
  2. Haga clic en el botón Pausa para Pausar la ejecución del script .

También tenga en cuenta las teclas de acceso directo: F8y Ctrl+\

ingrese la descripción de la imagen aquí

James Gentes
fuente
Una joya tan escondida en esa interfaz de usuario.
norbert
El que responde tiene una clave para los secretos del Universo.
Sam
El acceso directo es particularmente útil cuando tiene un script que se ejecuta sin cesar y que desea detener para verificar la consola. Gracias.
Alexei
@DanDascalescu Tengo Chrome 80.0.3987.149 y se ve igual
James Gentes
¿Tal vez estamos viendo el botón en diferentes estados de ejecución? El mío es que elegí el bodyelemento aquí en SO, establecí un "descanso en -> modificaciones de subárbol", y luego hice clic donde sea. El botón se ve como en la captura de pantalla que publiqué.
Dan Dascalescu
37

Una forma de hacerlo es pausar el script, ver qué código sigue donde está actualmente detenido, por ejemplo:

var something = somethingElse.blah;

En la consola, haga lo siguiente:

delete somethingElse;

Luego reproduzca el script: causará un error fatal cuando intente acceder somethingElsey el script morirá. Voila, has terminado el guión.

EDITAR: Originalmente, eliminé una variable. Eso no es lo suficientemente bueno. Debe eliminar una función o un objeto cuyo JavaScript intente acceder a una propiedad.

juacala
fuente
3
you have to delete a function or an objectun truco tan desagradable! (en la interfaz de usuario encajaría bien como botón de matar a todos )
Mars Robertson
Es bastante desagradable, pero no puedo pensar en otra forma.
juacala
Un año después vuelvo a la misma pregunta ... ¡Y no puedo resolverlo! ¿Hay alguna manera de hacerlo más genérico?
Mars Robertson
¿No sabes cómo terminar la ejecución del script? Siempre he podido hacer esto. ¿Tienes un ejemplo que no te permite matar el guión de esta manera?
juacala
1
@Hashim, debes poder poner un punto de ruptura dentro de la función. Así que asegúrese de que el interior de la función esté en una línea separada de la definición de la función. En su caso, deberá hacerlo en la consola, una vez que esté en pausa, escriba "document.getElementById ('see_older'). ParentNode.removeChild (document.getElementById ('see_older'));". Esto se debe a que no tiene nada en JavaScript para romper. Desafortunadamente, esto también cambia el HTML. Si puede cambiar el código a "var el = document.getElementById ('see_older'); \ n el.getEl ...", entonces simplemente puede hacer "delete el;" y eso lo detendrá.
juacala
12

Actualización de abril de 2020

A partir de Chrome 80, ninguna de las respuestas actuales funciona. No hay un botón visible de "Pausa": debe hacer clic largo en el botón "Reproducir" para acceder al icono Detener:

Detener la ejecución del script en Chrome DevTools

Dan Dascalescu
fuente
2
¡Gracias a Dios! Una respuesta real a la pregunta del OP.
user1023110
1
@ user1023110: No sé acerca de Dios, pero de nada :)
Dan Dascalescu
5

Si se encuentra con esto mientras usa la debuggerdeclaración,

debugger;

... entonces creo que la página continuará ejecutándose para siempre hasta que el tiempo de ejecución de js ceda, o el próximo descanso. Suponiendo que está en modo de interrupción por error (el interruptor de icono de pausa), puede asegurarse de que ocurra una interrupción haciendo algo como:

debugger;throw 1;

o tal vez llamar a una función inexistente:

debugger;z();

(Por supuesto, esto no ayuda si está intentando pasar a través de funciones, aunque quizás podría agregar dinámicamente una throw 1o una z()en el panel de Fuentes, ctrl-S para guardar y luego ctrl-R para actualizar ... esto Sin embargo, puede omitir un punto de interrupción, pero puede funcionar si está en un bucle).

Si está haciendo un bucle y espera activar la debuggerdeclaración nuevamente, simplemente puede escribir en su throw 1lugar.

throw 1;

Luego, cuando presione Ctrl-R, se lanzará el siguiente lanzamiento y la página se actualizará.

(probado con Chrome v38, alrededor de abril de 2017)

ninjagecko
fuente
3

Buena pregunta aqui. Creo que no puedes terminar la ejecución del script. Aunque nunca lo he buscado, he estado usando el depurador de cromo durante bastante tiempo en el trabajo. Por lo general, establezco puntos de interrupción en mi código de JavaScript y luego depuro la parte del código que me interesa. Cuando termino de depurar ese código, generalmente ejecuto el resto del programa o actualizo el navegador.

Si desea evitar que se ejecute el resto del script (por ejemplo, debido a las llamadas AJAX que se van a realizar), lo único que puede hacer es eliminar ese código en la consola sobre la marcha, evitando así esas llamadas de ser ejecutado , entonces podría ejecutar el código restante sin problemas.

¡Espero que esto ayude!

PD: Traté de encontrar una opción para terminar la ejecución en algunos tutoriales / guías como los siguientes, pero no pude encontrarla. Como dije antes, probablemente no exista tal opción.

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
fuente
¿Ayudé? Parece que no hay una opción de finalización, pero para evitar la ejecución del siguiente código, puede comentarlo antes o eliminar el siguiente código / llamar "en vivo" dentro del depurador de Chrome (esta última opción hará que el botón continuar comportarse como un terminado). Sé que no son soluciones ideales, pero creo que son las más aceptables. ¿Algún comentario?
Romén Rodríguez-Gil
1
En muchos casos, el código que debe evitarse se ejecuta en la pila de llamadas (las funciones que obtendrán el control después de que regrese la función actual). Claro, puedo ir y editar funciones en la pila de llamadas, y luego encontrar y editar todas las funciones que podrían llamarse de forma asincrónica. Estoy seguro de que debe ser una cosa trivial para un navegador actualizar una página con el script aún en estado de pausa SI se detuvo en el momento en que se presionó el botón Actualizar página. También creo que debería ser un comportamiento esperado para cualquier navegador (desafortunadamente, no lo es).
srgstm
2
¡En realidad, encontré una solución para lograr la finalización de la ejecución del script !: en Chrome, abro el depurador para depurar una de mis aplicaciones y establezco un punto de interrupción. Corro la página. La ejecución se detiene en el punto de interrupción. Luego examino el problema y me doy cuenta de lo que está causando el error. Para finalizar la ejecución, hago clic en el botón X al lado de la URL (para detener la carga de la página) y luego, al continuar el script (F8), finalizará. Creo que es una forma bastante fácil de lograrlo. ¿Qué piensas acerca de esto?
Romén Rodríguez-Gil
El botón X en Chrome se reemplaza con el botón Actualizar después de que se haya cargado una página, por lo que no hay forma de presionar X después (también lo he intentado en IE, que tiene X disponible todo el tiempo, pero siempre se congela). También probé su sugerencia durante la carga de la página y descubrí que el script no termina después de presionar X y luego F8. Es probable que las secuencias de comandos que aún no se hayan cargado en el navegador en el momento en que se presionó X no se carguen después, pero eso debería ser evidente.
srgstm
Oh, tienes razón, fue una prueba rápida y no fue representativa ... Entonces parece que no hay solución.
Romén Rodríguez-Gil
3

En referencia a la respuesta dada por @scottndecker a la siguiente pregunta , Chrome ahora ofrece una opción de 'deshabilitar JavaScript' en Herramientas para desarrolladores:

  • Vertical ...en la parte superior derecha
  • Configuraciones
  • Y en 'Preferencias', vaya a la sección 'Depurador' en la parte inferior y seleccione 'Desactivar JavaScript'

Lo bueno es que puede detenerse y volver a ejecutar de nuevo simplemente marcando / desmarcando.

theFreedomBanana
fuente
1
Si votas en contra porque estás confundido entre el menú Herramientas para desarrolladores y el menú de Chrome, es muy triste :(
theFreedomBanana
No funciono para mi. Marqué la casilla Desactivar JavaScript, pero el script sigue ejecutándose.
Paul Gorbas
1

Puede hacerlo, pero primero debe preparar su código.

Instrucciones para detener la ejecución del script en las Herramientas de desarrollo de Google Chrome:

(1) Prepare su código primero, creando una variable global :

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

(2) Cualquier lugar donde desee dejar de fumar, pruebe el valor de esta variable:

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

(3) Pausa la ejecución del script en o antes de las líneas de prueba anteriores

(4) Cambiar a consola

(5) Tipo:

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

(6) Continuar la ejecución del script. El script lo hará return falsecuando ejecute la prueba del paso (2) anterior


Notas:

(A) Este truco funciona con objetos y variables globales, pero no funcionará con variables locales. Tenga en cuenta que esto:
newVar = 'never used before';
crea una nueva propiedad del objeto de ventana (funciona con el truco anterior), mientras que esto:
var newVar = 'never used before';
crea una variable local (¡NO funciona con el truco anterior!)

(B) Entonces, aún puede usar este truco con código que ya se está ejecutando si tiene una variable global o un objeto que devolverá falso si tiene un valor dado.

(C) En caso de apuro, puede usar el truco de juacala y eliminar un elemento del DOM (en la pestaña de elementos) que causará un error de JavaScript. Por ejemplo, suponga que tiene código var cartype = $('#cartype').val();Si elimina el elemento con ID = cartypeantes de esa línea de código, entonces el js se romperá en esa línea. Sin embargo, el elemento seguirá faltando cuando intente volver a ejecutar el código. El truco descrito anteriormente le permite ejecutar y volver a ejecutar el código hasta el infinito.


Más notas:

(a) Inserte el punto de interrupción en el código: simplemente escriba debugger;una línea por sí mismo. Si DevTools está abierto, el script saltará al depurador en ese punto. Si DevTools no se abre, el código ignorará la declaración.

(b) ¿Desea evitar saltar a la biblioteca jQuery al depurar código? Blackbox it. Consulte las instrucciones de blackbox para Chrome - o - para Firefox


Agradecimiento (por favor visite y vote):

Javascript Depuración línea por línea usando Google Chrome

¿Es posible cambiar los valores de las variables de JavaScript mientras se depura en Google Chrome?

cssyphus
fuente
2
Any place where you may wish to quit, test the value of this variable¡Esto es horrible! Quiero dejar de fumar donde quiera que esté pisando en este momento, ¡no sé de antemano dónde podría estar!
Michael
Si está dispuesto a trabajar en el lado del código, este es el más fácil de usar para el cliente que intenta detener la ejecución del script.
Ganso
??? No necesitas ninguna variable global. Solo haz clic en este botón .
Dan Dascalescu
0

Puede hacer una pausa en cualquier patrón XHR que encuentro muy útil durante la depuración de este tipo de escenarios.

Por ejemplo, he dado un punto de interrupción en un patrón de URL que contiene "/"

ingrese la descripción de la imagen aquí

Abhi
fuente
0

Si tiene un bucle falso, pause el código en el depurador de Google Chrome (el pequeño ||botón " " mientras está en la pestaña Fuentes).

Vuelva a Chrome, abra el "Administrador de tareas" ( Shift+ ESC), seleccione su pestaña, haga clic en el botón "Finalizar proceso".

Recibirá el mensaje Aww Snap y luego podrá volver a cargar ( F5).

Como otros han señalado, volver a cargar la página en el punto de pausa es lo mismo que reiniciar el bucle corrupto y puede causar bloqueos desagradables si el depurador también se bloquea (en algunos casos, lo que lleva a reiniciar Chrome o incluso la PC). El depurador necesita un botón "Parar". Nb: La respuesta aceptada está desactualizada en que algunos aspectos de ella ahora parecen estar equivocados. Si me rechazas, por favor explique :) .

www-0av-Com
fuente
1
Hay una manera mejor .
Dan Dascalescu
-1

Abra la pestaña de origen en 'Herramientas para desarrolladores', haga clic en un número de línea en un script que se esté ejecutando, esto creará un punto de interrupción y el depurador se romperá allí.

Todd
fuente
-1

Hay muchas soluciones apropiadas para este problema como se mencionó anteriormente en esta publicación, pero he encontrado un pequeño truco que se puede insertar en el script o pegar en la consola de Chromes (depurador) para lograrlo:

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

Esto hará que la ejecución se detenga cuando golpees F12.

Murtaza Hussain
fuente
¿Qué pasa si usted (con suerte) no usa jQuery?
Dan Dascalescu
luego use Javascript puro, como document.addEveneListner .. para obtener el evento keydown ..
Murtaza Hussain