Commit | Line | Data |
---|---|---|
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 | ||
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 (*_\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 | ||
135 | The 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 | ||
200 | The 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 |