|
|
1.1 root 1:
2:
3:
4:
5:
6:
7:
8: CHAPTER 15
9:
10:
11: The FIXIT Debugger
12:
13:
14:
15:
16:
17:
18: 15.1. Introduction FIXIT is a debugging environment
19: for FRANZ LISP users doing program development. This
20: documentation and FIXIT were written by David S.
21: Touretzky of Carnegie-Mellon University for MACLisp,
22: and adapted to FRANZ LISP by Mitch Marcus of Bell
23: Labs. One of FIXIT's goals is to get the program run-
24: ning again as quickly as possible. The user is
25: assisted in making changes to his functions "on the
26: fly", i.e. in the midst of execution, and then compu-
27: tation is resumed.
28:
29: To enter the debugger type (_d_e_b_u_g). The debugger
30: goes into its own read-eval-print loop. Like the
31: top-level, the debugger understands certain special
32: commands. One of these is help, which prints a list
33: of the available commands. The basic idea is that you
34: are somewhere in a stack of calls to eval. The com-
35: mand "bka" is probably the most appropriate for look-
36: ing at the stack. There are commands to move up and
37: down. If you want to know the value of "x" as of some
38: place in the stack, move to that place and type "x"
39: (or (cdr x) or anything else that you might want to
40: evaluate). All evaluation is done as of the current
41: stack position. You can fix the problem by changing
42: the values of variables, editing functions or expres-
43: sions in the stack etc. Then you can continue from
44: the current stack position (or anywhere else) with the
45: "redo" command. Or you can simply return the right
46: answer with the "return" command.
47:
48: When it is not immediately obvious why an error
49: has occurred or how the program got itself into its
50: current state, FIXIT comes to the rescue by providing
51: a powerful debugging loop in which the user can:
52:
53: - examine the stack
54:
55: - evaluate expressions in context
56:
57: - enter stepping mode
58:
59: - restart the computation at any point
60: 9
61:
62: 9The FIXIT Debugger 15-1
63:
64:
65:
66:
67:
68:
69:
70: The FIXIT Debugger 15-2
71:
72:
73: The result is that program errors can be located and
74: fixed extremely rapidly, and with a minimum of frus-
75: tration.
76:
77: The debugger can only work effectively when extra
78: information is kept about forms in evaluation by the
79: lisp system. Evaluating (*_r_s_e_t _t) tells the lisp sys-
80: tem to maintain this information. If you are debugging
81: compiled code you should also be sure that the com-
82: piled code to compiled code linkage tables are
83: unlinked, i.e do (_s_s_t_a_t_u_s _t_r_a_n_s_l_i_n_k _n_i_l).
84:
85:
86: (debug [ s_msg ])
87:
88: NOTE: Within a program, you may enter a debug loop
89: directly by putting in a call to _d_e_b_u_g where you
90: would normally put a call to _b_r_e_a_k. Also, within
91: a break loop you may enter FIXIT by typing _d_e_b_u_g.
92: If an argument is given to DEBUG, it is treated
93: as a message to be printed before the debug loop
94: is entered. Thus you can put (_d_e_b_u_g |_j_u_s_t _b_e_f_o_r_e
95: _l_o_o_p|) into a program to indicate what part of
96: the program is being debugged.
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125: 9
126:
127: 9 Printed: July 21, 1983
128:
129:
130:
131:
132:
133:
134:
135: The FIXIT Debugger 15-3
136:
137:
138:
139: ____________________________________________________
140:
141: _F_I_X_I_T _C_o_m_m_a_n_d _S_u_m_m_a_r_y
142:
143: TOP go to top of stack (latest expression)
144: BOT go to bottom of stack (first expression)
145: P show current expression (with ellipsis)
146: PP show current expression in full
147: WHERE give current stack position
148: HELP types the abbreviated command summary found
149: in /usr/lisp/doc/fixit.help. H and ? work too.
150: U go up one stack frame
151: U n go up n stack frames
152: U f go up to the next occurrence of function f
153: U n f go up n occurrences of function f
154: UP go up to the next user-written function
155: UP n go up n user-written functions
156: ...the DN and DNFN commands are similar, but go down
157: ...instead of up.
158: OK resume processing; continue after an error or debug loop
159: REDO restart the computation with the current stack frame.
160: The OK command is equivalent to TOP followed by REDO.
161: REDO f restart the computation with the last call to function f.
162: (The stack is searched downward from the current position.)
163: STEP restart the computation at the current stack frame,
164: but first turn on stepping mode. (Assumes Rich stepper is loaded.)
165: RETURN e return from the current position in the computation
166: with the value of expression e.
167: BK.. print a backtrace. There are many backtrace commands,
168: formed by adding suffixes to the BK command. "BK" gives
169: a backtrace showing only user-written functions, and uses
170: ellipsis. The BK command may be suffixed by one or more
171: of the following modifiers:
172: ..F.. show function names instead of expressions
173: ..A.. show all functions/expressions, not just user-written ones
174: ..V.. show variable bindings as well as functions/expressions
175: ..E.. show everything in the expression, i.e. don't use ellipsis
176: ..C.. go no further than the current position on the stack
177: Some of the more useful combinations are BKFV, BKFA,
178: and BKFAV.
179: BK.. n show only n levels of the stack (starting at the top).
180: (BK n counts only user functions; BKA n counts all functions.)
181: BK.. f show stack down to first call of function f
182: BK.. n f show stack down to nth call of function f
183: ____________________________________________________
184:
185:
186:
187:
188:
189:
190: 9
191:
192: 9 Printed: July 21, 1983
193:
194:
195:
196:
197:
198:
199:
200: The FIXIT Debugger 15-4
201:
202:
203: 15.2. Interaction with _t_r_a_c_e FIXIT knows about the
204: standard Franz trace package, and tries to make trac-
205: ing invisible while in the debug loop. However,
206: because of the way _t_r_a_c_e works, it may sometimes be
207: the case that the functions on the stack are really
208: un_i_n_t_e_r_ned atoms that have the same name as a traced
209: function. (This only happens when a function is
210: traced WHEREIN another one.) FIXIT will call atten-
211: tion to _t_r_a_c_e'_s hackery by printing an appropriate tag
212: next to these stack entries.
213:
214:
215:
216:
217: 15.3. Interaction with _s_t_e_p The _s_t_e_p function may be
218: invoked from within FIXIT via the STEP command. FIXIT
219: initially turns off stepping when the debug loop is
220: entered. If you step through a function and get an
221: error, FIXIT will still be invoked normally. At any
222: time during stepping, you may explicitly enter FIXIT
223: via the "D" (debug) command.
224:
225:
226:
227:
228: 15.4. Multiple error levels FIXIT will evaluate arbi-
229: trary LISP expressions in its debug loop. The evalua-
230: tion is not done within an _e_r_r_s_e_t, so, if an error
231: occurs, another invocation of the debugger can be
232: made. When there are multiple errors on the stack,
233: FIXIT displays a barrier symbol between each level
234: that looks something like <------------UDF-->. The
235: UDF in this case stands for UnDefined Function. Thus,
236: the upper level debug loop was invoked by an undefined
237: function error that occurred while in the lower loop.
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255: 9
256:
257: 9 Printed: July 21, 1983
258:
259:
260:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.