Skip to content

Clojure nREPL CIDER debugger

Oliver Caldwell edited this page Aug 26, 2022 · 5 revisions

Expectations

The CIDER debugger support inside Conjure is very rough and minimal. It has the bare bones set of features to let you inspect things but it’s not intended to be particularly pretty or smooth. This role will be filled by Olical/clojure-dap in the near future.

Usage

We initialise the debugger by running :ConjureCljDebugInit inside a Clojure buffer connected to a CIDER enabled nREPL.

Once done, you can add #break tags into your code where you would like it to pause. Once done, re-evaluate the code with the new #break tags like so:

(defn add
  "Hello, World!
  This is a function."
  [a b]
  #break (+ a b))

Now evaluate that code by invoking it with (add 1 2). This should pause the REPL and print something like this:

; --------------------------------------------------------------------------------
; CIDER debugger
; Respond with :ConjureCljDebugInput [input]
; Inputs: continue, locals, inspect, trace, here, continue-all, next, out, inject, inspect-prompt, quit, in, eval

As the output shows, we can inspect a specific value by executing :ConjureCljDebugInput inspect-prompt then entering the name of a value we’re interested in at the following prompt, such as b. It will then print information about the value you asked about.

We can print the current value and information about it with :ConjureCljDebugInput inspect or the locals with :ConjureCljDebugInput locals, which looks like the output below.

; --------------------------------------------------------------------------------
; CIDER debugger
; Class: clojure.lang.PersistentArrayMap
; Contents:
;   a = 1
;   b = 2
;
; Respond with :ConjureCljDebugInput [input]
; Inputs: continue, locals, inspect, trace, here, continue-all, next, out, inject, inspect-prompt, quit, in, eval

Not all features will work correctly, this is a best effort approach and just a stop gap until the DAP system is ready to go.