1% BEGIN LICENSE BLOCK
2% Version: CMPL 1.1
3%
4% The contents of this file are subject to the Cisco-style Mozilla Public
5% License Version 1.1 (the "License"); you may not use this file except
6% in compliance with the License.  You may obtain a copy of the License
7% at www.eclipse-clp.org/license.
8% 
9% Software distributed under the License is distributed on an "AS IS"
10% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See
11% the License for the specific language governing rights and limitations
12% under the License. 
13% 
14% The Original Code is  The ECLiPSe Constraint Logic Programming System. 
15% The Initial Developer of the Original Code is  Cisco Systems, Inc. 
16% Portions created by the Initial Developer are
17% Copyright (C) 2006 Cisco Systems, Inc.  All Rights Reserved.
18% 
19% Contributor(s): 
20% 
21% END LICENSE BLOCK
22
23\chapter{A Tutorial Tour of Debugging in {\tkeclipse}}
24\label{chapdebug}
25%HEVEA\cutdef[1]{section}
26 
27
28This chapter demonstrates a sample debugging session using
29{\tkeclipse}, showing how some of the 
30development tools can be used. We are by no means using all the tools  or
31all the functionalities of any tool, but hopefully this will give you a
32flavor of the tools so that you will explore them on your own. You can get
33more information on the tools from the \menu{Help} menu, and from the popup
34balloons which appear when your mouse cursor stops over a feature for
35a few seconds. 
36
37In the tutorial tour, we will assume that you have some knowledge of
38{\eclipse}. It is helpful if you also have some knowledge of
39traditional Prolog debugging, although this is not necessary.
40
41This chapter is designed for you to follow while running {\tkeclipse}.
42To keep things simple, the program is run with a very small
43data set, but it should be sufficient to see how the techniques described
44can be applied to real programs. 
45
46At the end of the chapter, there is a summary of the main features of the
47main development tools.
48
49This chapter
50also contains many screen-shots, some of which are best viewed in colour, or
51in looking at the actual screen as you follow along.
52
53\quickref{Getting Help}{
54\begin{description}
55\item[Balloon help] A short description of a feature will popup in a
56`balloon' when the mouse cursor stops over the feature for a few seconds.
57\item[Help file] Help files are available for all the tools and
58toplevel. They provide more detailed information on the tools, and can be
59obtained from the \menu{Help} menu, and by typing Alt-h
60(Alt and h keys together) in the tool.
61\end{description}
62}
63
64\section{The Buggy Program}
65
66The program we will be debugging is a map colouring problem. The 
67task is to colour a
68`map' of countries with four colours such that no two neighbours have the
69same colour. Our program colours a map of four countries, but has a bug and
70can colour two neighbours the same colour. The map is displayed graphically
71as shown: 
72
73\begin{center}
74\parbox{0.43\textwidth}{\resizebox{0.4\textwidth}{!}{\includegraphics{mapdisplay2.ps}}}
75
76\vspace{3mm}
77{\bf Map Display of Program}
78\end{center}
79
80The countries are identified by numbers displayed within each country, and 
81in this case, an incorrect colouring for the map is shown, because
82countries 3 and 4 have the same colour. 
83
84This program uses code from the map colouring demo program, and is
85designed to use the GUI to display a map. Most of this is
86not relevant to our debugging session, and although we will see some of this
87code during the debugging, it is not necessary to understand it. 
88You can think of this
89debugging session as debugging someone else's code, not all of which
90needs to be understood.
91
92The program used here is included with your {\eclipse} distribution. You
93should find it under the \texttt{doc/examples/tutorial} directory. You can
94change to the \texttt{examples} directory in {\tkeclipse} using the
95\menuopt{Change to example directory} option from the \menu{File} menu.
96
97The final step in this debug tutorial is to edit the buggy program and
98correct it. If you want to do this, you should copy the distributed version
99of the program elsewhere so that you don't edit the original. You need to
100copy the following files from \verb'examples/tutorial' to another directory:
101
102\begin{quote}\begin{verbatim}
103debugdemo.ecl  mapcolour.ecl mapdebugdemo.tcl buggy_data.map
104\end{verbatim}\end{quote}
105
106To load the program, start {\tkeclipse}. After start up, 
107switch the working directory to
108where you have the programs -- if you are using a UNIX system, and have
109started {\tkeclipse} in the directory of the programs, you are already
110there. Otherwise, go to the \menu{File} menu of {\tkeclipse}, and select
111the \menuopt{Change directory} option. Use the directory browser to find
112the directory containing your programs and select it. This will change your
113working directory to the selected directory.
114
115Next, compile \verb'debugdemo.ecl'. You can do this by selecting the
116\menuopt{Compile} option from the \menu{File} menu (you can also compile
117the file with the query \verb'[debugdemo]' from the query entry
118window). 
119
120\section{Running the Program}
121To start the program, the query `colour' is run: type \verb'colour' 
122into {\tkeclipse}'s query entry window, followed by the
123return key. The program should run, and display the map to be coloured in a
124window, which is then coloured, arriving at the
125incorrect solution as shown previously. The program uses
126the standard `generate-and-test' method, so you will see colour flashing in
127the countries as the program tries different colours for them.
128
129The map display has two buttons: pressing \button{More} will cause the program to
130find an alternate way of colouring the map. Pressing \button{Done} will end the
131program and return control to {\eclipse}. You can press \button{More} to get more
132solutions and see that the program returns more solutions that colour
133countries 3 and 4 to the same colour (along with some that are correct).
134
135Press \button{Done} to finish the execution. We will now debug this program.
136
137\section{Debugging the Program}
138
139
140The main tool to debug a program is the {\bf tracer} tool. The tracer is
141one of the development tools, all of which can be accessed from the \menuopt{Tools} menu of
142{\tkeclipse}. Select \menuopt{Tracer} from the
143menu as shown below, and a new window for the tracer tool should appear.
144
145\begin{center}
146\resizebox{0.5\textwidth}{!}{\includegraphics{tktoolsmenu.ps}}
147
148\vspace{3mm}
149{\bf Starting the Tracer Tool}
150\end{center}
151Run the query \verb'colour' again. To save you from typing in the query,
152you can use the up-arrow on your keyboard to step back to a previous query.
153Type return when  \verb'colour' appears in the query window again.
154
155\begin{latexonly}
156\begin{figure}
157\begin{center}
158\resizebox{0.35\textwidth}{!}{\includegraphics{tktracer.ps}}
159\end{center}
160\caption{The Tracer Tool}
161\label{tktracer}
162\end{figure}
163\end{latexonly}
164
165\begin{htmlonly}
166\begin{figure}
167\begin{center}
168\resizebox{0.53\textwidth}{!}{\includegraphics{tktracer.ps}}
169\end{center}
170\caption{The Tracer Tool}
171\label{tktracer}
172\end{figure}
173\end{htmlonly}
174\index{tracing program execution}
175\index{tracer, development tool}
176
177\quickref{Debugger Trace Line}{
178\begin{small}
179The trace lines displayed by the tracer has the following:
180\begin{code}
181
182 +(22) 14 *EXIT<3>  inform_colour(1, 1)
183
184 1\quad2\quad\enspace3 4\quad\enspace5 6\qquad\qquad7
185
186\end{code}
187\begin{enumerate}
188\item A '+' displayed here shows that the procedure has a spy point
189  set. For a CALL port, a '\#' could be displayed in this position, which
190  shows a breakpoint is set for the call.
191\item The invocation number of this goal, which uniquely
192  identifies it. The `To Invoc:' button can be used to jump to the next port with
193  the specified invocation number. 
194\item The depth of the goal, i.e. the number of its ancestors.
195The `To Depth:' button can be used to jump to the next port within the specified
196depth range.
197\item An asterisk before an EXIT means that this
198procedure is nondeterministic and that it might be resatisfied.
199\item The type of the port. The `To Port:' button can be used to
200  select the type of port to jump to.
201\item This only appears if the goal is executing at a different priority
202  than 12, the normal priority. The number is
203  the priority that the  goal is executed at. 
204\item The goal is printed according to the current instantiations
205of its variables.  
206\end{enumerate}
207\end{small}
208}
209
210The tracer tool traces the execution of the program, like the traditional
211Prolog debugger, it stops at  `debug ports' of predicates that are
212executed.
213\See{See the Debugging chapter in the User Manual for more details on the
214  model used in Prolog debuggers.}
215At the start of tracing,
216it is stopped at the call port of the query \verb'colour'. The buttons in
217the middle of the tool are for debugger commands. Try pressing
218\button{Creep} several times, and you should observe something similar to
219Figure~\ref{tktracer}. Unlike the traditional debugger, the execution trace
220is shown on two text windows: the bottom `Source Context' view, showing the
221execution of the program in the context of the source, highlighting the
222body goal that corresponds to the goal at the debug port; and the
223top `Call Stack' window, showing the ancestors (`call stack') of the
224current goal, which is updated at each debug port. The goals are
225displayed with different colours: blue for a call port, green (success) for
226an exit port. Red (failure) for a fail port. Note that in the call
227stack, the ancestor goals are displayed in black: this indicates that the
228goal is not `current', i.e.\ the bindings shown are as they were when the
229goal was called, and not necessarily what they are now. We will show how
230these bindings can be `refreshed' later on. Note that the bottom windowc
231can ne switched between the source context view, and a more traditional
232`Trace Log' view, which shows a log of the debugger ports much as a traditional Prolog debugger does.
233
234To avoid stepping through the whole program, we will add a spy-point to a
235predicate that may be causing the problem. Spy-points can be added in the
236traditional way, using the \verb'spy/1' predicate. However, we can also use
237the {\bf predicate browser} tool:  start the \menuopt{Predicate Browser} tool
238from the \menu{Tools} menu of {\tkeclipse}. This tool allows you to observe
239and change various properties of the predicates in your program.
240A list of predicates are displayed
241on the left hand side, and a list of properties on the right.
242Currently the predicate list is showing all the predicates defined in our program (i.e.\ in
243the \verb'eclipse' module). Looking at this list,
244\verb'not_same_colour/3''s name suggests that
245it checks that neighbouring countries do not have the same colour.
246Select it by clicking on it, and now the right
247hand side should display the properties of this predicate:
248
249\begin{center}
250\resizebox{0.55\textwidth}{!}{\includegraphics{tkpredbrowser.ps}}
251
252\vspace{3mm}
253{\bf The Predicate Browser Tool}
254\end{center}
255\index{predicate browser, development tool}
256
257We can now view the source code for the predicate by clicking on the
258\button{Show source} button, which will show the selected predicate's source in
259the source context view. The code for the predicate is:
260
261\begin{code}
262not_same_colour(Solver, C1-C2, Countries) :-
263      % get the colours for the countries C1 and C2
264      arg(C1, Countries, Colour1),
265      arg(C2, Countries, Colour2),
266      % send constraint to either the fd or ic solver
267      Solver: (Colour1 #\verb'\'= Colour2).
268\end{code}
269
270The code does indeed check that the countries \verb'C1' and \verb'C2' do
271not have the same colour.
272
273\Note{For our example program, the list is not very long, but some programs may
274have many predicates, and it could be difficult to find the predicate you
275want. The predicate list has a search facility: typing in part of the name
276of the predicate in the predicate list will search for the predicate you
277want. You can try typing in {\tt not_same_colour / 3} to see how this
278works.}
279
280The predicate browser allows us to change some of the properties of a predicate.
281We can add a spy-point to the predicate by clicking on the radio button for
282{\bf spy}: 
283
284\begin{center}
285\resizebox{0.27\textwidth}{!}{\includegraphics{tkpredspyon.ps}}
286
287\vspace{2mm}
288{\bf Setting Spy Property to On}
289\end{center}
290
291With {\tkeclipse}, we can do more than just place a spy point on a
292predicate: we can specify further conditions for when the tracer should
293stop at a spy point, using the filter tool. 
294
295Start the filter tool by selecting \menuopt{Configure filter} from the \menu{Options} menu of the tracer
296tool:
297
298\begin{center}
299\resizebox{0.4\textwidth}{!}{\includegraphics{tktraceroptions.ps}}
300
301\vspace{3mm}
302{\bf Starting the Filter Tool from the Tracer}
303\end{center}
304
305\begin{figure}
306\begin{center}
307\resizebox{0.5\textwidth}{!}{\includegraphics{tkfilter.ps}}
308\end{center}
309\caption{The Tracer Filter Tool}
310\label{tkfilter}
311\end{figure}
312
313The filter tool opens in a new window, as shown in
314Figure~\ref{tkfilter}. This tool allows us to specify a `filter' for the
315debug ports so that the tracer will only stop at a port with the properties
316specified by the tool. In our case, we want to see \verb'not_same_colour/3'
317only when countries 3 and 4 are involved. This can be done 
318with the ``Predicate specification'' facility, enabled by the
319\button{Specific predicate instance:} radio button. Pressing this button
320will allow us to specify a condition in Prolog syntax which will be
321checked at each debug port. For our purpose, we enter the following:
322
323\begin{center}
324\resizebox{0.55\textwidth}{!}{\includegraphics{tkfiltercond.ps}}
325
326\vspace{3mm}
327{\bf Setting Conditions for Specific Predicate Instances}
328\end{center}
329
330\index{conditional spying}
331\index{tracer filter, development tool}
332This specifies that the filter should stop at a \verb'not_same_colour/3'
333goal, when one of the countries in the pair \verb'X-Y' is country 4: the {\bf
334Goal template} is used to specify the template the debug port goal should
335match, and the {\bf Condition:} can be any {\eclipse} goal, perhaps with variables
336from the {\bf Goal template}, as in our case. The test is done by unifying
337the goal with the template, and then executing the condition. Note that any
338bindings are undone after the test. 
339
340Note that we have also deselected the \button{exit} port in the filter
341condition. You can do this by clicking on the \button{exit} radio
342button. This means that the tracer does not stop at any exit port.
343
344Press \button{Go} on the filter tool to start the tracer running with the
345filter. You can also press the \button{Filter} command button on the tracer
346to do the same thing.
347We see that the tracer has jumped to a \verb'not_same_colour/3' goal
348involving country 4 as expected. However, there is a gap in the call stack
349as we skipped over the tracing of some ancestor goals. We can see these
350goals by {\bf refreshing} the goal stack. This can be done by pressing and
351holding down the right mouse button while the mouse cursor is over a goal
352in the call stack, which will popup a menu for the goal:
353
354\begin{center}
355\resizebox{0.55\textwidth}{!}{\includegraphics{tktracerpopup.ps}}
356
357\vspace{3mm}
358{\bf Popup Menu for a Goal in Tracer's Call Stack}
359\end{center}
360
361In this case, we have opened the menu over \verb'not_same_colour/3', and the
362options are for this goal. Various options are available, but for now we
363choose the \menuopt{Refresh goal stack} option. This will result in the
364following goal stack display:
365
366\begin{center}
367\resizebox{0.6\textwidth}{!}{\includegraphics{tkrefreshedgs.ps}}
368
369{\bf Refreshed Call Stack}
370\end{center}
371
372Notice that the colour of the goals in the goal stack are now all blue,
373indicating that the bindings shown are current. 
374
375Press \button{Filter} on the tracer several times to jump to other ports
376involving country 4. You will see that none of them involve countries 3 and
3774. So perhaps countries 3 and 4 are not checked by
378\verb'not_same_colour/3', i.e.\ \verb'3-4' or \verb'4-3' are never passed
379to \verb'not_same_colour/3'. Looking at the call stack, we can see that the
380country pair in \verb'not_same_colour/3' seem to appear as an element in a
381list of country pairs, as far back as \verb'colouring(...)'. Unfortunately,
382the debugger does not display the whole list. We see something like:
383
384\begin{center}
385\verb'do_colouring(prolog, input_order, indomain, [4 - 2, 4 - 1, ... '
386\end{center} 
387\noindent
388due to the `print depth' feature, which shortens the printing of large
389terms. We can examine the whole list by using the inspector to examine the
390goal. To do this, we double click on the \verb'do_colouring(...)' goal
391to `open' it for inspection.
392
393This will launch the Inspector tool on the \verb'do_colouring' goal. The
394inspector displays the term in a hierarchical fashion as a tree, which
395allows us to navigate the term. The initial display is shown on the left
396panel below. We are interested in examining the full list. We can look at
397this list by double clicking on it to expand the node, which results in the
398display in the right panel below. You may need to scroll
399down to see the whole list:
400
401\begin{center}
402\parbox{0.49\textwidth}{\resizebox{0.48\textwidth}{!}{\includegraphics{tkinspect.ps}}}
403\parbox{0.49\textwidth}{\resizebox{0.48\textwidth}{!}{\includegraphics{tkinspect2.ps}}}
404
405\vspace{3mm}
406{\bf Using the Inspector}
407\end{center}
408
409\index{term inspector, development tool}
410\index{inspecting terms}
411The inspector shows that this list does not contain the pair \verb'4-3' or
412\verb'3-4', which should be there so that \verb'not_same_colour'
413can check that these two countries  are not assigned the same colour.
414
415\begin{sloppypar}
416The inspector tool is modal -- when it is open, the rest of {\tkeclipse} is
417inaccessible. Close the Inspector by clicking on its
418\button{Close} button, go back to the tracer, and see where the country
419pair list comes from. It
420first appears in 
421the ancestor goals \verb'do_colouring(prolog,...)', as the next parent
422\verb'colouring(prolog,...)' does not have this list. So the list
423is created in a body goal of \verb'colouring(...)' before \verb'do_colouring(...)' is
424called. We can look at the source of \verb'colouring(...)'  to see how this
425list is created. To do this, we can
426select \menuopt{Display source} option from the popup menu for the
427\verb'colouring(...)' goal:
428\end{sloppypar}
429 
430\begin{center}
431\resizebox{0.55\textwidth}{!}{\includegraphics{tktracerpopup2.ps}}
432
433\vspace{3mm}
434{\bf Displaying Source for a Goal in the Call Stack}
435\end{center}
436
437The code for this predicate is quite long, but for our purposes we are only
438interested in the country-pair list that is passed to \verb'do_colouring':
439
440\begin{code}
441colouring1(Type, Select, Choice0, N, Backtracks) :-
442        ....
443        findall(C1-C2, (neighbour(C1,C2), C1=<N,C2=<N), Neighbours),
444        ....
445        do_colouring(Type, Select, Choice, Neighbours, Countries,
446                     CountryList, Backtracks), 
447        ....
448\end{code}
449
450Looking at this source and the Call stack goal, we can see that the country
451pair list is constructed from \verb'neighbour/2' calls. Let's look at the
452source for \verb'neighbour/2'. We can do this from the predicate browser, by
453selecting \verb'neighbour/2' and pushing the \button{Show source} button. We see
454the following:
455
456\begin{code}
457neighbour / 2 in file buggy_data.map, line 2:
458%neighbour(4, 3).
459neighbour(4, 2).
460neighbour(4, 1).
461neighbour(4, 2).
462neighbour(3, 1).
463neighbour(3, 2).
464neighbour(1, 2).
465\end{code}
466
467
468So \verb'neighbour(4,3)' was indeed missing (it is commented out).
469Another way to check \verb'neighbour/2', without looking at the source,
470would be using the
471Simple Query tool. This tool is again started from {\tkeclipse}'s
472\menu{Tools} menu. It can be used to send simple queries to {\eclipse},
473even while another query is being executed (as we are here, executing the
474\verb'colour' query). We can use this tool to check if \verb'neighbour(4,3)'
475or \verb'neighbour(3,4)' are defined or not:
476
477\begin{center}
478\resizebox{0.55\textwidth}{!}{\includegraphics{tkquery.ps}}
479
480\vspace{3mm}
481{\bf The Simple Query Tool}
482\end{center}
483
484To send a query, simply type it in the entry window and press return, and
485the reply will be sent to the reply window. In the example above, we have
486tried \verb'neighbour(4,3)', followed by \verb'neighbour(3,4)', and
487both failed, indicating that there is no neighbour relationship defined
488between countries 3 and 4.
489
490\begin{sloppypar}
491 We can fix the program by editing
492the file \verb'buggy_data.map' and adding the neighbour(4, 3) line back.
493TkECLiPSe does not provide an integrated editor itself, so you need to use
494some external editor, such as emacs, vi, or wordpad to edit the program. 
495You can tell \eclipse which editor you want to use, so that you can invoke
496the editor from within \eclipse. For example, from the source context view
497window of the tracer, you can invoke an editor to edit the file being
498\begin{figure}
499\begin{center}
500\resizebox{0.3\textwidth}{!}{\includegraphics{tksoucontext.ps}}
501\end{center}
502\caption{Invoking an editor}
503\label{tkeditor}
504\end{figure}
505displayed. Holding down your right mouse button in the source context
506window will popup a menu, as shown in figure~\ref{tkeditor}. Select ``Edit
507this file'' option will invoke your specified editor to edit the file, and if
508possible, the file will be opened showing the line where your mouse pointer
509was when you popup the menu (line 24 in this example).
510
511\Note{
512You can specify an editor to use with \eclipse using the Tkpreference
513editor tool from the Tools menu. Fill in the entry for ``Text editor to use''
514with the editor you want to use -- this should be the command that you will
515type in a command line to invoke your editor. In addition, if your editor
516supports it, you can fill in
517the ``Editor's command line option to start at a specific line'' with the
518command line option that will cause the editor to open the file at a
519certain line.
520}
521
522To run the corrected program, we first end our current debugging session by
523closing the tracer window. You can see from the map display that the
524execution continues until a solution is produced. 
525Pressing \button{Done} on the map display will return control to
526{\eclipse}. Alternatively, if continuing the execution is undesirable,  press the \button{Abort} command button in
527the tracer, which would abort the execution.
528\end{sloppypar}
529
530Once we have made the correction to the program and saved it,
531we compile it by pressing the
532\button{Make} button on {\tkeclipse}. This recompiles any files that
533have been updated since {\eclipse} last compiled the file. 
534
535Running the program again will show that the bug is indeed fixed.
536
537
538\quickref{Mouse Button Operations on Objects}{
539In {\tkeclipse}, you can usually perform these operations on an object
540while the mouse cursor is over it:
541
542\begin{description}
543\item[left-click] selects the object. 
544\item[double (left)-click] `opens' the object. This can mean expanding it
545(e.g. in the inspector), or calling the inspector on it (e.g.\ on a goal in
546the call stack), or showing the source for a goal (e.g. in the source
547context view).
548\item[Right-click and hold]  Opens a menu which gives
549further option/information on the object.
550\end{description}
551Right-mouse button functionality are alternatively available through the
552left-mouse button with the control key pressed.
553}
554
555\quickref{Available Development tools}{
556{\small
557\begin{description}
558\item[Compile scratch pad] allow simple programs to be written and
559compiled. Equivalent to {\tt [user]} in command line {\eclipse}.
560\item[Source file manager] manage source files for this {\eclipse} session.
561\item[Predicate browser]  view/change properties of predicates.
562\item[Delayed goals] view delayed goals.
563\item[Tracer] debugger for {\eclipse} programs.
564\item[Inspector] term inspector. Useful for viewing large terms.
565\item[Visualisation client] start a visualisation client.
566\item[Global settings] view/change global {\eclipse} settings.
567\item[Statistics] show statistics. Information is updated dynamically.
568\item[Simple query] send simple queries to {\eclipse}.
569\item[Library browser and help] interface to {\eclipse} documentation.
570\item[TkECLiPSe preference editor] view/change {\tkeclipse} settings. 
571\end{description}
572}}
573
574\section{Summary}
575\subsection{{\tkeclipse} toplevel}
576\index{toplevel}
577\resizebox{0.8\textwidth}{!}{\includegraphics{tktopann.eps}}
578
579\subsection{Predicate Browser} 
580\index{predicate browser, development tool}
581\resizebox{0.8\textwidth}{!}{\includegraphics{tkpredann.eps}}
582
583\subsection{Delayed Goals Viewer}
584\index{delayed goals viewer, development tool}
585
586\resizebox{0.7\textwidth}{!}{\includegraphics{tkdelayedann.eps}}
587\subsection{Tracer}
588\index{tracer, development tool}
589\resizebox{0.75\textwidth}{!}{\includegraphics{tktracersourceann.eps}}
590
591\resizebox{0.8\textwidth}{!}{\includegraphics{tktracerann.eps}}
592
593\menu{Options} menu options:
594\begin{small}
595\begin{description}
596\item[Configure filter] Starts the tracer filter window, to allow the
597  filter to be configured.
598\item[Change print options] Changes the way the tracelines are printed.
599\item[Analyse failure] Get the invocation number of the most recent failure
600  so that a new run of the  query can jump to its call port.
601\item[Refresh goal stack now] Refreshes the Call Stack's display.
602\item[Refresh goal stack at every trace line] Select check box to allow the
603  call stack to be refreshed automatically every time the tracer stops
604\item[Refresh delay goals at every trace line] Select check box to allow
605  the Delayed goals viewer to be automatically refreshed every time the
606  tracer stops.
607\item[Raise tracer window at every tracer line] Select check box to allow
608  the tracer window to be raised (uncovered) automatically every time the
609  tracer stops.
610\end{description}
611\end{small}
612
613\subsection{Tracer Filter}
614\index{tracer filter, development tool}
615
616\resizebox{0.75\textwidth}{!}{\includegraphics{tkfilterann.eps}}
617
618\subsection{Term Inspector}
619\index{term inspector, development tool}
620
621\resizebox{0.8\textwidth}{!}{\includegraphics{tkinspectann.eps}}
622
623
624%HEVEA\cutend
625