elisp: Using Edebug

 
 17.2.1 Using Edebug
 -------------------
 
 To debug a Lisp program with Edebug, you must first “instrument” the
 Lisp code that you want to debug.  A simple way to do this is to first
 move point into the definition of a function or macro and then do ‘C-u
 C-M-x’ (‘eval-defun’ with a prefix argument).  See See
 Instrumenting, for alternative ways to instrument code.
 
    Once a function is instrumented, any call to the function activates
 Edebug.  Depending on which Edebug execution mode you have selected,
 activating Edebug may stop execution and let you step through the
 function, or it may update the display and continue execution while
 checking for debugging commands.  The default execution mode is step,
 which stops execution.  SeeEdebug Execution Modes.
 
    Within Edebug, you normally view an Emacs buffer showing the source
 of the Lisp code you are debugging.  This is referred to as the “source
 code buffer”, and it is temporarily read-only.
 
    An arrow in the left fringe indicates the line where the function is
 executing.  Point initially shows where within the line the function is
 executing, but this ceases to be true if you move point yourself.
 
    If you instrument the definition of ‘fac’ (shown below) and then
 execute ‘(fac 3)’, here is what you would normally see.  Point is at the
 open-parenthesis before ‘if’.
 
      (defun fac (n)
      =>★(if (< 0 n)
            (* n (fac (1- n)))
          1))
 
    The places within a function where Edebug can stop execution are
 called “stop points”.  These occur both before and after each
 subexpression that is a list, and also after each variable reference.
 Here we use periods to show the stop points in the function ‘fac’:
 
      (defun fac (n)
        .(if .(< 0 n.).
            .(* n. .(fac .(1- n.).).).
          1).)
 
    The special commands of Edebug are available in the source code
 buffer in addition to the commands of Emacs Lisp mode.  For example, you
 can type the Edebug command <SPC> to execute until the next stop point.
 If you type <SPC> once after entry to ‘fac’, here is the display you
 will see:
 
      (defun fac (n)
      =>(if ★(< 0 n)
            (* n (fac (1- n)))
          1))
 
    When Edebug stops execution after an expression, it displays the
 expression’s value in the echo area.
 
    Other frequently used commands are ‘b’ to set a breakpoint at a stop
 point, ‘g’ to execute until a breakpoint is reached, and ‘q’ to exit
 Edebug and return to the top-level command loop.  Type ‘?’ to display a
 list of all Edebug commands.