@c -*-texinfo-*-@c This is part of the GNU Emacs Lisp Reference Manual.@c Copyright (C) 1990, 1991, 1992, 1993, 1994, 1998, 1999, 2002, 2003, 2004,@c 2005, 2006 Free Software Foundation, Inc.@c See the file elisp.texi for copying conditions.@setfilename ../info/debugging@node Debugging, Read and Print, Advising Functions, Top@chapter Debugging Lisp Programs There are three ways to investigate a problem in an Emacs Lisp program,depending on what you are doing with the program when the problem appears.@itemize @bullet@itemIf the problem occurs when you run the program, you can use a Lispdebugger to investigate what is happening during execution. In additionto the ordinary debugger, Emacs comes with a source-level debugger,Edebug. This chapter describes both of them.@itemIf the problem is syntactic, so that Lisp cannot even read the program,you can use the Emacs facilities for editing Lisp to localize it.@itemIf the problem occurs when trying to compile the program with the bytecompiler, you need to know how to examine the compiler's input buffer.@end itemize@menu* Debugger:: How the Emacs Lisp debugger is implemented.* Edebug:: A source-level Emacs Lisp debugger.* Syntax Errors:: How to find syntax errors.* Test Coverage:: Ensuring you have tested all branches in your code.* Compilation Errors:: How to find errors that show up in byte compilation.@end menu Another useful debugging tool is the dribble file. When a dribblefile is open, Emacs copies all keyboard input characters to that file.Afterward, you can examine the file to find out what input was used.@xref{Terminal Input}. For debugging problems in terminal descriptions, the@code{open-termscript} function can be useful. @xref{Terminal Output}.@node Debugger@section The Lisp Debugger@cindex debugger@cindex Lisp debugger@cindex break The ordinary @dfn{Lisp debugger} provides the ability to suspendevaluation of a form. While evaluation is suspended (a state that iscommonly known as a @dfn{break}), you may examine the run time stack,examine the values of local or global variables, or change those values.Since a break is a recursive edit, all the usual editing facilities ofEmacs are available; you can even run programs that will enter thedebugger recursively. @xref{Recursive Editing}.@menu* Error Debugging:: Entering the debugger when an error happens.* Infinite Loops:: Stopping and debugging a program that doesn't exit.* Function Debugging:: Entering it when a certain function is called.* Explicit Debug:: Entering it at a certain point in the program.* Using Debugger:: What the debugger does; what you see while in it.* Debugger Commands:: Commands used while in the debugger.* Invoking the Debugger:: How to call the function @code{debug}.* Internals of Debugger:: Subroutines of the debugger, and global variables.@end menu@node Error Debugging@subsection Entering the Debugger on an Error@cindex error debugging@cindex debugging errors The most important time to enter the debugger is when a Lisp errorhappens. This allows you to investigate the immediate causes of theerror. However, entry to the debugger is not a normal consequence of anerror. Many commands frequently cause Lisp errors when invokedinappropriately (such as @kbd{C-f} at the end of the buffer), and duringordinary editing it would be very inconvenient to enter the debuggereach time this happens. So if you want errors to enter the debugger, setthe variable @code{debug-on-error} to non-@code{nil}. (The command@code{toggle-debug-on-error} provides an easy way to do this.)@defopt debug-on-errorThis variable determines whether the debugger is called when an error issignaled and not handled. If @code{debug-on-error} is @code{t}, allkinds of errors call the debugger (except those listed in@code{debug-ignored-errors}). If it is @code{nil}, none call thedebugger.The value can also be a list of error conditions that should call thedebugger. For example, if you set it to the list@code{(void-variable)}, then only errors about a variable that has novalue invoke the debugger.When this variable is non-@code{nil}, Emacs does not create an errorhandler around process filter functions and sentinels. Therefore,errors in these functions also invoke the debugger. @xref{Processes}.@end defopt@defopt debug-ignored-errorsThis variable specifies certain kinds of errors that should not enterthe debugger. Its value is a list of error condition symbols and/orregular expressions. If the error has any of those condition symbols,or if the error message matches any of the regular expressions, thenthat error does not enter the debugger, regardless of the value of@code{debug-on-error}.The normal value of this variable lists several errors that happen oftenduring editing but rarely result from bugs in Lisp programs. However,``rarely'' is not ``never''; if your program fails with an error thatmatches this list, you will need to change this list in order to debugthe error. The easiest way is usually to set@code{debug-ignored-errors} to @code{nil}.@end defopt@defopt eval-expression-debug-on-errorIf this variable has a non-@code{nil} value, then@code{debug-on-error} is set to @code{t} when evaluating with thecommand @code{eval-expression}. If@code{eval-expression-debug-on-error} is @code{nil}, then the value of@code{debug-on-error} is not changed. @xref{Lisp Eval,, EvaluatingEmacs-Lisp Expressions, emacs, The GNU Emacs Manual}.@end defopt@defopt debug-on-signalNormally, errors that are caught by @code{condition-case} never run thedebugger, even if @code{debug-on-error} is non-@code{nil}. In otherwords, @code{condition-case} gets a chance to handle the error beforethe debugger gets a chance.If you set @code{debug-on-signal} to a non-@code{nil} value, then thedebugger gets the first chance at every error; an error will invoke thedebugger regardless of any @code{condition-case}, if it fits thecriteria specified by the values of @code{debug-on-error} and@code{debug-ignored-errors}.@strong{Warning:} This variable is strong medicine! Various parts ofEmacs handle errors in the normal course of affairs, and you may noteven realize that errors happen there. If you set@code{debug-on-signal} to a non-@code{nil} value, those errors willenter the debugger.@strong{Warning:} @code{debug-on-signal} has no effect when@code{debug-on-error} is @code{nil}.@end defopt To debug an error that happens during loading of the initfile, use the option @samp{--debug-init}. This binds@code{debug-on-error} to @code{t} while loading the init file, andbypasses the @code{condition-case} which normally catches errors in theinit file. If your init file sets @code{debug-on-error}, the effect maynot last past the end of loading the init file. (This is an undesirablebyproduct of the code that implements the @samp{--debug-init} commandline option.) The best way to make the init file set@code{debug-on-error} permanently is with @code{after-init-hook}, likethis:@example(add-hook 'after-init-hook (lambda () (setq debug-on-error t)))@end example@node Infinite Loops@subsection Debugging Infinite Loops@cindex infinite loops@cindex loops, infinite@cindex quitting from infinite loop@cindex stopping an infinite loop When a program loops infinitely and fails to return, your firstproblem is to stop the loop. On most operating systems, you can do thiswith @kbd{C-g}, which causes a @dfn{quit}. Ordinary quitting gives no information about why the program waslooping. To get more information, you can set the variable@code{debug-on-quit} to non-@code{nil}. Quitting with @kbd{C-g} is notconsidered an error, and @code{debug-on-error} has no effect on thehandling of @kbd{C-g}. Likewise, @code{debug-on-quit} has no effect onerrors. Once you have the debugger running in the middle of the infinite loop,you can proceed from the debugger using the stepping commands. If youstep through the entire loop, you will probably get enough informationto solve the problem.@defopt debug-on-quitThis variable determines whether the debugger is called when @code{quit}is signaled and not handled. If @code{debug-on-quit} is non-@code{nil},then the debugger is called whenever you quit (that is, type @kbd{C-g}).If @code{debug-on-quit} is @code{nil}, then the debugger is not calledwhen you quit. @xref{Quitting}.@end defopt@node Function Debugging@subsection Entering the Debugger on a Function Call@cindex function call debugging@cindex debugging specific functions To investigate a problem that happens in the middle of a program, oneuseful technique is to enter the debugger whenever a certain function iscalled. You can do this to the function in which the problem occurs,and then step through the function, or you can do this to a functioncalled shortly before the problem, step quickly over the call to thatfunction, and then step through its caller.@deffn Command debug-on-entry function-nameThis function requests @var{function-name} to invoke the debugger eachtime it is called. It works by inserting the form@code{(implement-debug-on-entry)} into the function definition as thefirst form.Any function or macro defined as Lisp code may be set to break onentry, regardless of whether it is interpreted code or compiled code.If the function is a command, it will enter the debugger when calledfrom Lisp and when called interactively (after the reading of thearguments). You can also set debug-on-entry for primitive functions(i.e., those written in C) this way, but it only takes effect when theprimitive is called from Lisp code. Debug-on-entry is not allowed forspecial forms.When @code{debug-on-entry} is called interactively, it prompts for@var{function-name} in the minibuffer. If the function is already setup to invoke the debugger on entry, @code{debug-on-entry} does nothing.@code{debug-on-entry} always returns @var{function-name}.@strong{Warning:} if you redefine a function after using@code{debug-on-entry} on it, the code to enter the debugger isdiscarded by the redefinition. In effect, redefining the functioncancels the break-on-entry feature for that function.Here's an example to illustrate use of this function:@example@group(defun fact (n) (if (zerop n) 1 (* n (fact (1- n))))) @result{} fact@end group@group(debug-on-entry 'fact) @result{} fact@end group@group(fact 3)@end group@group------ Buffer: *Backtrace* ------Debugger entered--entering a function:* fact(3) eval((fact 3)) eval-last-sexp-1(nil) eval-last-sexp(nil) call-interactively(eval-last-sexp)------ Buffer: *Backtrace* ------@end group@group(symbol-function 'fact) @result{} (lambda (n) (debug (quote debug)) (if (zerop n) 1 (* n (fact (1- n)))))@end group@end example@end deffn@deffn Command cancel-debug-on-entry &optional function-nameThis function undoes the effect of @code{debug-on-entry} on@var{function-name}. When called interactively, it prompts for@var{function-name} in the minibuffer. If @var{function-name} isomitted or @code{nil}, it cancels break-on-entry for all functions.Calling @code{cancel-debug-on-entry} does nothing to a function which isnot currently set up to break on entry.@end deffn@node Explicit Debug@subsection Explicit Entry to the Debugger You can cause the debugger to be called at a certain point in yourprogram by writing the expression @code{(debug)} at that point. To dothis, visit the source file, insert the text @samp{(debug)} at theproper place, and type @kbd{C-M-x} (@code{eval-defun}, a Lisp mode keybinding). @strong{Warning:} if you do this for temporary debuggingpurposes, be sure to undo this insertion before you save the file! The place where you insert @samp{(debug)} must be a place where anadditional form can be evaluated and its value ignored. (If the valueof @code{(debug)} isn't ignored, it will alter the execution of theprogram!) The most common suitable places are inside a @code{progn} oran implicit @code{progn} (@pxref{Sequencing}).@node Using Debugger@subsection Using the Debugger When the debugger is entered, it displays the previously selectedbuffer in one window and a buffer named @samp{*Backtrace*} in anotherwindow. The backtrace buffer contains one line for each level of Lispfunction execution currently going on. At the beginning of this bufferis a message describing the reason that the debugger was invoked (suchas the error message and associated data, if it was invoked due to anerror). The backtrace buffer is read-only and uses a special major mode,Debugger mode, in which letters are defined as debugger commands. Theusual Emacs editing commands are available; thus, you can switch windowsto examine the buffer that was being edited at the time of the error,switch buffers, visit files, or do any other sort of editing. However,the debugger is a recursive editing level (@pxref{Recursive Editing})and it is wise to go back to the backtrace buffer and exit the debugger(with the @kbd{q} command) when you are finished with it. Exitingthe debugger gets out of the recursive edit and kills the backtracebuffer.@cindex current stack frame The backtrace buffer shows you the functions that are executing andtheir argument values. It also allows you to specify a stack frame bymoving point to the line describing that frame. (A stack frame is theplace where the Lisp interpreter records information about a particularinvocation of a function.) The frame whose line point is on isconsidered the @dfn{current frame}. Some of the debugger commandsoperate on the current frame. If a line starts with a star, that meansthat exiting that frame will call the debugger again. This is usefulfor examining the return value of a function. If a function name is underlined, that means the debugger knowswhere its source code is located. You can click @kbd{Mouse-2} on thatname, or move to it and type @key{RET}, to visit the source code. The debugger itself must be run byte-compiled, since it makesassumptions about how many stack frames are used for the debuggeritself. These assumptions are false if the debugger is runninginterpreted.@node Debugger Commands@subsection Debugger Commands@cindex debugger command list The debugger buffer (in Debugger mode) provides special commands inaddition to the usual Emacs commands. The most important use ofdebugger commands is for stepping through code, so that you can seehow control flows. The debugger can step through the controlstructures of an interpreted function, but cannot do so in abyte-compiled function. If you would like to step through abyte-compiled function, replace it with an interpreted definition ofthe same function. (To do this, visit the source for the function andtype @kbd{C-M-x} on its definition.) You cannot use the Lisp debuggerto step through a primitive function. Here is a list of Debugger mode commands:@table @kbd@item cExit the debugger and continue execution. When continuing is possible,it resumes execution of the program as if the debugger had never beenentered (aside from any side-effects that you caused by changingvariable values or data structures while inside the debugger).Continuing is possible after entry to the debugger due to function entryor exit, explicit invocation, or quitting. You cannot continue if thedebugger was entered because of an error.@item dContinue execution, but enter the debugger the next time any Lispfunction is called. This allows you to step through thesubexpressions of an expression, seeing what values the subexpressionscompute, and what else they do.The stack frame made for the function call which enters the debugger inthis way will be flagged automatically so that the debugger will becalled again when the frame is exited. You can use the @kbd{u} commandto cancel this flag.@item bFlag the current frame so that the debugger will be entered when theframe is exited. Frames flagged in this way are marked with starsin the backtrace buffer.@item uDon't enter the debugger when the current frame is exited. Thiscancels a @kbd{b} command on that frame. The visible effect is toremove the star from the line in the backtrace buffer.@item jFlag the current frame like @kbd{b}. Then continue execution like@kbd{c}, but temporarily disable break-on-entry for all functions thatare set up to do so by @code{debug-on-entry}.@item eRead a Lisp expression in the minibuffer, evaluate it, and print thevalue in the echo area. The debugger alters certain importantvariables, and the current buffer, as part of its operation; @kbd{e}temporarily restores their values from outside the debugger, so you canexamine and change them. This makes the debugger more transparent. Bycontrast, @kbd{M-:} does nothing special in the debugger; it shows youthe variable values within the debugger.@item RLike @kbd{e}, but also save the result of evaluation in thebuffer @samp{*Debugger-record*}.@item qTerminate the program being debugged; return to top-level Emacscommand execution.If the debugger was entered due to a @kbd{C-g} but you really wantto quit, and not debug, use the @kbd{q} command.@item rReturn a value from the debugger. The value is computed by reading anexpression with the minibuffer and evaluating it.The @kbd{r} command is useful when the debugger was invoked due to exitfrom a Lisp call frame (as requested with @kbd{b} or by entering theframe with @kbd{d}); then the value specified in the @kbd{r} command isused as the value of that frame. It is also useful if you call@code{debug} and use its return value. Otherwise, @kbd{r} has the sameeffect as @kbd{c}, and the specified return value does not matter.You can't use @kbd{r} when the debugger was entered due to an error.@item lDisplay a list of functions that will invoke the debugger when called.This is a list of functions that are set to break on entry by means of@code{debug-on-entry}. @strong{Warning:} if you redefine such afunction and thus cancel the effect of @code{debug-on-entry}, it mayerroneously show up in this list.@end table@node Invoking the Debugger@subsection Invoking the Debugger Here we describe in full detail the function @code{debug} that is usedto invoke the debugger.@defun debug &rest debugger-argsThis function enters the debugger. It switches buffers to a buffernamed @samp{*Backtrace*} (or @samp{*Backtrace*<2>} if it is the secondrecursive entry to the debugger, etc.), and fills it with informationabout the stack of Lisp function calls. It then enters a recursiveedit, showing the backtrace buffer in Debugger mode.The Debugger mode @kbd{c}, @kbd{d}, @kbd{j}, and @kbd{r} commands exitthe recursive edit; then @code{debug} switches back to the previousbuffer and returns to whatever called @code{debug}. This is the onlyway the function @code{debug} can return to its caller.The use of the @var{debugger-args} is that @code{debug} displays therest of its arguments at the top of the @samp{*Backtrace*} buffer, sothat the user can see them. Except as described below, this is the@emph{only} way these arguments are used.However, certain values for first argument to @code{debug} have aspecial significance. (Normally, these values are used only by theinternals of Emacs, and not by programmers calling @code{debug}.) Hereis a table of these special values:@table @code@item lambda@cindex @code{lambda} in debugA first argument of @code{lambda} means @code{debug} was calledbecause of entry to a function when @code{debug-on-next-call} wasnon-@code{nil}. The debugger displays @samp{Debuggerentered--entering a function:} as a line of text at the top of thebuffer.@item debug@code{debug} as first argument means @code{debug} was called becauseof entry to a function that was set to debug on entry. The debuggerdisplays the string @samp{Debugger entered--entering a function:},just as in the @code{lambda} case. It also marks the stack frame forthat function so that it will invoke the debugger when exited.@item tWhen the first argument is @code{t}, this indicates a call to@code{debug} due to evaluation of a function call form when@code{debug-on-next-call} is non-@code{nil}. The debugger displays@samp{Debugger entered--beginning evaluation of function call form:}as the top line in the buffer.@item exitWhen the first argument is @code{exit}, it indicates the exit of astack frame previously marked to invoke the debugger on exit. Thesecond argument given to @code{debug} in this case is the value beingreturned from the frame. The debugger displays @samp{Debuggerentered--returning value:} in the top line of the buffer, followed bythe value being returned.@item error@cindex @code{error} in debugWhen the first argument is @code{error}, the debugger indicates thatit is being entered because an error or @code{quit} was signaled andnot handled, by displaying @samp{Debugger entered--Lisp error:}followed by the error signaled and any arguments to @code{signal}.For example,@example@group(let ((debug-on-error t)) (/ 1 0))@end group@group------ Buffer: *Backtrace* ------Debugger entered--Lisp error: (arith-error) /(1 0)...------ Buffer: *Backtrace* ------@end group@end exampleIf an error was signaled, presumably the variable@code{debug-on-error} is non-@code{nil}. If @code{quit} was signaled,then presumably the variable @code{debug-on-quit} is non-@code{nil}.@item nilUse @code{nil} as the first of the @var{debugger-args} when you wantto enter the debugger explicitly. The rest of the @var{debugger-args}are printed on the top line of the buffer. You can use this feature todisplay messages---for example, to remind yourself of the conditionsunder which @code{debug} is called.@end table@end defun@node Internals of Debugger@subsection Internals of the Debugger This section describes functions and variables used internally by thedebugger.@defvar debuggerThe value of this variable is the function to call to invoke thedebugger. Its value must be a function of any number of arguments, or,more typically, the name of a function. This function should invokesome kind of debugger. The default value of the variable is@code{debug}.The first argument that Lisp hands to the function indicates why itwas called. The convention for arguments is detailed in the descriptionof @code{debug} (@pxref{Invoking the Debugger}).@end defvar@deffn Command backtrace@cindex run time stack@cindex call stackThis function prints a trace of Lisp function calls currently active.This is the function used by @code{debug} to fill up the@samp{*Backtrace*} buffer. It is written in C, since it must have accessto the stack to determine which function calls are active. The returnvalue is always @code{nil}.In the following example, a Lisp expression calls @code{backtrace}explicitly. This prints the backtrace to the stream@code{standard-output}, which, in this case, is the buffer@samp{backtrace-output}.Each line of the backtrace represents one function call. The line showsthe values of the function's arguments if they are all known; if theyare still being computed, the line says so. The arguments of specialforms are elided.@smallexample@group(with-output-to-temp-buffer "backtrace-output" (let ((var 1)) (save-excursion (setq var (eval '(progn (1+ var) (list 'testing (backtrace)))))))) @result{} (testing nil)@end group@group----------- Buffer: backtrace-output ------------ backtrace() (list ...computing arguments...)@end group (progn ...) eval((progn (1+ var) (list (quote testing) (backtrace)))) (setq ...) (save-excursion ...) (let ...) (with-output-to-temp-buffer ...) eval((with-output-to-temp-buffer ...)) eval-last-sexp-1(nil)@group eval-last-sexp(nil) call-interactively(eval-last-sexp)----------- Buffer: backtrace-output ------------@end group@end smallexample@end deffn@ignore @c Not worth mentioning@defopt stack-trace-on-error@cindex stack traceThis variable controls whether Lisp automatically displays abacktrace buffer after every error that is not handled. A quit signalcounts as an error for this variable. If it is non-@code{nil} then abacktrace is shown in a pop-up buffer named @samp{*Backtrace*} on everyerror. If it is @code{nil}, then a backtrace is not shown.When a backtrace is shown, that buffer is not selected. If either@code{debug-on-quit} or @code{debug-on-error} is also non-@code{nil}, thena backtrace is shown in one buffer, and the debugger is popped up inanother buffer with its own backtrace.We consider this feature to be obsolete and superseded by the debuggeritself.@end defopt@end ignore@defvar debug-on-next-call@cindex @code{eval}, and debugging@cindex @code{apply}, and debugging@cindex @code{funcall}, and debuggingIf this variable is non-@code{nil}, it says to call the debugger beforethe next @code{eval}, @code{apply} or @code{funcall}. Entering thedebugger sets @code{debug-on-next-call} to @code{nil}.The @kbd{d} command in the debugger works by setting this variable.@end defvar@defun backtrace-debug level flagThis function sets the debug-on-exit flag of the stack frame @var{level}levels down the stack, giving it the value @var{flag}. If @var{flag} isnon-@code{nil}, this will cause the debugger to be entered when thatframe later exits. Even a nonlocal exit through that frame will enterthe debugger.This function is used only by the debugger.@end defun@defvar command-debug-statusThis variable records the debugging status of the current interactivecommand. Each time a command is called interactively, this variable isbound to @code{nil}. The debugger can set this variable to leaveinformation for future debugger invocations during the same commandinvocation.The advantage of using this variable rather than an ordinary globalvariable is that the data will never carry over to a subsequent commandinvocation.@end defvar@defun backtrace-frame frame-numberThe function @code{backtrace-frame} is intended for use in Lispdebuggers. It returns information about what computation is happeningin the stack frame @var{frame-number} levels down.If that frame has not evaluated the arguments yet, or is a specialform, the value is @code{(nil @var{function} @var{arg-forms}@dots{})}.If that frame has evaluated its arguments and called its functionalready, the return value is @code{(t @var{function}@var{arg-values}@dots{})}.In the return value, @var{function} is whatever was supplied as the@sc{car} of the evaluated list, or a @code{lambda} expression in thecase of a macro call. If the function has a @code{&rest} argument, thatis represented as the tail of the list @var{arg-values}.If @var{frame-number} is out of range, @code{backtrace-frame} returns@code{nil}.@end defun@include edebug.texi@node Syntax Errors@section Debugging Invalid Lisp Syntax The Lisp reader reports invalid syntax, but cannot say where the realproblem is. For example, the error ``End of file during parsing'' inevaluating an expression indicates an excess of open parentheses (orsquare brackets). The reader detects this imbalance at the end of thefile, but it cannot figure out where the close parenthesis should havebeen. Likewise, ``Invalid read syntax: ")"'' indicates an excess closeparenthesis or missing open parenthesis, but does not say where themissing parenthesis belongs. How, then, to find what to change? If the problem is not simply an imbalance of parentheses, a usefultechnique is to try @kbd{C-M-e} at the beginning of each defun, and seeif it goes to the place where that defun appears to end. If it doesnot, there is a problem in that defun. However, unmatched parentheses are the most common syntax errors inLisp, and we can give further advice for those cases. (In addition,just moving point through the code with Show Paren mode enabled mightfind the mismatch.)@menu* Excess Open:: How to find a spurious open paren or missing close.* Excess Close:: How to find a spurious close paren or missing open.@end menu@node Excess Open@subsection Excess Open Parentheses The first step is to find the defun that is unbalanced. If there isan excess open parenthesis, the way to do this is to go to the end ofthe file and type @kbd{C-u C-M-u}. This will move you to thebeginning of the first defun that is unbalanced. The next step is to determine precisely what is wrong. There is noway to be sure of this except by studying the program, but often theexisting indentation is a clue to where the parentheses should havebeen. The easiest way to use this clue is to reindent with @kbd{C-M-q}and see what moves. @strong{But don't do this yet!} Keep reading,first. Before you do this, make sure the defun has enough close parentheses.Otherwise, @kbd{C-M-q} will get an error, or will reindent all the restof the file until the end. So move to the end of the defun and insert aclose parenthesis there. Don't use @kbd{C-M-e} to move there, sincethat too will fail to work until the defun is balanced. Now you can go to the beginning of the defun and type @kbd{C-M-q}.Usually all the lines from a certain point to the end of the functionwill shift to the right. There is probably a missing close parenthesis,or a superfluous open parenthesis, near that point. (However, don'tassume this is true; study the code to make sure.) Once you have foundthe discrepancy, undo the @kbd{C-M-q} with @kbd{C-_}, since the oldindentation is probably appropriate to the intended parentheses. After you think you have fixed the problem, use @kbd{C-M-q} again. Ifthe old indentation actually fit the intended nesting of parentheses,and you have put back those parentheses, @kbd{C-M-q} should not changeanything.@node Excess Close@subsection Excess Close Parentheses To deal with an excess close parenthesis, first go to the beginningof the file, then type @kbd{C-u -1 C-M-u} to find the end of the firstunbalanced defun. Then find the actual matching close parenthesis by typing @kbd{C-M-f}at the beginning of that defun. This will leave you somewhere short ofthe place where the defun ought to end. It is possible that you willfind a spurious close parenthesis in that vicinity. If you don't see a problem at that point, the next thing to do is totype @kbd{C-M-q} at the beginning of the defun. A range of lines willprobably shift left; if so, the missing open parenthesis or spuriousclose parenthesis is probably near the first of those lines. (However,don't assume this is true; study the code to make sure.) Once you havefound the discrepancy, undo the @kbd{C-M-q} with @kbd{C-_}, since theold indentation is probably appropriate to the intended parentheses. After you think you have fixed the problem, use @kbd{C-M-q} again. Ifthe old indentation actually fits the intended nesting of parentheses,and you have put back those parentheses, @kbd{C-M-q} should not changeanything.@node Test Coverage@section Test Coverage@cindex coverage testing@findex testcover-start@findex testcover-mark-all@findex testcover-next-mark You can do coverage testing for a file of Lisp code by loading the@code{testcover} library and using the command @kbd{M-xtestcover-start @key{RET} @var{file} @key{RET}} to instrument thecode. Then test your code by calling it one or more times. Then usethe command @kbd{M-x testcover-mark-all} to display colored highlightson the code to show where coverage is insufficient. The command@kbd{M-x testcover-next-mark} will move point forward to the nexthighlighted spot. Normally, a red highlight indicates the form was never completelyevaluated; a brown highlight means it always evaluated to the samevalue (meaning there has been little testing of what is done with theresult). However, the red highlight is skipped for forms that can'tpossibly complete their evaluation, such as @code{error}. The brownhighlight is skipped for forms that are expected to always evaluate tothe same value, such as @code{(setq x 14)}. For difficult cases, you can add do-nothing macros to your code togive advice to the test coverage tool.@defmac 1value formEvaluate @var{form} and return its value, but inform coverage testingthat @var{form}'s value should always be the same.@end defmac@defmac noreturn formEvaluate @var{form}, informing coverage testing that @var{form} shouldnever return. If it ever does return, you get a run-time error.@end defmac@node Compilation Errors@section Debugging Problems in Compilation When an error happens during byte compilation, it is normally due toinvalid syntax in the program you are compiling. The compiler prints asuitable error message in the @samp{*Compile-Log*} buffer, and thenstops. The message may state a function name in which the error wasfound, or it may not. Either way, here is how to find out where in thefile the error occurred. What you should do is switch to the buffer @w{@samp{ *Compiler Input*}}.(Note that the buffer name starts with a space, so it does not showup in @kbd{M-x list-buffers}.) This buffer contains the program beingcompiled, and point shows how far the byte compiler was able to read. If the error was due to invalid Lisp syntax, point shows exactly wherethe invalid syntax was @emph{detected}. The cause of the error is notnecessarily near by! Use the techniques in the previous section to findthe error. If the error was detected while compiling a form that had been readsuccessfully, then point is located at the end of the form. In thiscase, this technique can't localize the error precisely, but can stillshow you which function to check.@ignore arch-tag: ddc57378-b0e6-4195-b7b6-43f8777395a7@end ignore