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