BSD 4_3 development
[unix-history] / usr / lib / lisp / manual / ch15.r
CommitLineData
f9a8037d
C
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 (_\bd_\be_\bb_\bu_\bg). 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\e9
61
62\e9The FIXIT Debugger 15-1
63
64
65
66
67
68
69
70The 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 (*_\br_\bs_\be_\bt _\bt) 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 (_\bs_\bs_\bt_\ba_\bt_\bu_\bs _\bt_\br_\ba_\bn_\bs_\bl_\bi_\bn_\bk _\bn_\bi_\bl).
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 _\bd_\be_\bb_\bu_\bg where you
90 would normally put a call to _\bb_\br_\be_\ba_\bk. Also, within
91 a break loop you may enter FIXIT by typing _\bd_\be_\bb_\bu_\bg.
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 (_\bd_\be_\bb_\bu_\bg |_\bj_\bu_\bs_\bt _\bb_\be_\bf_\bo_\br_\be
95 _\bl_\bo_\bo_\bp|) 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\e9
126
127\e9 Printed: July 21, 1983
128
129
130
131
132
133
134
135The FIXIT Debugger 15-3
136
137
138
139 ____________________________________________________
140
141 _\bF_\bI_\bX_\bI_\bT _\bC_\bo_\bm_\bm_\ba_\bn_\bd _\bS_\bu_\bm_\bm_\ba_\br_\by
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\e9
191
192\e9 Printed: July 21, 1983
193
194
195
196
197
198
199
200The FIXIT Debugger 15-4
201
202
203 15.2. Interaction with _\bt_\br_\ba_\bc_\be 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 _\bt_\br_\ba_\bc_\be works, it may sometimes be
207 the case that the functions on the stack are really
208 un_\bi_\bn_\bt_\be_\br_\bned 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 _\bt_\br_\ba_\bc_\be'_\bs hackery by printing an appropriate tag
212 next to these stack entries.
213
214
215
216
217 15.3. Interaction with _\bs_\bt_\be_\bp The _\bs_\bt_\be_\bp 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 _\be_\br_\br_\bs_\be_\bt, 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\e9
256
257\e9 Printed: July 21, 1983
258
259
260