En Firefox puedo hacerlo, desde mi programa JavaScript de ejecución prolongada (que se ejecuta en una pestaña sin herramientas de desarrollo abiertas):
alert("while this alert is still on, open Dev Tools (Shift-Ctrl-I) to hit a breakpoint as soon as you hit ok"); debugger;y funciona como se esperaba, es decir, si abro manualmente las herramientas de desarrollo mientras la ventana de alerta aún está abierta, el programa se detiene en el depurador tan pronto como cierro la alerta.
En Chrome esto no funciona. Intenté eval('depurador') en lugar de solo depurador, pero eso tampoco funciona. ¿Hay alguna alternativa para Chrome? Tal vez en forma de extensión (siempre y cuando no tenga sobrecarga de tiempo de ejecución).
Ejecutar el programa con Dev Tools abierto desde el principio no es una opción, ya que tiene un gran impacto en el rendimiento (el programa es dos o tres veces más lento), por lo que quiero poder alternar (cuando haya terminado depuración, quiero reanudar y cerrar las herramientas de desarrollo; idealmente, la sesión de depuración también debería permitir editar y continuar, pero esa es otra lata de gusanos).
Esencialmente, lo que necesito es un punto de interrupción sin gastos generales para Chrome
Esta no es una solución general a la pregunta que hice, pero funciona para mi caso particular, así que la comparto aquí. Por un lado, aclara un poco la mecánica de por qué no funciona en Chrome tal cual, por otro lado, podría ayudar a otros que también ejecutan código dentro de los generadores.
Mientras intentaba ver si una segunda alerta podría ayudar, noté que, aunque había iniciado las herramientas de desarrollo durante la primera alerta, el panel de fuentes todavía estaba en blanco cuando la página se detuvo durante la segunda alerta. Esto me hizo pensar que el control no había regresado al navegador, por lo tanto, la fuente (más precisamente, el depurador de herramientas de desarrollo) aún no estaba activa, no hasta que la evaluación actual hubiera seguido su curso, y es por eso que se ignoró la declaración del depurador. Probé esa hipótesis y, de hecho, usando
alert("while this alert is still on, open Dev Tools (Shift-Ctrl-I) to hit a breakpoint as soon as you hit ok"); setTimeout(function run () { debugger; });También hice que Chrome pausara el depurador. Por supuesto, la pausa en realidad no ocurre de inmediato, solo ocurre después del hecho (después de la última declaración en el script), de forma asíncrona con la ejecución del script, pero para mí esto es lo suficientemente bueno, dado que mi código se ejecuta dentro de los generadores. el bucle de ejecución principal del programa se parece a:
setTimeout(function run () { generator.next(); setTimeout(run); });Entonces, en los lugares donde quiero cambiar al modo de depuración, simplemente puedo hacer:
alert("while this alert is still on, open Dev Tools (Shift-Ctrl-I) to hit a breakpoint as soon as you hit ok"); yield; debugger;Dado que de todos modos sigue una interrupción en el programa, el hecho de que el programa haga un rendimiento adicional al navegador/llame a setTimeout es irrelevante, y cuando el programa eventualmente (dentro de la siguiente invocación del generador next()) se detiene en el depurador, está en el estado correcto (sincrónico).
También puede llamar a console.log(1). La consola generará un campo de 1 Luego haga clic a la izquierda 