|
|
1.1 root 1: .\" Copyright (c) 1980 Regents of the University of California.
2: .\" All rights reserved. The Berkeley software License Agreement
3: .\" specifies the terms and conditions for redistribution.
4: .\"
5: .\" @(#)ch15.n 6.2 (Berkeley) 5/14/86
6: .\"
7: ." $Header: /na/franz/doc/RCS/ch15.n,v 1.1 83/01/31 07:08:47 jkf Exp $
8: .Lc The\ FIXIT\ Debugger 15
9: .sh 2 Introduction \n(ch 1
10: FIXIT is a debugging environment for
11: .Fr
12: users doing program development. This documentation and FIXIT
13: were written by David S. Touretzky
14: of Carnegie-Mellon University for MACLisp, and adapted to
15: .Fr
16: by Mitch Marcus of Bell Labs. One of
17: FIXIT's goals is to get the program running again as quickly
18: as possible. The user is assisted in making changes to his
19: functions "on the fly", i.e. in the midst of execution, and
20: then computation is resumed.
21: .pp
22: To enter the debugger type \fI(debug)\fP.
23: The debugger goes into its own
24: read-eval-print loop. Like the top-level, the debugger understands
25: certain special commands. One of these is help, which prints a list of
26: the available commands. The basic idea is that you are somewhere in a
27: stack of calls to eval. The command "bka" is probably the most appropriate
28: for looking at the stack. There are commands to move up and down. If
29: you want to know the value of "x" as of some place in the stack, move to
30: that place and type "x" (or (cdr x) or anything else that you might want
31: to evaluate). All evaluation is done as of the current stack position.
32: You can fix the problem by changing the values of variables, editing
33: functions or expressions in the stack etc. Then you can continue from
34: the current stack position (or anywhere else) with the "redo" command.
35: Or you can simply return the right answer with the "return" command.
36: .pp
37: When it is not immediately obvious why an error has occurred
38: or how the program got itself into its current state, FIXIT
39: comes to the rescue by providing a powerful debugging loop
40: in which the user can:
41:
42: - examine the stack
43:
44: - evaluate expressions in context
45:
46: - enter stepping mode
47:
48: - restart the computation at any point
49:
50: The result is that program errors can be located and fixed
51: extremely rapidly, and with a minimum of frustration.
52: .pp
53: The debugger can only work effectively when extra information is kept
54: about forms in evaluation by the lisp system.
55: Evaluating \fI(*rset\ t)\fP tells the lisp system to maintain this
56: information.
57: If you are debugging compiled code you should also be sure that the
58: compiled code to compiled code linkage tables are unlinked, i.e
59: do \fI(sstatus\ translink\ nil)\fP.
60:
61: .Lf debug "[ s_msg ]"
62: .No
63: Within a program, you may enter a debug loop directly by
64: putting in a call to
65: .i debug
66: where you would normally put
67: a call to
68: .i break.
69: Also, within a break loop you may enter
70: FIXIT by typing
71: .i debug.
72: If an argument is given to DEBUG,
73: it is treated as a message to be printed before the debug loop
74: is entered. Thus you can put \fI(debug |just before loop|)\fP into
75: a program to indicate what part of the program is being debugged.
76:
77: .Eb
78: \fIFIXIT Command Summary\fP
79:
80: TOP go to top of stack (latest expression)
81: BOT go to bottom of stack (first expression)
82: P show current expression (with ellipsis)
83: PP show current expression in full
84: WHERE give current stack position
85: HELP types the abbreviated command summary found
86: in /usr/lisp/doc/fixit.help. H and ? work too.
87: U go up one stack frame
88: U n go up n stack frames
89: U f go up to the next occurrence of function f
90: U n f go up n occurrences of function f
91: UP go up to the next user-written function
92: UP n go up n user-written functions
93: ...the DN and DNFN commands are similar, but go down
94: ...instead of up.
95: OK resume processing; continue after an error or debug loop
96: REDO restart the computation with the current stack frame.
97: The OK command is equivalent to TOP followed by REDO.
98: REDO f restart the computation with the last call to function f.
99: (The stack is searched downward from the current position.)
100: STEP restart the computation at the current stack frame,
101: but first turn on stepping mode. (Assumes Rich stepper is loaded.)
102: RETURN e return from the current position in the computation
103: with the value of expression e.
104: BK.. print a backtrace. There are many backtrace commands,
105: formed by adding suffixes to the BK command. "BK" gives
106: a backtrace showing only user-written functions, and uses
107: ellipsis. The BK command may be suffixed by one or more
108: of the following modifiers:
109: ..F.. show function names instead of expressions
110: ..A.. show all functions/expressions, not just user-written ones
111: ..V.. show variable bindings as well as functions/expressions
112: ..E.. show everything in the expression, i.e. don't use ellipsis
113: ..C.. go no further than the current position on the stack
114: Some of the more useful combinations are BKFV, BKFA,
115: and BKFAV.
116: BK.. n show only n levels of the stack (starting at the top).
117: (BK n counts only user functions; BKA n counts all functions.)
118: BK.. f show stack down to first call of function f
119: BK.. n f show stack down to nth call of function f
120: .Ee
121: .sh 2 Interaction\ with\ \fItrace\fP
122: FIXIT knows about the standard Franz
123: trace package, and tries to make
124: tracing invisible while in the debug loop. However, because
125: of the way
126: .i trace
127: works, it may sometimes be the case that the
128: functions on the stack are really un\fIintern\fPed atoms that have
129: the same name as a traced function. (This only happens when
130: a function is traced WHEREIN another one.) FIXIT will call
131: attention to
132: .i trace's
133: hackery by printing an appropriate tag
134: next to these stack entries.
135:
136: .sh 2 Interaction\ with\ \fIstep\fP
137: The
138: .i step
139: function may be invoked
140: from within FIXIT via the STEP command. FIXIT initially turns off
141: stepping when the debug loop is entered. If you step through a function
142: and get an error, FIXIT will still be invoked normally. At
143: any time during stepping, you may explicitly enter FIXIT
144: via the "D" (debug) command.
145:
146: .sh 2 Multiple\ error\ levels
147: FIXIT will evaluate arbitrary LISP
148: expressions in its debug loop. The evaluation is not done within an
149: .i errset,
150: so, if an error occurs, another invocation of the debugger
151: can be made. When there are multiple errors on the stack,
152: FIXIT displays a barrier symbol between each level that
153: looks something like <------------UDF-->. The UDF in
154: this case stands for UnDefined Function. Thus, the upper
155: level debug loop was invoked by an undefined function error
156: that occurred while in the lower loop.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.