Bien, mais comment faire pour que clojure trouve 'clojure.contrib.trace? J'ai le pot de clojure-contrib sur mon 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)
chemin de classe
2
Pourriez-vous mal orthographier clojure comme fermeture, ou est-ce une faute de frappe dans le commentaire? Pouvez-vous charger d'autres bibliothèques clojure.contrib?
@Zaz, je suis totalement d'accord. Spyscope est génial! Encore mieux peut-être qu'un débogueur. Certainement pour taper.
J Atkin
66
Le CIDER d'Emacs a un débogueur source que vous pouvez parcourir expression par expression dans un tampon Emacs et même injecter de nouvelles valeurs. Vous pouvez tout lire ici . Une capture d'écran de démonstration:
Ma méthode préférée est un saupoudrage libéral de printlns partout dans le code ... Les allumer et éteindre est facile grâce à la #_macro de lecture (qui fait lire le lecteur sous la forme suivante, puis fait semblant de ne jamais l'avoir vu). Ou vous pouvez utiliser une macro se développant sur un corps transmis ou en nilfonction de la valeur d'une variable spéciale, par exemple *debug*:
Ensuite , il y a quelque chose qui est actuellement incompatible avec Swank-clojure de » REPL, mais il est trop bon pour ne pas mentionner: debug-repl. Vous pouvez l'utiliser dans un REPL autonome, ce qui est facile à obtenir par exemple avec Leiningen ( lein repl); et si vous lancez votre programme à partir de la ligne de commande, alors il va afficher son propre REPL directement dans votre terminal. L'idée est que vous pouvez laisser tomber la debug-replmacro où vous voulez et avoir apporter son propre REPL lorsque les biefs d'exécution du programme qui points, avec toutes les sections locales de périmètre , etc. Un couple de liens pertinents: Le Clojure debug-repl , debug Clojure -repl astuces , comment faire un débogage-repl (sur le groupe Google Clojure), débogage-repl sur Clojars .
swank-clojure fait un travail adéquat pour rendre le débogueur intégré de SLIME utile lorsque vous travaillez avec du code Clojure - notez comment les bits non pertinents de la trace de pile sont grisés afin qu'il soit facile de trouver le problème réel dans le code en cours de débogage. Une chose à garder à l'esprit est que les fonctions anonymes sans «balises de nom» apparaissent dans la pile de traces sans aucune information utile qui leur est attachée; quand une "étiquette de nom" est ajoutée, elle apparaît dans le stacktrace et tout va bien à nouveau:
(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 fait, il existe une version du débogage-repl qui fonctionne avec swank maintenant: hugoduncan.org/post/2010/… (Alerte spoiler : c'est génial)
1
D'accord, et c'est bien d'avoir un lien ici, merci! D'accord sur génial. :-)
Michał Marczyk
Si tel est votre style, vous aimerez peut-être la bibliothèque debux mentionnée dans une réponse ultérieure. github.com/philoskim/debux
Mallory-Erik
@ Mallory-Erik Merci, je vais vérifier!
Michał Marczyk
37
Vous pouvez également insérer du code pour vous déposer dans un REPL avec toutes les liaisons locales, en utilisant 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))))
Ensuite, pour l'utiliser, insérez-le où vous voulez que la réponse démarre:
(defn my-function [a b c](let[d (some-calc)](debug-repl)))
Je le colle dans mon user.clj donc il est disponible dans toutes les sessions REPL.
"meilleures façons de déboguer le code Clojure, tout en utilisant la repl"
Champ légèrement à gauche, mais «en utilisant le REPL lui-même».
J'écris à l'amateur Clojure depuis plus d'un an et je n'ai pas ressenti un grand besoin d'outils de débogage. Si vous gardez vos fonctions petites et exécutez chacune avec les entrées attendues au REPL et observez les résultats, il devrait être possible d'avoir une image assez claire du comportement de votre code.
Je trouve qu'un débogueur est le plus utile pour observer STATE dans une application en cours d'exécution. Clojure facilite (et amusant!) L'écriture dans un style fonctionnel avec des structures de données immuables (pas de changement d'état). Cela réduit considérablement le besoin d'un débogueur. Une fois que je sais que tous les composants se comportent comme prévu (en accordant une attention particulière aux types de choses), le comportement à grande échelle est rarement un problème.
Pour IntelliJ, il existe un excellent plugin Clojure appelé Cursive . Entre autres choses, il fournit un REPL que vous pouvez exécuter en mode débogage et parcourir votre code Clojure comme vous le feriez par exemple pour Java.
Je voudrais cependant seconder la réponse de Peter Westmacott dans la mesure où, d'après mon expérience, l'exécution de morceaux de mon code dans le REPL est la plupart du temps une forme suffisante de débogage.
Mais comment déboguer avec Leiningen, cela montre:Error running 'ring server': Trampoline must be enabled for debugging
Gank
Cela semble être spécifique à - ringou leinpeut-être la peine de publier une question distincte?
dskrvk
6
Depuis 2016, vous pouvez utiliser Debux , une bibliothèque de débogage simple pour Clojure / Script qui fonctionne en conjonction avec votre repl ainsi que la console de votre navigateur. Vous pouvez saupoudrer dbg(déboguer) ou clog(console.log) des macros dans votre code et observer facilement les résultats des fonctions individuelles, etc., imprimés sur votre REPL et / ou console.
Ceci est un exemple simple. La macro dbg imprime un formulaire original et imprime la valeur évaluée dans la fenêtre REPL. Ensuite, il renvoie la valeur sans interférer avec l'exécution du code.
Si vous enveloppez le code avec dbg comme ceci,
(* 2 (dbg (+ 10 20))) ; => 60
les éléments suivants seront imprimés dans la fenêtre REPL.
Hugo Duncan et ses collaborateurs continuent de faire un travail incroyable avec le projet Ritz . Ritz-nrepl est un serveur nREPL avec des capacités de débogage. Regardez les débogueurs de Hugo dans Clojure parler à Clojure / Conj 2012 pour le voir en action, dans la vidéo certaines des diapositives ne sont pas lisibles, vous voudrez peut-être voir les diapositives d' ici .
Utilisez spyscope qui implémente une macro de lecture personnalisée afin que votre code de débogage soit également le code de production
https://github.com/dgrnbrg/spyscope
Réponses:
Il y a aussi dotrace, qui vous permet de regarder les entrées et sorties des fonctions sélectionnées.
produit la sortie:
Dans Clojure 1.4,
dotrace
a déménagé:Vous avez besoin de la dépendance:
Et vous devez ajouter le ^: dynamic à la définition de la fonction
Ensuite, Bob est à nouveau votre oncle:
la source
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)
J'ai une petite macro de débogage que je trouve très utile:
Vous pouvez l'insérer où vous voulez regarder ce qui se passe et quand:
la source
clojure.tools.trace/trace
.Le CIDER d'Emacs a un débogueur source que vous pouvez parcourir expression par expression dans un tampon Emacs et même injecter de nouvelles valeurs. Vous pouvez tout lire ici . Une capture d'écran de démonstration:
la source
Ma méthode préférée est un saupoudrage libéral de
println
s partout dans le code ... Les allumer et éteindre est facile grâce à la#_
macro de lecture (qui fait lire le lecteur sous la forme suivante, puis fait semblant de ne jamais l'avoir vu). Ou vous pouvez utiliser une macro se développant sur un corps transmis ou ennil
fonction de la valeur d'une variable spéciale, par exemple*debug*
:Avec un
(def *debug* false)
là-dedans, cela s'étendra ànil
. Avectrue
, il s'agrandira pourbody
s'envelopper dans undo
.La réponse acceptée à cette question SO: Clojure idiomatique pour les rapports d'étape? est très utile lors du débogage des opérations de séquence.
Ensuite , il y a quelque chose qui est actuellement incompatible avec Swank-clojure de » REPL, mais il est trop bon pour ne pas mentionner:
debug-repl
. Vous pouvez l'utiliser dans un REPL autonome, ce qui est facile à obtenir par exemple avec Leiningen (lein repl
); et si vous lancez votre programme à partir de la ligne de commande, alors il va afficher son propre REPL directement dans votre terminal. L'idée est que vous pouvez laisser tomber ladebug-repl
macro où vous voulez et avoir apporter son propre REPL lorsque les biefs d'exécution du programme qui points, avec toutes les sections locales de périmètre , etc. Un couple de liens pertinents: Le Clojure debug-repl , debug Clojure -repl astuces , comment faire un débogage-repl (sur le groupe Google Clojure), débogage-repl sur Clojars .swank-clojure fait un travail adéquat pour rendre le débogueur intégré de SLIME utile lorsque vous travaillez avec du code Clojure - notez comment les bits non pertinents de la trace de pile sont grisés afin qu'il soit facile de trouver le problème réel dans le code en cours de débogage. Une chose à garder à l'esprit est que les fonctions anonymes sans «balises de nom» apparaissent dans la pile de traces sans aucune information utile qui leur est attachée; quand une "étiquette de nom" est ajoutée, elle apparaît dans le stacktrace et tout va bien à nouveau:
la source
Vous pouvez également insérer du code pour vous déposer dans un REPL avec toutes les liaisons locales, en utilisant Alex Osborne
debug-repl
:Ensuite, pour l'utiliser, insérez-le où vous voulez que la réponse démarre:
Je le colle dans mon user.clj donc il est disponible dans toutes les sessions REPL.
la source
"meilleures façons de déboguer le code Clojure, tout en utilisant la repl"
Champ légèrement à gauche, mais «en utilisant le REPL lui-même».
J'écris à l'amateur Clojure depuis plus d'un an et je n'ai pas ressenti un grand besoin d'outils de débogage. Si vous gardez vos fonctions petites et exécutez chacune avec les entrées attendues au REPL et observez les résultats, il devrait être possible d'avoir une image assez claire du comportement de votre code.
Je trouve qu'un débogueur est le plus utile pour observer STATE dans une application en cours d'exécution. Clojure facilite (et amusant!) L'écriture dans un style fonctionnel avec des structures de données immuables (pas de changement d'état). Cela réduit considérablement le besoin d'un débogueur. Une fois que je sais que tous les composants se comportent comme prévu (en accordant une attention particulière aux types de choses), le comportement à grande échelle est rarement un problème.
la source
Si vous utilisez emacs / slime / swank, essayez ceci au REPL:
Cela ne vous donne pas une trace complète de la pile comme vous le feriez sous LISP, mais c'est bon pour fouiner.
C'est le beau travail de:
http://hugoduncan.org/post/2010/swank_clojure_gets_a_break_with_the_local_environment.xhtml
comme cela a été mentionné dans un commentaire ci-dessus.
la source
Pour IntelliJ, il existe un excellent plugin Clojure appelé Cursive . Entre autres choses, il fournit un REPL que vous pouvez exécuter en mode débogage et parcourir votre code Clojure comme vous le feriez par exemple pour Java.
Je voudrais cependant seconder la réponse de Peter Westmacott dans la mesure où, d'après mon expérience, l'exécution de morceaux de mon code dans le REPL est la plupart du temps une forme suffisante de débogage.
la source
Leiningen
, cela montre:Error running 'ring server': Trampoline must be enabled for debugging
ring
oulein
peut-être la peine de publier une question distincte?Depuis 2016, vous pouvez utiliser Debux , une bibliothèque de débogage simple pour Clojure / Script qui fonctionne en conjonction avec votre repl ainsi que la console de votre navigateur. Vous pouvez saupoudrer
dbg
(déboguer) ouclog
(console.log) des macros dans votre code et observer facilement les résultats des fonctions individuelles, etc., imprimés sur votre REPL et / ou console.Du Readme du projet :
la source
Hugo Duncan et ses collaborateurs continuent de faire un travail incroyable avec le projet Ritz . Ritz-nrepl est un serveur nREPL avec des capacités de débogage. Regardez les débogueurs de Hugo dans Clojure parler à Clojure / Conj 2012 pour le voir en action, dans la vidéo certaines des diapositives ne sont pas lisibles, vous voudrez peut-être voir les diapositives d' ici .
la source
Utilisez spyscope qui implémente une macro de lecture personnalisée afin que votre code de débogage soit également le code de production https://github.com/dgrnbrg/spyscope
la source
Venant de Java et étant familier avec Eclipse, j'aime ce que Counterclockwise (le plugin Eclipse pour le développement de Clojure) a à offrir: http://doc.ccw-ide.org/documentation.html#_debug_clojure_code
la source
Voici une belle macro pour déboguer des
let
formulaires compliqués :... et un essai expliquant son utilisation .
la source
Version fonctionnelle de def-let, qui transforme un let en une série de defs. Un peu de crédit va ici
Utilisation: doit citer le contenu avec une citation, par exemple
la source