2011-02-25 28 views
12

En ciertos tipos de código es relativamente fácil provocar un bucle infinito sin soplar la pila. Al probar el código de esta naturaleza usando clojure-test, ¿hay alguna forma de abortar las pruebas actuales sin reiniciar el servidor swank?Detener bucles infinitos durante la ejecución de pruebas de clojure en emacs con leiningen y swank/limo

Actualmente mi flujo de trabajo ha implicado

$ lein swank 

Conectar a Swank con emacs utilizando slime-connect, y cambiar a los de las pruebas, ejecutar con C-c C-,, las pruebas se ejecutan hasta el bucle infinito, entonces simplemente volver pero una CPU sigue batiendo lejos en la prueba. La única forma de detener esto que he encontrado es reiniciar lein swank, ¿pero parece que esto sería un problema relativamente común? Alguien tiene una mejor solución?

Respuesta

12

Sí, es un problema común para los programadores escribir bucles infinitos en el desarrollo :). Y la respuesta es muy simple. Se llama "Comando de interrupción" y es C-c C-b

Leiningen no tiene nada que ver con esto. Esto es SLIME/Swank/Clojure. Cuando evalúa el código en Emacs está generando un nuevo hilo dentro de Clojure. SLIME mantiene referencia a esos hilos y le muestra cuántos se están ejecutando en la línea de Emacs. Si se encuentra en un entorno gráfico, puede hacer clic en la línea de modo donde indica su espacio de nombre y ver muchas opciones. Una opción es "Comando de interrupción"

Eval (while true) y C-c C-b para obtener un cuadro de diálogo que muestra un error java.lang.ThreadDeath con probablemente solo una opción. Puede escribir 0 o q para salir de ese hilo, eliminar ese búfer de mensaje de error y devolver el enfoque al búfer anterior.

1

Según this old discussion, añadiendo (use 'clojure.contrib.repl-utils)) y (add-break-thread!) a user.clj deberían permitir que se presione C-c C-c para pasar SIGINT a la larga duración de evaluación/processe.

+0

Mi configuración actual de Emacs vincula 'C-c C-c' a' slime-interrupt' que se comporta como cabría esperar – skuro

1

si todo lo demás falla ... alt-x slime-quit-lisp y reinicie el REPL. prueba la respuesta de Psyllo primero, por supuesto.

Cuestiones relacionadas