Bagus, tetapi bagaimana Anda mendapatkan clojure untuk menemukan 'clojure.contrib.trace? Saya memiliki stoples clojure-contrib di classpath saya tetapi REPL mengatakanuser=> (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
Mungkinkah Anda salah mengeja clojure sebagai penutup, atau apakah itu salah ketik dalam komentar? Bisakah Anda memuat pustaka clojure.contrib lainnya?
Jika Anda mendapatkan: "IllegalStateException Tidak dapat secara dinamis mengikat var non-dinamis" lihat di sini: stackoverflow.com/questions/8875353/…
Cornelius
2
Apakah ini berfungsi di rilis 1.5 juga? Saya belajar Clojure dengan koan clojure, tetapi belum bisa mendapatkan dotrace untuk bekerja.
nha
100
Saya memiliki makro debugging kecil yang menurut saya sangat berguna:
;;debugging parts of expressions(defmacro dbg[x] `(let[x# ~x](println "dbg:" '~x "=" x#) x#))
Anda dapat memasukkannya di mana pun Anda ingin menonton apa yang terjadi dan kapan:
@ Zaz, saya setuju sepenuhnya. Spyscope luar biasa! Bahkan lebih baik daripada debugger. Tentunya untuk mengetik.
J Atkin
66
CIDER Emacs mendapatkan sumber debugger yang dapat Anda langkah ekspresi dengan ekspresi di dalam buffer Emacs dan bahkan menyuntikkan nilai baru. Anda dapat membaca semuanya di sini . Tangkapan layar demo:
Metode favorit saya adalah taburan liberal printlndi seluruh kode ... Mengaktifkan dan menonaktifkannya mudah berkat #_makro pembaca (yang membuat pembaca membaca dalam bentuk berikut, lalu berpura-pura tidak pernah melihatnya). Atau Anda bisa menggunakan ekspansi makro baik ke badan yang lewat atau niltergantung pada nilai beberapa variabel khusus, katakan *debug*:
Lalu ada sesuatu yang saat ini tidak sesuai dengan berlagak-clojure 's REPL, tapi terlalu baik untuk tidak menyebutkan: debug-repl. Anda dapat menggunakannya dalam REPL mandiri, yang mudah didapat misalnya dengan Leiningen ( lein repl); dan jika Anda meluncurkan program Anda dari baris perintah, maka itu akan membawa REPL sendiri tepat di terminal Anda. Idenya adalah bahwa Anda dapat menjatuhkan debug-replmakro di mana saja Anda suka dan memunculkan REPL sendiri ketika eksekusi program mencapai titik itu, dengan semua penduduk setempat dalam ruang lingkup dll. Beberapa tautan yang relevan: Clojure debug-repl , Clojure debug trik -repl , bagaimana dengan debug-repl (pada grup Google Clojure), debug-repl pada Clojars .
swank-clojure melakukan pekerjaan yang memadai untuk menjadikan debugger bawaan SLIME bermanfaat saat bekerja dengan kode Clojure - perhatikan bagaimana bit yang tidak relevan dari stacktrace diklik sehingga mudah untuk menemukan masalah sebenarnya dalam kode yang sedang di-debug. Satu hal yang perlu diingat adalah bahwa fungsi anonim tanpa "tag nama" muncul di stacktrace dengan dasarnya tidak ada informasi berguna yang melekat padanya; ketika "tag nama" ditambahkan, itu muncul di stacktrace dan semuanya baik-baik saja:
(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)
^^^
Sebenarnya ada versi debug-repl yang berfungsi dengan swank sekarang: hugoduncan.org/post/2010/… (Spoiler lansiran: mengagumkan)
1
Benar, dan ada baiknya memiliki tautan di sini, terima kasih! Setuju pada mengagumkan. :-)
Michał Marczyk
Jika ini gaya Anda, Anda mungkin menyukai perpustakaan debux yang disebutkan dalam respons selanjutnya. github.com/philoskim/debux
Mallory-Erik
@ Mallory-Erik Terima kasih, saya akan memeriksanya!
Michał Marczyk
37
Anda juga dapat memasukkan kode untuk menjatuhkan diri ke REPL dengan semua binding lokal, menggunakan 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))))
Kemudian untuk menggunakannya, masukkan di mana pun Anda ingin memulai:
(defn my-function [a b c](let[d (some-calc)](debug-repl)))
Saya menempel ini di user.clj saya sehingga ini tersedia di semua sesi REPL.
"cara terbaik untuk kode Debug Clojure, saat menggunakan repl"
Bidang kiri sedikit, tetapi 'menggunakan REPL itu sendiri'.
Saya telah menulis hobi Clojure selama lebih dari setahun dan belum merasakan kebutuhan yang besar untuk alat debugging. Jika Anda menjaga fungsi Anda kecil, dan menjalankan masing-masing dengan input yang diharapkan di REPL dan mengamati hasilnya maka itu mungkin untuk memiliki gambaran yang cukup jelas tentang bagaimana kode Anda berperilaku.
Saya menemukan debugger paling berguna untuk mengamati STATE dalam aplikasi yang sedang berjalan. Clojure membuatnya mudah (dan menyenangkan!) Untuk menulis dalam gaya fungsional dengan struktur data yang tidak berubah (tidak ada perubahan kondisi). Ini secara besar-besaran mengurangi kebutuhan akan debugger. Setelah saya tahu bahwa semua komponen berperilaku seperti yang saya harapkan (memberikan perhatian khusus pada jenis-jenis hal) maka perilaku skala besar jarang menjadi masalah.
Untuk IntelliJ ada plugin Clojure yang sangat baik yang disebut Cursive . Antara lain, ia menyediakan REPL yang dapat Anda jalankan dalam mode debug dan melangkah melalui kode Clojure Anda seperti yang Anda lakukan untuk Java misalnya.
Saya akan menjawab kedua jawaban Peter Westmacott karena dalam pengalaman saya hanya menjalankan potongan kode saya di REPL sebagian besar waktu merupakan bentuk debugging yang cukup.
Tapi bagaimana cara debug Leiningen, ini menunjukkan:Error running 'ring server': Trampoline must be enabled for debugging
Gank
Itu tampaknya khusus untuk ringatau lein- mungkin layak posting pertanyaan terpisah?
dskrvk
6
Pada 2016 Anda dapat menggunakan Debux , pustaka debugging sederhana untuk Clojure / Script yang bekerja bersama dengan repl Anda serta konsol browser Anda. Anda dapat menaburkan dbg(debug) atau clog(console.log) makro dalam kode Anda dan dengan mudah mengamati hasil fungsi individu, dll, dicetak ke REPL Anda dan / atau konsol.
Ini adalah contoh sederhana. Makro dbg mencetak bentuk asli dan mencetak nilai yang dievaluasi pada jendela REPL. Kemudian mengembalikan nilai tanpa mengganggu pelaksanaan kode.
Hugo Duncan dan kolaborator terus melakukan pekerjaan luar biasa dengan proyek ritz . Ritz-nrepl adalah server nREPL dengan kemampuan debug. Tonton Hugo Debuggers di Clojure berbicara di Clojure / Conj 2012 untuk melihatnya beraksi, dalam video beberapa slide tidak dapat dibaca sehingga Anda mungkin ingin melihat slide dari sini .
Gunakan spyscope yang mengimplementasikan makro pembaca kustom sehingga kode debug Anda juga merupakan kode produksi
https://github.com/dgrnbrg/spyscope
Jawaban:
Ada juga dotrace, yang memungkinkan Anda untuk melihat input dan output fungsi yang dipilih.
menghasilkan output:
Di Clojure 1.4,
dotrace
telah pindah:Anda membutuhkan ketergantungan:
Dan Anda perlu menambahkan ^: dinamis ke definisi fungsi
Kemudian Bob sekali lagi pamanmu:
sumber
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)
Saya memiliki makro debugging kecil yang menurut saya sangat berguna:
Anda dapat memasukkannya di mana pun Anda ingin menonton apa yang terjadi dan kapan:
sumber
clojure.tools.trace/trace
.CIDER Emacs mendapatkan sumber debugger yang dapat Anda langkah ekspresi dengan ekspresi di dalam buffer Emacs dan bahkan menyuntikkan nilai baru. Anda dapat membaca semuanya di sini . Tangkapan layar demo:
sumber
Metode favorit saya adalah taburan liberal
println
di seluruh kode ... Mengaktifkan dan menonaktifkannya mudah berkat#_
makro pembaca (yang membuat pembaca membaca dalam bentuk berikut, lalu berpura-pura tidak pernah melihatnya). Atau Anda bisa menggunakan ekspansi makro baik ke badan yang lewat ataunil
tergantung pada nilai beberapa variabel khusus, katakan*debug*
:Dengan
(def *debug* false)
di sana, ini akan diperluas kenil
. Dengantrue
, itu akan berkembang menjadibody
terbungkus ado
.Jawaban yang diterima untuk pertanyaan SO ini: Clojure Idiomatik untuk pelaporan kemajuan? sangat membantu ketika men-debug operasi urutan.
Lalu ada sesuatu yang saat ini tidak sesuai dengan berlagak-clojure 's REPL, tapi terlalu baik untuk tidak menyebutkan:
debug-repl
. Anda dapat menggunakannya dalam REPL mandiri, yang mudah didapat misalnya dengan Leiningen (lein repl
); dan jika Anda meluncurkan program Anda dari baris perintah, maka itu akan membawa REPL sendiri tepat di terminal Anda. Idenya adalah bahwa Anda dapat menjatuhkandebug-repl
makro di mana saja Anda suka dan memunculkan REPL sendiri ketika eksekusi program mencapai titik itu, dengan semua penduduk setempat dalam ruang lingkup dll. Beberapa tautan yang relevan: Clojure debug-repl , Clojure debug trik -repl , bagaimana dengan debug-repl (pada grup Google Clojure), debug-repl pada Clojars .swank-clojure melakukan pekerjaan yang memadai untuk menjadikan debugger bawaan SLIME bermanfaat saat bekerja dengan kode Clojure - perhatikan bagaimana bit yang tidak relevan dari stacktrace diklik sehingga mudah untuk menemukan masalah sebenarnya dalam kode yang sedang di-debug. Satu hal yang perlu diingat adalah bahwa fungsi anonim tanpa "tag nama" muncul di stacktrace dengan dasarnya tidak ada informasi berguna yang melekat padanya; ketika "tag nama" ditambahkan, itu muncul di stacktrace dan semuanya baik-baik saja:
sumber
Anda juga dapat memasukkan kode untuk menjatuhkan diri ke REPL dengan semua binding lokal, menggunakan Alex Osborne
debug-repl
:Kemudian untuk menggunakannya, masukkan di mana pun Anda ingin memulai:
Saya menempel ini di user.clj saya sehingga ini tersedia di semua sesi REPL.
sumber
"cara terbaik untuk kode Debug Clojure, saat menggunakan repl"
Bidang kiri sedikit, tetapi 'menggunakan REPL itu sendiri'.
Saya telah menulis hobi Clojure selama lebih dari setahun dan belum merasakan kebutuhan yang besar untuk alat debugging. Jika Anda menjaga fungsi Anda kecil, dan menjalankan masing-masing dengan input yang diharapkan di REPL dan mengamati hasilnya maka itu mungkin untuk memiliki gambaran yang cukup jelas tentang bagaimana kode Anda berperilaku.
Saya menemukan debugger paling berguna untuk mengamati STATE dalam aplikasi yang sedang berjalan. Clojure membuatnya mudah (dan menyenangkan!) Untuk menulis dalam gaya fungsional dengan struktur data yang tidak berubah (tidak ada perubahan kondisi). Ini secara besar-besaran mengurangi kebutuhan akan debugger. Setelah saya tahu bahwa semua komponen berperilaku seperti yang saya harapkan (memberikan perhatian khusus pada jenis-jenis hal) maka perilaku skala besar jarang menjadi masalah.
sumber
Jika Anda menggunakan emacs / slime / swank, maka coba ini di REPL:
Itu tidak memberi Anda jejak tumpukan penuh seperti yang Anda dapatkan di bawah LISP, tapi itu bagus untuk mencari-cari.
Ini adalah karya bagus dari:
http://hugoduncan.org/post/2010/swank_clojure_gets_a_break_with_the_local_environment.xhtml
seperti yang disebutkan dalam komentar di atas.
sumber
Untuk IntelliJ ada plugin Clojure yang sangat baik yang disebut Cursive . Antara lain, ia menyediakan REPL yang dapat Anda jalankan dalam mode debug dan melangkah melalui kode Clojure Anda seperti yang Anda lakukan untuk Java misalnya.
Saya akan menjawab kedua jawaban Peter Westmacott karena dalam pengalaman saya hanya menjalankan potongan kode saya di REPL sebagian besar waktu merupakan bentuk debugging yang cukup.
sumber
Leiningen
, ini menunjukkan:Error running 'ring server': Trampoline must be enabled for debugging
ring
ataulein
- mungkin layak posting pertanyaan terpisah?Pada 2016 Anda dapat menggunakan Debux , pustaka debugging sederhana untuk Clojure / Script yang bekerja bersama dengan repl Anda serta konsol browser Anda. Anda dapat menaburkan
dbg
(debug) atauclog
(console.log) makro dalam kode Anda dan dengan mudah mengamati hasil fungsi individu, dll, dicetak ke REPL Anda dan / atau konsol.Dari Readme proyek :
sumber
Hugo Duncan dan kolaborator terus melakukan pekerjaan luar biasa dengan proyek ritz . Ritz-nrepl adalah server nREPL dengan kemampuan debug. Tonton Hugo Debuggers di Clojure berbicara di Clojure / Conj 2012 untuk melihatnya beraksi, dalam video beberapa slide tidak dapat dibaca sehingga Anda mungkin ingin melihat slide dari sini .
sumber
Gunakan spyscope yang mengimplementasikan makro pembaca kustom sehingga kode debug Anda juga merupakan kode produksi https://github.com/dgrnbrg/spyscope
sumber
Berasal dari Jawa dan terbiasa dengan Eclipse, saya menyukai apa yang berlawanan dengan berlawanan (plugin Eclipse untuk pengembangan Clojure) tawarkan: http://doc.ccw-ide.org/documentation.html#_debug_clojure_code
sumber
Berikut ini makro bagus untuk debugging
let
formulir yang rumit :... dan esai yang menjelaskan penggunaannya .
sumber
Versi fungsi dari def-let, yang mengubah let menjadi serangkaian def. Beberapa kredit masuk ke sini
Penggunaan: Perlu mengutip konten dengan kutipan, misalnya
sumber