Bien, pero ¿cómo se obtiene clojure para encontrar 'clojure.contrib.trace? Tengo el jar clojure-contrib en mi classpath pero REPL diceuser=> (use 'closure.contrib.trace) java.io.FileNotFoundException: Could not locate closure/contrib/trace__init.class or closure/contrib/trace.clj on classpath: (NO_SOURCE_FILE:0)
LarsH
2
¿Podría estar escribiendo incorrectamente clojure como cierre, o es un error tipográfico en el comentario? ¿Se pueden cargar otras bibliotecas clojure.contrib?
@Zaz estoy totalmente de acuerdo. ¡Spyscope es asombroso! Incluso mejor que un depurador. Ciertamente para escribir.
J Atkin
66
El CIDER de Emacs tiene un depurador de origen que puede pasar expresión por expresión dentro de un búfer de Emacs e incluso inyectar nuevos valores. Puedes leer todo sobre esto aquí . Una captura de pantalla de demostración:
Mi método favorito es una pizca liberal de printlns en todo el código ... Activarlos y desactivarlos es fácil gracias a la #_macro del lector (que hace que el lector lea de la siguiente forma, y luego finja que nunca lo ha visto). O podría usar una macro expandiéndose a un cuerpo pasado o nildependiendo del valor de alguna variable especial, por ejemplo *debug*:
Entonces hay algo que es actualmente incompatible con Swank-clojure 's REPL, pero es demasiado bueno para no mencionar: debug-repl. Puede usarlo en un REPL independiente, que es fácil de obtener, por ejemplo, con Leiningen ( lein repl); y si está iniciando su programa desde la línea de comando, entonces traerá su propia REPL directamente en su terminal. La idea es que puede soltar la debug-replmacro en cualquier lugar que desee y hacer que aparezca su propio REPL cuando la ejecución del programa llegue a ese punto, con todos los locales en el alcance, etc. Un par de enlaces relevantes: Clojure debug-repl , Clojure debug -repl trucos , qué tal un debug-repl (en el grupo Clojure Google), debug-repl en Clojars .
swank-clojure hace un trabajo adecuado al hacer que el depurador incorporado de SLIME sea útil cuando se trabaja con código Clojure; tenga en cuenta cómo los bits irrelevantes del stacktrace están atenuados para que sea fácil encontrar el problema real en el código que se está depurando. Una cosa a tener en cuenta es que las funciones anónimas sin "etiquetas de nombre" aparecen en el stacktrace básicamente sin información útil adjunta; cuando se agrega una "etiqueta de nombre", aparece en el stacktrace y todo vuelve a estar bien:
(fn[& args] ...)
vs.
(fn tag [& args] ...)
example stacktrace entries:
1: user$eval__3130$fn__3131.invoke(NO_SOURCE_FILE:1)
vs. ^^
1: user$eval__3138$tag__3139.invoke(NO_SOURCE_FILE:1)
^^^
En realidad, hay una versión de la respuesta de depuración que ahora funciona con swank: hugoduncan.org/post/2010/… (Alerta de spoiler: es increíble)
1
Bien, y es bueno tener un enlace aquí, ¡gracias! De acuerdo en increíble. :-)
Michał Marczyk
Si este es su estilo, es posible que le guste la biblioteca de Debux mencionada en una respuesta posterior. github.com/philoskim/debux
Mallory-Erik
@ Mallory-Erik ¡Gracias, lo comprobaré!
Michał Marczyk
37
También puede insertar código para dejarse caer en un REPL con todos los enlaces locales, utilizando Alex Osbornedebug-repl :
(defmacro local-bindings
"Produces a map of the names of local bindings to their values."[](let[symbols (map key @clojure.lang.Compiler/LOCAL_ENV)](zipmap(map(fn[sym] `(quote ~sym)) symbols) symbols)))(declare *locals*)(defn eval-with-locals
"Evals a form with given locals. The locals should be a map of symbols to
values."[locals form](binding [*locals* locals](eval
`(let ~(vec(mapcat #(list % `(*locals* '~%))(keys locals)))
~form))))(defmacro debug-repl
"Starts a REPL with the local bindings available."[]
`(clojure.main/repl
:prompt #(print "dr => "):eval(partial eval-with-locals (local-bindings))))
Luego, para usarlo, insértelo donde quiera que comience la respuesta:
(defn my-function [a b c](let[d (some-calc)](debug-repl)))
Pego esto en mi user.clj para que esté disponible en todas las sesiones REPL.
"Las mejores formas de depurar el código Clojure, mientras se usa la respuesta"
Ligeramente a la izquierda, pero "usando el REPL por sí mismo".
Llevo más de un año escribiendo al aficionado Clojure y no he sentido una gran necesidad de herramientas de depuración. Si mantiene sus funciones pequeñas y ejecuta cada una con las entradas esperadas en el REPL y observa los resultados, entonces debería ser posible tener una imagen bastante clara de cómo se comporta su código.
Creo que un depurador es más útil para observar ESTADO en una aplicación en ejecución. Clojure hace que sea fácil (¡y divertido!) Escribir en un estilo funcional con estructuras de datos inmutables (sin cambios de estado). Esto reduce enormemente la necesidad de un depurador. Una vez que sé que todos los componentes se comportan como esperaba (prestando especial atención a los tipos de cosas), el comportamiento a gran escala rara vez es un problema.
Para IntelliJ hay un excelente complemento de Clojure llamado Cursive . Entre otras cosas, proporciona un REPL que puede ejecutar en modo de depuración y recorrer su código Clojure tal como lo haría, por ejemplo, Java.
Sin embargo, respaldaría la respuesta de Peter Westmacott porque, según mi experiencia, solo ejecutar partes de mi código en el REPL es la mayoría de las veces una forma suficiente de depuración.
Pero cómo depurar Leiningen, muestra:Error running 'ring server': Trampoline must be enabled for debugging
Gank
Eso parece ser específico ringo lein, ¿quizás valga la pena publicar una pregunta por separado?
dskrvk
6
A partir de 2016, puede utilizar Debux , una biblioteca de depuración simple para Clojure / Script que funciona junto con su respuesta, así como la consola de su navegador. Puede rociar dbg(depurar) o clogmacros (console.log) en su código y observar fácilmente los resultados de funciones individuales, etc., impresas en su REPL y / o consola.
Este es un ejemplo simple. La macro dbg imprime un formulario original e imprime el valor evaluado en la ventana REPL. Luego devuelve el valor sin interferir con la ejecución del código.
Hugo Duncan y sus colaboradores continúan haciendo un trabajo increíble con el proyecto ritz . Ritz-nrepl es un servidor nREPL con capacidades de depuración. Vea la charla de Hugo's Debuggers en Clojure en Clojure / Conj 2012 para verlo en acción, en el video algunas de las diapositivas no son legibles, por lo que es posible que desee ver las diapositivas desde aquí .
Use spyscope que implementa una macro de lector personalizado para que su código de depuración también sea código de producción
https://github.com/dgrnbrg/spyscope
Respuestas:
También hay dotrace, que le permite ver las entradas y salidas de las funciones seleccionadas.
produce la salida:
En Clojure 1.4, se
dotrace
ha movido:Necesitas la dependencia:
Y necesita agregar ^: dinámica a la definición de la función
Entonces Bob es una vez más tu tío:
fuente
user=> (use 'closure.contrib.trace) java.io.FileNotFoundException: Could not locate closure/contrib/trace__init.class or closure/contrib/trace.clj on classpath: (NO_SOURCE_FILE:0)
Tengo una pequeña macro de depuración que me parece muy útil:
Puede insertarlo donde quiera ver lo que sucede y cuándo:
fuente
clojure.tools.trace/trace
.El CIDER de Emacs tiene un depurador de origen que puede pasar expresión por expresión dentro de un búfer de Emacs e incluso inyectar nuevos valores. Puedes leer todo sobre esto aquí . Una captura de pantalla de demostración:
fuente
Mi método favorito es una pizca liberal de
println
s en todo el código ... Activarlos y desactivarlos es fácil gracias a la#_
macro del lector (que hace que el lector lea de la siguiente forma, y luego finja que nunca lo ha visto). O podría usar una macro expandiéndose a un cuerpo pasado onil
dependiendo del valor de alguna variable especial, por ejemplo*debug*
:Con un
(def *debug* false)
allí, esto se expandirá anil
. Contrue
, se expandirá abody
envuelto en undo
.La respuesta aceptada a esta pregunta SO: ¿ Idiomatic Clojure para informes de progreso? es muy útil al depurar operaciones de secuencia.
Entonces hay algo que es actualmente incompatible con Swank-clojure 's REPL, pero es demasiado bueno para no mencionar:
debug-repl
. Puede usarlo en un REPL independiente, que es fácil de obtener, por ejemplo, con Leiningen (lein repl
); y si está iniciando su programa desde la línea de comando, entonces traerá su propia REPL directamente en su terminal. La idea es que puede soltar ladebug-repl
macro en cualquier lugar que desee y hacer que aparezca su propio REPL cuando la ejecución del programa llegue a ese punto, con todos los locales en el alcance, etc. Un par de enlaces relevantes: Clojure debug-repl , Clojure debug -repl trucos , qué tal un debug-repl (en el grupo Clojure Google), debug-repl en Clojars .swank-clojure hace un trabajo adecuado al hacer que el depurador incorporado de SLIME sea útil cuando se trabaja con código Clojure; tenga en cuenta cómo los bits irrelevantes del stacktrace están atenuados para que sea fácil encontrar el problema real en el código que se está depurando. Una cosa a tener en cuenta es que las funciones anónimas sin "etiquetas de nombre" aparecen en el stacktrace básicamente sin información útil adjunta; cuando se agrega una "etiqueta de nombre", aparece en el stacktrace y todo vuelve a estar bien:
fuente
También puede insertar código para dejarse caer en un REPL con todos los enlaces locales, utilizando Alex Osborne
debug-repl
:Luego, para usarlo, insértelo donde quiera que comience la respuesta:
Pego esto en mi user.clj para que esté disponible en todas las sesiones REPL.
fuente
"Las mejores formas de depurar el código Clojure, mientras se usa la respuesta"
Ligeramente a la izquierda, pero "usando el REPL por sí mismo".
Llevo más de un año escribiendo al aficionado Clojure y no he sentido una gran necesidad de herramientas de depuración. Si mantiene sus funciones pequeñas y ejecuta cada una con las entradas esperadas en el REPL y observa los resultados, entonces debería ser posible tener una imagen bastante clara de cómo se comporta su código.
Creo que un depurador es más útil para observar ESTADO en una aplicación en ejecución. Clojure hace que sea fácil (¡y divertido!) Escribir en un estilo funcional con estructuras de datos inmutables (sin cambios de estado). Esto reduce enormemente la necesidad de un depurador. Una vez que sé que todos los componentes se comportan como esperaba (prestando especial atención a los tipos de cosas), el comportamiento a gran escala rara vez es un problema.
fuente
Si usa emacs / slime / swank, intente esto en REPL:
No te da un seguimiento completo de la pila como si estuvieras bajo LISP, pero es bueno para hurgar.
Este es el buen trabajo de:
http://hugoduncan.org/post/2010/swank_clojure_gets_a_break_with_the_local_environment.xhtml
como se mencionó en un comentario anterior.
fuente
Para IntelliJ hay un excelente complemento de Clojure llamado Cursive . Entre otras cosas, proporciona un REPL que puede ejecutar en modo de depuración y recorrer su código Clojure tal como lo haría, por ejemplo, Java.
Sin embargo, respaldaría la respuesta de Peter Westmacott porque, según mi experiencia, solo ejecutar partes de mi código en el REPL es la mayoría de las veces una forma suficiente de depuración.
fuente
Leiningen
, muestra:Error running 'ring server': Trampoline must be enabled for debugging
ring
olein
, ¿quizás valga la pena publicar una pregunta por separado?A partir de 2016, puede utilizar Debux , una biblioteca de depuración simple para Clojure / Script que funciona junto con su respuesta, así como la consola de su navegador. Puede rociar
dbg
(depurar) oclog
macros (console.log) en su código y observar fácilmente los resultados de funciones individuales, etc., impresas en su REPL y / o consola.Del archivo Léame del proyecto :
fuente
Hugo Duncan y sus colaboradores continúan haciendo un trabajo increíble con el proyecto ritz . Ritz-nrepl es un servidor nREPL con capacidades de depuración. Vea la charla de Hugo's Debuggers en Clojure en Clojure / Conj 2012 para verlo en acción, en el video algunas de las diapositivas no son legibles, por lo que es posible que desee ver las diapositivas desde aquí .
fuente
Use spyscope que implementa una macro de lector personalizado para que su código de depuración también sea código de producción https://github.com/dgrnbrg/spyscope
fuente
Viniendo de Java y familiarizado con Eclipse, me gusta lo que ofrece Counterclockwise (el complemento Eclipse para el desarrollo de Clojure): http://doc.ccw-ide.org/documentation.html#_debug_clojure_code
fuente
Aquí hay una buena macro para depurar
let
formas complicadas :... y un ensayo que explica su uso .
fuente
Versión funcional de def-let, que convierte un let en una serie de defs. Un poco de crédito va hasta aquí
Uso: necesita citar el contenido con una cita, p. Ej.
fuente