Fajnie, ale jak zdobyć clojure, aby znaleźć „clojure.contrib.trace? Mam słoik z dodatkiem clojure na mojej ścieżce klasy, ale REPL mówiuser=> (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
Czy mógłbyś być błędnym pisaniem clojure jako zamknięcie, czy jest to literówka w komentarzu? Czy możesz załadować inne biblioteki clojure.contrib?
@Zaz Całkowicie się zgadzam. Spyscope jest niesamowity! Może nawet lepszy niż debugger. Z pewnością do pisania.
J Atkin
66
CIDER Emacsa ma źródłowy debugger, w którym można krok po kroku wyrażać wyrażenie w buforze Emacsa, a nawet wprowadzać nowe wartości. Możesz przeczytać o tym wszystko tutaj . Zrzut ekranu pokazowy:
Moją ulubioną metodą jest swobodne posypywanie printlns całego kodu ... Włączanie i wyłączanie ich jest łatwe dzięki #_makro czytelnika (które sprawia, że czytnik czyta w następującej formie, a potem udaje, że go nigdy nie widział). Możesz też użyć makra rozwijającego się do przekazywanej treści lub w nilzależności od wartości jakiejś specjalnej zmiennej, powiedz *debug*:
Potem jest coś, co jest obecnie niezgodne z Swank-Clojure „s REPL, ale jest zbyt dobre, nie wspominając: debug-repl. Możesz go używać w samodzielnej REPL, którą łatwo uzyskać np. Za pomocą Leiningen ( lein repl); a jeśli uruchamiasz swój program z wiersza poleceń, to uruchomi on swój REPL bezpośrednio w twoim terminalu. Chodzi o to, że można upuścić debug-replmakra w dowolnym miejscu i mieć go wychować własne rEPL gdy osiągnie wykonawcze zawarte w programie, które wskazują, ze wszystkich mieszkańców w zakresie itd. Kilka istotnych linków: Clojure debug-rEPL , Clojure debug -repl sztuczki , jak o debug-repl (w grupie Clojure Google), debug-repl w Clojars .
swank-clojure wykonuje odpowiednią pracę, czyniąc wbudowany debugger SLIME użytecznym podczas pracy z kodem Clojure - zwróć uwagę na to, jak niepotrzebne bity stacktrace są wyszarzone, więc łatwo jest znaleźć rzeczywisty problem w debugowanym kodzie. Należy pamiętać, że anonimowe funkcje bez „znaczników nazw” pojawiają się w stacktrace, w zasadzie bez żadnych przydatnych informacji; po dodaniu „plakietki” pojawia się w pliku śledzenia i wszystko jest w porządku:
(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)
^^^
Tak, i dobrze jest mieć tutaj link, dzięki! Zgodził się na niesamowite. :-)
Michał Marczyk
Jeśli taki jest twój styl, może ci się spodobać biblioteka debux wymieniona w następnej odpowiedzi. github.com/philoskim/debux
Mallory-Erik
@ Mallory-Erik Dzięki, sprawdzę to!
Michał Marczyk 19.04.16
37
Możesz także wstawić kod, aby przejść do REPL ze wszystkimi lokalnymi powiązaniami, używając Alexa Osborne'adebug-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))))
Następnie, aby go użyć, wstaw go tam, gdzie chcesz rozpocząć replikę:
(defn my-function [a b c](let[d (some-calc)](debug-repl)))
Wrzucam to do pliku user.clj, aby był dostępny we wszystkich sesjach REPL.
„najlepsze sposoby debugowania kodu Clojure podczas korzystania z repl”
Nieznacznie lewe pole, ale „sam korzystam z REPL”.
Od ponad roku piszę hobbystkę Clojure i nie odczuwałem potrzeby stosowania żadnych narzędzi do debugowania. Jeśli utrzymujesz swoje funkcje na małym poziomie i uruchamiasz każdą z oczekiwanymi danymi wejściowymi na REPL i obserwujesz wyniki, powinien istnieć całkiem jasny obraz tego, jak zachowuje się twój kod.
Uważam, że debuger jest najbardziej przydatny do obserwowania stanu w uruchomionej aplikacji. Clojure ułatwia (i sprawia przyjemność!) Pisanie w funkcjonalnym stylu z niezmiennymi strukturami danych (bez zmieniającego się stanu). To znacznie zmniejsza potrzebę debuggera. Kiedy już wiem, że wszystkie komponenty zachowują się tak, jak się spodziewam (zwracając szczególną uwagę na rodzaje rzeczy), zachowanie na dużą skalę rzadko stanowi problem.
Dla IntelliJ istnieje doskonała wtyczka Clojure o nazwie Cursive . Zapewnia między innymi REPL, który można uruchomić w trybie debugowania i przechodzić przez kod Clojure, tak jak na przykład w Javie.
Poparłbym odpowiedź Petera Westmacotta, chociaż z mojego doświadczenia wynika, że po prostu uruchamianie fragmentów mojego kodu w REPL jest przez większość czasu wystarczającą formą debugowania.
Ale jak debugować Leiningen, pokazuje:Error running 'ring server': Trampoline must be enabled for debugging
Gank
Wydaje się, że jest to specyficzne ringlub lein- może warto zadać osobne pytanie?
dskrvk
6
Od 2016 roku możesz używać Debux , prostej biblioteki debugowania dla Clojure / Script, która działa w połączeniu z twoją repliką, a także konsolą przeglądarki. Możesz posypywać dbg(debugować) lub clog(console.log) makra w swoim kodzie i łatwo obserwować wyniki poszczególnych funkcji itp. Wydrukowane na REPL i / lub konsoli.
To jest prosty przykład. Makro dbg drukuje oryginalny formularz i ładnie drukuje oszacowaną wartość w oknie REPL. Następnie zwraca wartość bez zakłócania wykonywania kodu.
Jeśli otoczysz kod dbg w ten sposób,
(* 2 (dbg (+ 10 20))) ; => 60
następujące elementy zostaną wydrukowane w oknie REPL.
Hugo Duncan i współpracownicy nadal wykonują niesamowitą pracę z projektem Ritz . Ritz-nrepl to serwer nREPL z funkcjami debugowania. Obejrzyj debugowanie Hugo w debiucie w Clojure na Clojure / Conj 2012, aby zobaczyć, jak działa, w filmie niektóre slajdy nie są czytelne, więc możesz chcieć je obejrzeć tutaj .
Użyj spyscope, który implementuje niestandardowe makro czytnika, aby kod debugowania był również kodem produkcyjnym
https://github.com/dgrnbrg/spyscope
Odpowiedzi:
Istnieje również dotrace, który pozwala spojrzeć na wejścia i wyjścia wybranych funkcji.
daje wynik:
W Clojure 1.4
dotrace
przeprowadził się:Potrzebujesz zależności:
I musisz dodać dynamikę ^: do definicji funkcji
Zatem Bob po raz kolejny jest wujem:
źródło
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)
Mam małe makro debugujące, które uważam za bardzo przydatne:
Możesz wstawić go tam, gdzie chcesz oglądać, co się dzieje i kiedy:
źródło
clojure.tools.trace/trace
.CIDER Emacsa ma źródłowy debugger, w którym można krok po kroku wyrażać wyrażenie w buforze Emacsa, a nawet wprowadzać nowe wartości. Możesz przeczytać o tym wszystko tutaj . Zrzut ekranu pokazowy:
źródło
Moją ulubioną metodą jest swobodne posypywanie
println
s całego kodu ... Włączanie i wyłączanie ich jest łatwe dzięki#_
makro czytelnika (które sprawia, że czytnik czyta w następującej formie, a potem udaje, że go nigdy nie widział). Możesz też użyć makra rozwijającego się do przekazywanej treści lub wnil
zależności od wartości jakiejś specjalnej zmiennej, powiedz*debug*
:Z
(def *debug* false)
tam, to rozwinie się donil
. Ztrue
, rozwinie się dobody
owiniętego wdo
.Przyjęta odpowiedź na to pytanie SO: Idiomatic Clojure do zgłaszania postępów? jest bardzo pomocny podczas debugowania operacji sekwencji.
Potem jest coś, co jest obecnie niezgodne z Swank-Clojure „s REPL, ale jest zbyt dobre, nie wspominając:
debug-repl
. Możesz go używać w samodzielnej REPL, którą łatwo uzyskać np. Za pomocą Leiningen (lein repl
); a jeśli uruchamiasz swój program z wiersza poleceń, to uruchomi on swój REPL bezpośrednio w twoim terminalu. Chodzi o to, że można upuścićdebug-repl
makra w dowolnym miejscu i mieć go wychować własne rEPL gdy osiągnie wykonawcze zawarte w programie, które wskazują, ze wszystkich mieszkańców w zakresie itd. Kilka istotnych linków: Clojure debug-rEPL , Clojure debug -repl sztuczki , jak o debug-repl (w grupie Clojure Google), debug-repl w Clojars .swank-clojure wykonuje odpowiednią pracę, czyniąc wbudowany debugger SLIME użytecznym podczas pracy z kodem Clojure - zwróć uwagę na to, jak niepotrzebne bity stacktrace są wyszarzone, więc łatwo jest znaleźć rzeczywisty problem w debugowanym kodzie. Należy pamiętać, że anonimowe funkcje bez „znaczników nazw” pojawiają się w stacktrace, w zasadzie bez żadnych przydatnych informacji; po dodaniu „plakietki” pojawia się w pliku śledzenia i wszystko jest w porządku:
źródło
Możesz także wstawić kod, aby przejść do REPL ze wszystkimi lokalnymi powiązaniami, używając Alexa Osborne'a
debug-repl
:Następnie, aby go użyć, wstaw go tam, gdzie chcesz rozpocząć replikę:
Wrzucam to do pliku user.clj, aby był dostępny we wszystkich sesjach REPL.
źródło
„najlepsze sposoby debugowania kodu Clojure podczas korzystania z repl”
Nieznacznie lewe pole, ale „sam korzystam z REPL”.
Od ponad roku piszę hobbystkę Clojure i nie odczuwałem potrzeby stosowania żadnych narzędzi do debugowania. Jeśli utrzymujesz swoje funkcje na małym poziomie i uruchamiasz każdą z oczekiwanymi danymi wejściowymi na REPL i obserwujesz wyniki, powinien istnieć całkiem jasny obraz tego, jak zachowuje się twój kod.
Uważam, że debuger jest najbardziej przydatny do obserwowania stanu w uruchomionej aplikacji. Clojure ułatwia (i sprawia przyjemność!) Pisanie w funkcjonalnym stylu z niezmiennymi strukturami danych (bez zmieniającego się stanu). To znacznie zmniejsza potrzebę debuggera. Kiedy już wiem, że wszystkie komponenty zachowują się tak, jak się spodziewam (zwracając szczególną uwagę na rodzaje rzeczy), zachowanie na dużą skalę rzadko stanowi problem.
źródło
Jeśli używasz emacs / slime / swank, spróbuj tego na REPL:
Nie daje ci śladu pełnego stosu, jak w LISP-ie, ale jest dobry do przeszukiwania.
To jest dobra praca:
http://hugoduncan.org/post/2010/swank_clojure_gets_a_break_with_the_local_environment.xhtml
jak wspomniano w komentarzu powyżej.
źródło
Dla IntelliJ istnieje doskonała wtyczka Clojure o nazwie Cursive . Zapewnia między innymi REPL, który można uruchomić w trybie debugowania i przechodzić przez kod Clojure, tak jak na przykład w Javie.
Poparłbym odpowiedź Petera Westmacotta, chociaż z mojego doświadczenia wynika, że po prostu uruchamianie fragmentów mojego kodu w REPL jest przez większość czasu wystarczającą formą debugowania.
źródło
Leiningen
, pokazuje:Error running 'ring server': Trampoline must be enabled for debugging
ring
lublein
- może warto zadać osobne pytanie?Od 2016 roku możesz używać Debux , prostej biblioteki debugowania dla Clojure / Script, która działa w połączeniu z twoją repliką, a także konsolą przeglądarki. Możesz posypywać
dbg
(debugować) lubclog
(console.log) makra w swoim kodzie i łatwo obserwować wyniki poszczególnych funkcji itp. Wydrukowane na REPL i / lub konsoli.Z pliku Readme projektu :
źródło
Hugo Duncan i współpracownicy nadal wykonują niesamowitą pracę z projektem Ritz . Ritz-nrepl to serwer nREPL z funkcjami debugowania. Obejrzyj debugowanie Hugo w debiucie w Clojure na Clojure / Conj 2012, aby zobaczyć, jak działa, w filmie niektóre slajdy nie są czytelne, więc możesz chcieć je obejrzeć tutaj .
źródło
Użyj spyscope, który implementuje niestandardowe makro czytnika, aby kod debugowania był również kodem produkcyjnym https://github.com/dgrnbrg/spyscope
źródło
Pochodząc z Javy i znając Eclipse, podoba mi się to, co ma do zaoferowania Counterclockwise (wtyczka Eclipse do programowania Clojure): http://doc.ccw-ide.org/documentation.html#_debug_clojure_code
źródło
Oto ładne makro do debugowania skomplikowanych
let
formularzy:... i esej wyjaśniający jego użycie .
źródło
Wersja funkcji def-let, która zmienia let w serię def. Trochę tutaj zasługuje
Zastosowanie: Wymaga cytowania treści z cytatem, np
źródło