X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=md%2Fdebugging.md;h=783718473227a3a3e98c1c00b6603286e0ed8028;hb=7c18e64acffa097aa2f56d837e7da66b20dd5645;hp=9e19ab95e0addc2781123da359c702adb9b681b7;hpb=2658a5a2e3a6900e7217cd55c0b7414c0750ddb2;p=mudman.git diff --git a/md/debugging.md b/md/debugging.md index 9e19ab9..7837184 100644 --- a/md/debugging.md +++ b/md/debugging.md @@ -4,197 +4,1144 @@ MIT Technical Memo 94 -Laboratory for Computer Science -Massachusetts Institute of Technology -545 Technology Square -Cambridge, Massachusetts 02139 - -# Copyright - -This report was originally published in the United States in January -1978 without a copyright notice and without subsequent registration -with the U.S. Copyright Office within 5 years. Doing at least one of -those was a requirement of United States copyright law at that time -[^1]. This report is therefore in the public domain in the United -States for failure to comply with the required formalities. This means -you're free to download, modify and redistribute this report. People -outside of the United States must check the copyright laws of their -country before downloading or redistributing. - -[^1]: - -# Abstract - -Program debugging is a time consuming process. Conventional debugging -techniques and aids typically give the user a narrow view of the -program's operation, making debugging difficult. A debugging system -that would present a clear overall picture of a program's behavior and -would be both flexible and simple to operate would be a valuable tool. -Such a system was designed and implemented in for Muddle, a high-level -applicative programming language. This report discusses: the design -alternatives considered during the debugging system's design and -implementation phases, the reasons for the resulting design choices, -and the system attributes. A major attribute of the system (MEND) is -that it does not simulate the program being debugged but instead -monitors it from another process. This attribute results in a robust -and viable debugging system, because MEND not be modified in order to -handle each new extension to Muddle and/or each new user-defined +Laboratory for Computer Science\ +Massachusetts Institute of Technology\ +545 Technology Square Cambridge, Massachusetts 02139 + +Copyright +========= + +This research was supported by the Advanced Research Projects Agency +of the Department of Defense and was monitored by the Office of Naval +Research under Contract No. N00014-75-C-0661. + +This report was originally published in the United States in January +1978 without a copyright notice and without subsequent registration +with the U.S. Copyright Office within 5 years. Doing at least one of +those was a requirement of United States copyright law at that time. +This report is therefore in the public domain in the United States for +failure to comply with the required formalities. This means you're +free to download, modify and redistribute this report. People outside +of the United States must check the copyright laws of their country +before downloading or redistributing. + +Abstract +======== + +Program debugging is a time consuming process. Conventional debugging +techniques and aids typically give the user a narrow view of the +program's operation, making debugging difficult. A debugging system +that would present a clear overall picture of a program's behavior and +would be both flexible and simple to operate would be a valuable tool. +Such a system was designed and implemented in for Muddle, a high-level +applicative programming language. This report discusses: the design +alternatives considered during the debugging system's design and +implementation phases, the reasons for the resulting design choices, +and the system attributes. A major attribute of the system (MEND) is +that it does not simulate the program being debugged but instead +monitors it from another process. This attribute results in a robust +and viable debugging system, because MEND not be modified in order to +handle each new extension to Muddle and/or each new user-defined primitive. -This report reproduces a thesis Of the same title submitted to the -Department of Electrical Engineering, Massachusetts Institute of -Technology, in partial fulfillment of the requirements for the Degree +This report reproduces a thesis of the same title submitted to the +Department of Electrical Engineering, Massachusetts Institute of +Technology, in partial fulfillment of the requirements for the Degree of Bachelor of Science. -# Acknowledgements +Acknowledgements +================ -I wish to thank Al Vezza, for supervising this work and guiding me -along the road to winnage; Stu Galley, for the original idea; Bruce -Daniels and Gerald Farrell, for laying some of the ground work I have -built upon; Brian Berkowitz and Chris Reeve, for patiently repairing -my ailing Muddles; Marc Blank and Tak To, for support work and for -providing me with company during all-night console sessions; and all -of the other ITS and DynaMod hackers who have built a system well +I wish to thank Al Vezza, for supervising this work and guiding me +along the road to winnage; Stu Galley, for the original idea; Bruce +Daniels and Gerald Farrell, for laying some of the ground work I have +built upon; Brian Berkowitz and Chris Reeve, for patiently repairing +my ailing Muddles; Marc Blank and Tak To, for support work and for +providing me with company during all-night console sessions; and all +of the other ITS and DynaMod hackers who have built a system well worth using. -This research was supported by the Advanced Research Projects Agency -of the Department of Defense and was monitored by the Office of Naval -Research under Contract No. N00014-75-C-0661. - -# Introduction +I Introduction +============== -## Background +I.1 Background +-------------- -A time-consuming and frustrating aspect of computer programming is the -debugging of faulty programs. Current debugging techniques involve -tracing through the present operation of the program and mentally -comparing its action with one's concept of what should be happening. -With few exceptions, an understanding of where the program fails to -conform to "correct" operation must be made before the cause of the -failure can be determined and corrective action taken. This is where +A time-consuming and frustrating aspect of computer programming is the +debugging of faulty programs. Current debugging techniques involve +tracing through the present operation of the program and mentally +comparing its action with one's concept of what should be happening. +With few exceptions, an understanding of where the program fails to +conform to "correct" operation must be made before the cause of the +failure can be determined and corrective action taken. This is where much of the difficulty occurs. -In conventional debugging, it is rare for the programmer to have -available any more than the most basic aids. One usually has to -extrapolate from a bare minimum of information (such as machine -generated error messages) or one may be buried under a large excess of -information, most irrelevant (such as a core dump). Even with the more -advanced aids, the programmer typically gets but a small window in the -operation of the program through which, sooner or later, she or he -will locate the problem. A well-localized fault will be relatively -easy to spot compared to a global problem that the programmer may only +In conventional debugging, it is rare for the programmer to have +available any more than the most basic aids. One usually has to +extrapolate from a bare minimum of information (such as machine +generated error messages) or one may be buried under a large excess of +information, most irrelevant (such as a core dump). Even with the more +advanced aids, the programmer typically gets but a small window in the +operation of the program through which, sooner or later, she or he +will locate the problem. A well-localized fault will be relatively +easy to spot compared to a global problem that the programmer may only catch glimpses of through the debugging window. -In a compiler language, the programmer's best hope is to insert -statements to print intermediate results or to try to separate the -program into easier-to-handle modules. There are a few more advanced -aids available, but their use is limited. One problem is that the -program is, in effect, first translated into a lower-level language -(generally "machine" language) and then executed interpretively in -that language. The original symbols and syntax of the source program -are lost, or saved only with great difficulty, making analysis and +In a compiler language, the programmer's best hope is to insert +statements to print intermediate results or to try to separate the +program into easier-to-handle modules. There are a few more advanced +aids available[^1], but their use is limited. One problem is that the +program is, in effect, first translated into a lower-level language +(generally "machine" language) and then executed interpretively in +that language. The original symbols and syntax of the source program +are lost, or saved only with great difficulty, making analysis and manipulation of the executing program a very painful process. -If the programmer is using an interpretive language with facilities -for interaction, things are considerably easier. The common technique -is to stop execution at strategic points and examine the state of the -environment. Since this is done interactively, with the source program -still available in more or less its original form, the cause of the -problem can often be found in less time than it could otherwise. one -of the best example of this approach is the use of DDT (Dynamic -Debugging Tool/Technique). - -DDT basically works with machine-language programs. However, by freely -translating between numbers and symbols through the use of a table -generated by the assembler, DDT makes programs look to the programmer -like symbolic assembly-language programs. The user of DDT can operate -in free-run mode or in n-step (statement) mode, switching between them -at will. In either case one can set a breakpoint at any statement, -which will cause execution to stop just before the statement is -executed. Whenever stopped in DDT, the user can examine or change the -contents of any location. This can be done in several data modes -(e.g., unsigned octal, full ASCII, sixbit, etc.) including the use of -symbols to represent addresses. Arbitrary numeric expressions can also +If the programmer is using an interpretive language with facilities +for interaction, things are considerably easier. The common technique +is to stop execution at strategic points and examine the state of the +environment. Since this is done interactively, with the source program +still available in more or less its original form, the cause of the +problem can often be found in less time than it could otherwise. one +of the best example of this approach is the use of DDT (Dynamic +Debugging Tool/Technique)[^2][^3]. + +DDT basically works with machine-language programs. However, by freely +translating between numbers and symbols through the use of a table +generated by the assembler, DDT makes programs look to the programmer +like symbolic assembly-language programs. The user of DDT can operate +in free-run mode or in n-step (statement) mode, switching between them +at will. In either case one can set a breakpoint at any statement, +which will cause execution to stop just before the statement is +executed. Whenever stopped in DDT, the user can examine or change the +contents of any location. This can be done in several data modes +(e.g., unsigned octal, full ASCII, sixbit, etc.) including the use of +symbols to represent addresses. Arbitrary numeric expressions can also be evaluated without affecting the program. -One main advantage of DDT is that the debugging environment is very -similar to the language environment the programmer used to write the -program. One has to learn only the DDT commands rather than an -entirely new language. Another advantage is the user's ability for -viewing the results of the changes. In addition, one can quickly see +One main advantage of DDT is that the debugging environment is very +similar to the language environment the programmer used to write the +program. One has to learn only the DDT commands rather than an +entirely new language. Another advantage is the user's ability for +viewing the results of the changes. In addition, one can quickly see the results of the changes and act accordingly. -The main deficiency of DDT is that, although is names include the word -"dynamic", its operation is really static. The application program can -run freely, but when the programmer wants to see what is taking place, -the program must be stopped. Although the real interest may be about -changes on a gross scale, perhaps thousands of program statements, if -one does not know exactly where the program is misbehaving, one may be -required to suspend execution of it every few instructions to examine -variable in order to obtain a true picture of the program's behavior. -This the programmers see *not what is taking place*, but *what has -taken place*, and through small windows at that. This is inefficient, -and the programmer can become bogged down in detail that hinders the -discovery of the true problem. The situation can be improved with the -use of breakpoints that allow the program is execute freely until a -breakpoint is reached, at which point the program halts. DDT is a +The main deficiency of DDT is that, although is names include the word +"dynamic", its operation is really static. The application program can +run freely, but when the programmer wants to see what is taking place, +the program must be stopped. Although the real interest may be about +changes on a gross scale, perhaps thousands of program statements, if +one does not know exactly where the program is misbehaving, one may be +required to suspend execution of it every few instructions to examine +variable in order to obtain a true picture of the program's behavior. +This the programmers see *not what is taking place*, but *what has +taken place*, and through small windows at that. This is inefficient, +and the programmer can become bogged down in detail that hinders the +discovery of the true problem. The situation can be improved with the +use of breakpoints that allow the program is execute freely until a +breakpoint is reached, at which point the program halts. DDT is a powerful tool but still leaves much to be desired in a debugging tool. -ESP (Execution Simulator and Presenter) is one solution to the static -problem. It really is dynamic is that large amounts of data are -constantly being displayed for the programmer while the program is -being executed (actually, simulated). The information is presented in -graphic form to improve readability and reduce confusion. A user of -ESP may watch areas of the display where data of particular interest -are being presented. One also has many options including control over -the speed of execution, the type of quantity of data displayed, and -special (more flexible than just a breakpoint) conditions for halting -execution. In this way one can structure and control the picture -presented to more easily understand what the simulated program is +ESP[^4][^5] (Execution Simulator and Presenter) is one solution to the +static problem. It really is dynamic is that large amounts of data are +constantly being displayed for the programmer while the program is +being executed (actually, simulated). The information is presented in +graphic form to improve readability and reduce confusion. A user of +ESP may watch areas of the display where data of particular interest +are being presented. One also has many options including control over +the speed of execution, the type of quantity of data displayed, and +special (more flexible than just a breakpoint) conditions for halting +execution. In this way one can structure and control the picture +presented to more easily understand what the simulated program is doing. And that is one key step in the process of debugging. -Like DDT, ESP has deficiencies also. These are mainly in the area of -editing and DDT-like examination of a faulty program. DDT is a -sophisticated language that ESP does not attempt to entirely replace. -The flaw in ESP is that it is not compatible with DDT. Ideally both -should be simultaneously available to the programmer, who can use +Like DDT, ESP has deficiencies also. These are mainly in the area of +editing and DDT-like examination of a faulty program. DDT is a +sophisticated language that ESP does not attempt to entirely replace. +The flaw in ESP is that it is not compatible with DDT. Ideally both +should be simultaneously available to the programmer, who can use features of each as the need dictates. -DDT and ESP work with a low-level language whose operation can be -shown fairly simply. For example, ESP often shows flow of control by -just displaying the actual section of program being executed and -pointing to the current statement. It also draws lines to show where -branching has occurred and in some cases even indicates looping. The -display philosophy can be readily extended to higher level languages -that are line oriented, like BASIC, but it fails with applicative -ones, like LISP or Muddle. The latter type does not use a linear -control flow, but uses a complex depth-first tree structure. -Furthermore, quite complicated data structures can be built (or -themselves executed) that bear little relation to the appearance of +DDT and ESP work with a low-level language whose operation can be +shown fairly simply. For example, ESP often shows flow of control by +just displaying the actual section of program being executed and +pointing to the current statement[^6]. It also draws lines to show +where branching has occurred and in some cases even indicates looping. +The display philosophy can be readily extended to higher level +languages that are line oriented, like BASIC, but it fails with +applicative ones, like LISP or Muddle. The latter type does not use a +linear control flow, but uses a complex depth-first tree structure. +Furthermore, quite complicated data structures can be built (or +themselves executed) that bear little relation to the appearance of the program. -A good basic display for Muddle was used in MUMBLE (Gerald Farrell's -monitor and debugging aid). The code being executed is shown in stack -form. Each line shows a piece of code being evaluated. As each object -in the bottom line is evaluated, it is replaced by a single -downward-arrow symbol in this line and then printed on a new line. In -this way the evaluation can be followed from the top level down to the -current object being evaluated. Furthermore, after the bottom is -reached, the value returned by each line replaces its symbol in the -previous line. With this mechanism, the programmer can follow +A good basic display for Muddle was used in MUMBLE[^7] (Gerald +Farrell's monitor and debugging aid). The code being executed is shown +in stack form. Each line shows a piece of code being evaluated. As +each object in the bottom line is evaluated, it is replaced by a +single downward-arrow symbol in this line and then printed on a new +line. In this way the evaluation can be followed from the top level +down to the current object being evaluated. Furthermore, after the +bottom is reached, the value returned by each line replaces its symbol +in the previous line. With this mechanism, the programmer can follow execution in a natural and reasonably clear representation. -MUMBLE had some difficulties arising from the fact that it simulated -execution rather than just watching it and letting it proceed -naturally. This caused it to run slowly and to be complex yet fragile. -At the time MUMBLE was written, the Muddle compiler was not yet -perfected and the language itself lacked some of the multiprocessing -features that would have made simulation unnecessary. Later Farrell -replaced MUMBLE with a debugger utilizing new software related to -single-stepping a process, which eliminated the simulation but also -eliminated the feature reflecting results of an evaluation back into -the original code. Also, a mode was added that allowed the programmer -to attach conditions to parts of the program which would stop -execution when and if a condition was false. This is as far as MUMBLE -ever progressed, and it was not in use as of the time of the proposal -for the current work. \ No newline at end of file +MUMBLE had some difficulties arising from the fact that it simulated +execution rather than just watching it and letting it proceed +naturally. This caused it to run slowly and to be complex yet fragile. +At the time MUMBLE was written, the Muddle compiler was not yet +perfected and the language itself lacked some of the multiprocessing +features that would have made simulation unnecessary. Later Farrell +replaced MUMBLE with a debugger utilizing new software related to +single-stepping a process, which eliminated the simulation but also +eliminated the feature reflecting results of an evaluation back into +the original code. Also, a mode was added that allowed the programmer +to attach conditions to parts of the program which would stop +execution when and if a condition was false. This is as far as MUMBLE +ever progressed, and it was not in use as of the time of the proposal +for the current work. + +I.2 MEND +-------- + +After the Muddle compiler became operational and many additional new +software features became available, it appeared that it would be +possible to design and implement a debugging system that would be +comprehensive, easy to use, and reasonably fast. It was therefore +proposed that a debugging system for Muddle called MEND (Muddle +Executor , aNalyzer, and Debugger) be designed and implemented. It has +the following characteristics. (A glossary of special terms, those in +all capital letters, used here and throughout the rest of this memo +may be found in Appendix B.) + +1. MEND possesses a display similar to that of MUMBLE, including the + replacement of arguments in a FORM by their values as they are + evaluated. +2. Execution is monitored from another process (as opposed to being + simulated as in ESP) using 1STEP and related features[^8]. +3. Execution speed is variable by the user including a static single + or multi-step mode where desired. +4. MEND allows execution to run freely below a certain depth of + evaluation or between certain points in the program and to run + controlled elsewhere. +5. Unconditional and conditional breakpoints are available that can + be attached to any object to halt execution before evaluation of + that object. +6. The system is capable of keeping track of programmer specified + conditions and of changing modes or giving some visible indication + when the conditions are met (or not met). +7. Information, such as the local value of programmer specified ATOMs + and the values of programer specified FORMs, is constantly + displayed beneath the main display. +8. Each line in the main display area is &-printed (abbreviated + printing, see glossary) and can be viewed in full at any time. +9. At any time, with execution stopped, the user can EVAL objects in + the ENVIRONMENT of the program. This means the user can examine + the state of the program or change it. + +I.3 Possible Additional Characteristics +--------------------------------------- + +Certain other characteristics were seen as desirable for MEND but +possibly beyond the scope of this project. If time permitted these +features were to be included in the system: + +1. The IMLAC multi-screen capability would be used to allow the user + to rapidly switch between the debugger display and the program's + own output. Other system output could also be put on additional + pages. +2. The editor IMED (an editor for Muddle objects analogous to + IMEDIT[^9]) would be tied into the system to allow easy editing. + PRINTTYPE and READ-TABLEs would be used to allow breakpoints to be + easily set and removed in IMED as single symbols. Other control + codes and statements could also be inserted using this editor. +3. At the applications programmer's option and within certain limits, + execution could be reversed either so that something different + could be tried or for purposes of reexamining the process for + something that may have been missed the first time. This feature + could come in two possible forms, the UNDO package[^10] to + actually reverse execution or a simulation displaying information + previously stored by the system. + +I.4 Design and Implementation +----------------------------- + +MEND was designed with the intent of providing the application +programmer with many options so that debugging could proceed in the +most suitable manner for each situation. In the normal running state, +MEND displays several kinds of information on the screen. Most +important is an area showing the execution of the application program +being debugged in stack form. The only other area that is always +present is a line or two of status information about the current +operation of MEND showing its current speed of execution (user +adjustable) and the state of each modifiable mode. + +It was intended that the output of the application program be saved by +MEND for later reference. The user of MEND could then elect to have +the most recent output constantly displayed in a window on the main +screen (see section on future work). If multi-screening were +available, the output could be kept on another virtual screen. That +screen could be displayed or made invisible at the user's option +without stopping MEND. + +Information such as programmer specified values of ATOMs, structured +objects, and, in general, the value of any Muddle expression may be +constantly displayed. MEND is also capable of displaying such +information on an exception basis according to some predescribed +condition. Such information is &-printed but is viewable in full when +desired. + +It is important for a debugging system like MEND to be compatible with +and to take advantage of available software in related areas. One such +area is editing. There were two Muddle editors in use when the +proposal for this work was made, EDIT[^11] and IMED. The main +difference between them is that IMED uses the local editing features +of the IMLAC while EDIT does not. EDIT, however, has the advantage of +being the only one that possesses breakpoint capabilities. Whichever +proved to be most compatible with MEND (possibly both) would be +slightly modified to allow the setting and removing of certain MEND +codes including, in the case of IMED, breakpoints. + +Muddle itself has many features that greatly aid the debugging +process. One of these is FRAMES. This function can be used to print +the stack of functional evaluations and applications when execution is +halted at any depth below the top level. At this point it is also +possible to get the values of objects in the current ENVIRONMENT and +to change them. One can even restart execution at a higher level after +making such changes. Because the Muddle debugging features are quite +powerful, MEND was designed to allow the user to stop execution (of +the application program) and to use these aids or any others built in +to Muddle with the MEND system itself transparent. Evaluation would +take place in the ENVIRONMENT of the application program. + +MEND now includes the main features of all the debuggers that have +been mentioned and enough other features that it should prove to be +quit useful for the analysis and debugging of Muddle programs. It +should also serve as a good example of the type of debugging system +that can be built around an applicative type language. + +II Terminal Display +=================== + +II.1 IMLAC Console Program +-------------------------- + +One basic concern throughout the project was the display: how the +information made available by MEND would be presented to the user. To +a large extent the physical characteristics of Muddle, ITS[^12] +(Incompatible Timesharing System, the operating system used on the +Dynamic Modeling System computer), and the available terminals +dictated what was reasonably possible. + +The terminal most commonly used by users of the Dynamic Modeling +System is the IMLAC PDS-1. This is a minicomputer capable of having +programs loaded into it from the PDP-10 host computer. One program +written for it by Dave Lebling is MSC, a multiple-screen terminal +program. Up to four virtual screens (or pages) can be created that +will individually operate like the actual screen area of the standard +terminal program (SSV[^13]). Output may be directed to any one of the +screens and any screen may be visible or invisible at any instant of +time, at the programmer's option. Selection of screen is controllable +either by program from the host or locally by the user. + +It was originally Intended that MEND would use MSC for its normal +display. One page would constantly show MEND's representation of the +control stack of the application program. Output initiated by the +program being debugged would go to a second page. A third page would +be used for interaction with MEND and would show user typein along +with any output from MEND that one was interested in seeing. The +latter would include, by user request, full displays of both objects +printed in an abbreviated form on the page containing the control +stack of the application program and values being monitored or traced. +The user could switch back and forth among the pages at will during +the execution of the program. The application program would have a +full standard screen to write onto, and ample room would be available +for the information to be displayed by MEND. + +After a fair amount of testing, this proposal was discarded for the +following reasons. First, MSC was supposed to look just like SSV for +individual virtual screens. Unfortunately new features added to SSV +had not also been added to MSC. A primary reason for this disparity +was that the new features encroached upon the IMLAC's character space. +An SSV with all current features can only hold about one and a half +full pages of text, where a page is the amount that can be visible at +one time. The overhead required for additional screens reduces it +still further. Therefore, with all features included, four virtual +screens could each only average about one-third full. Without many of +the current features, people were reluctant to use MSC. + +The second and perhaps most devastating problem with MSC is that it is +not properly supported by ITS as is SSV. Ordinarily the operating +system will keep track of where on the page the terminal's cursor is +and will properly handle such updating as deletions even in the face +of random access performed (if done by request to the system). When +using MSC, ITS does not realize that information is being written onto +more than one screen and will therefore often move the cursor to the +wrong position. + +MEND could completely control positioning for typeout and echoing on +typein but that would add the large overhead of having to run a +non-trivial routine for each character typed out on the display. Also, +because MSC is not the standard console program, requiring the user to +load it before using MEND might discourage the use of MEND. (It takes +between about 30 seconds and a couple of minutes, depending upon +system load, to load a new console program into the IMLAC.) + +From the outset it was intended that MEND be used routinely by +programmers as debugging problems arose. Therefore it was decided that +the proper way for such a system to operate was to use, as far as +possible, the common environment so as to keep the overhead for +invoking MEND small. This philosophy, which had been seen to affect +the success of many earlier projects, decided between the alternatives +and in this case led to the final decision to use SSV instead of MSC. + +II.2 Terminal Independence +-------------------------- + +The MEND terminal handling capabilities are actually quite general and +MEND does not depend exclusively on SSV. For the purpose of dividing +the screen area into several sections, horizontal lines are sometimes +drawn (see Appendix A showing sample display). With an IMLAC and SSV +these lines could be drawn quite simply using graphics mode. However, +for purposes of generality with regard to terminals, these lines are +instead formed by using underbar characters (on a line of their own). +By using no actual graphics MEND can be used with almost any display +terminal having random access. MEND outputs display commands, such as +clearing a line, as escape codes to ITS which then translates these +into the appropriate commands for the terminal in use. ITS currently +knows about several types of display terminals in use at the +Laboratory for Computer Science, and other types of terminals located +at foreign sites on the ARPA network may be handled by interface +software that simulates a known type. Naturally MEND can handle a +large range of possible line and screen lengths. (The current version +of SSV provides four possible character sizes.) + +II.3 Control of Screen Sectioning +--------------------------------- + +There still remained the question of how to handle the +multi-sectioning of the displayed information. Originally three +sections corresponding to the three virtual screens in the aborted MSC +implementation were planned. The bottom section would hold user typein +and application program output. Three possible methods of achieving +this involved having ITS, Muddle, or MEND do various amounts of the +work with increasing overhead and decreasing speed for those three, +respectively. + +The most attractive solution utilized an ITS feature allowing the +specification of an echo area at the bottom of the screen where echoed +input would always be printed (with the echoing handled by the system, +which is the normal case) . After some experimentation this method of +handling the typein and application program output was rejected +because typeout and deletion are handled by Muddle which ignores the +echo area MEND would effectively have had to control all typeout and +monitor all typein, which would have made the echo area useless. + +Experimentation with the second solution, an indirect method, involved +monitoring of special Muddle memory locations where information +concerning horizontal and vertical page positions is stored. It was +soon discovered that Muddle becomes confused quickly, contains several +bugs with respect to this position information, and generally has a +poor idea of where it is actually printing. + +The third solution appeared to be the most painful from an +implementation and efficiency point of view. MEND would need to +control the printing of every character on output and certain +characters on input, constantly checking page positions by querying +the system. Not only did this slow output, but also MEND was forced to +constantly move the cursor to a safe position in case Muddle managed +to sneak some output past it, which it occasionally does. + +Fortuitously the problem was neatly solved when a little known feature +of ITS was discovered. It Is possible to open a channel to the +terminal in a mode that would cause all output to appear in the echo +area. By creating this echo area and reopening Muddle's normal +terminal output channel in this mode, it is possible to cause Muddle +and the application program to think that the entire screen consists +of only the echo area. All output including application program +display escape commands is automatically routed by ITS to this echo +area. MEND sends its output to a second channel opened in the normal +mode, thereby allowing it to use an area of the screen unknown to and +left untouched by the application program. The physical cursor stays +where the last used logical cursor left it, thereby eliminating most +of the unnecessary cursor movement, resulting in a more pleasing +visual effect. + +As a result of this solution, the screen is divided into only two main +sections. All typein appears in the lower section, whether it is to +the application program or to MEND. Application program output also +goes to the lower section, as does unstructured output produced by +interaction with MEND. The upper section, in general, contains only +those items that occupy one line of the display each. As will be +explained later, these items include all output automatically +displayed by MEND during execution of the application program. + +III MSTACK: MEND's Representation of the Control Stack +====================================================== + +III.1 Program Execution In Muddle +--------------------------------- + +MEND's primary role is to allow the applications programmer to +visually monitor the execution of a program. In a language like +Muddle, this is most easily accomplished by showing the programmer a +picture of the control stack. + +A Muddle program consists of the evaluation of a single object. The +object is usually structured in some manner and itself contains other +objects. The most common object is the FORM. This is a list of objects +in which the first is (or evaluates to) some function and the rest are +arguments to that function. A FORM is evaluated by applying the +function to its arguments, usually after the arguments are themselves +evaluated. This evaluation actually is initiated by the Muddle +interpreter by applying the function EVAL to the original object. EVAL +takes an object as its argument and returns the value to which it +evaluates. + +Figure 1 shows a (simplified) static representation of the evaluation +of a Muddle object. Starting with the FORM (list of objects in +angle-brackets) to be evaluated, the flow of control/evaluation may be +described as a depth-first search through the tree pictured. The +arrows represent values being returned to previous levels. At the end +of this "search" the FORM returns the value shown at the top. + + Figure 1: + + 31 + ↑ + <+ .A .B .C 5> + ↑ ↑ ↑ ↑ ↑ + + .A .B .C 5 + ↑ ↑ ↑ + 6 8 12 + +Typically the control stack will start with one object on it, the FORM +to be evaluated. This evaluation will first require that the objects +in the FORM (possibly FORMs themselves) be added to the stack and +evaluated. EVAL recursively calls itself for this purpose. The stack +builds (downward, by convention) until some object is placed on it +which ls known by EVAL to need no further evaluation. This object is +returned as its own value to the previous level and values continue to +be returned upward until a level is reached where another object must +be evaluated. In this manner, the stack grows and shrinks until the +topmost (initial) object returns a value. + +III.2 Monitoring Program Execution +---------------------------------- + +The manner in which the stack builds, the objects are evaluated, and +the values are returned illustrate most of what the program is doing. +Other factors, including side effects and complied code, will be +discussed at the end of this chapter. MEND's main display therefore +shows a representation of the stack being continuously updated as +execution/evaluation proceeds. + +There are essentially two ways that MEND could follow the flow of +control of the application program. The most direct way, as attempted +by MUMBLE[^14] and discussed in the last chapter, would be for MEND to +execute the application program by simulating the operation of Muddle. +This type of simulation has been shown to require a complex end all +too often fragile structure. The debugging program would need to be +constantly updated to match changes and additions to the Muddle +language , but more importantly it would fail to properly handle +programmer-defined primitives, several varieties of which are provided +for by Muddle. + +A far more satisfactory method is to allow Muddle to execute the +application program in more or less its normal fashion but to stand +beck somewhere and watch. Fortunately Muddle contains a mechanism +ideal for this, called multiprocessing. Basically another control +stack , or process, may be created (independent of the first) that may +be used to execute a different function with its own set of variable +bindings. One such process, in this case MEND, may place another, the +application program, into a single step mode where the latter will be +stopped before each call to EVAL and again as each call returns. The +MEND process will at these points be restarted and given information +about what the application process is doing. MEND stores this +information in a multi-level structure it creates called an MSTACK. + +Each level of an MSTACK corresponds to a level of the control stack +being monitored. Each level contains the original object (actually, a +pointer to it) being evaluated at that level and a new object, called +the "displayed object", that will or does contain the results of +evaluating each of the arguments or elements of the original. The +displayed object is initially the same as the original (in a real +sense, it is the original) but is systematically rebuilt as each +element is evaluated and replaced by what it returns. Thus MEND can +keep track of the relationship between the changing display and the +unchanging program. (Figure 2 shows the various stages that the +displayed object corresponding to the FORM being evaluated in Figure 1 +goes through. Each stage would in fact be painted over the previous +one so that all of these stages represent only one line of the screen. +The down-arrow shown in some of the stages is a place-holder that +represents an object that is actually expanded on the next line of the +screen.) A pointer is also kept showing which element is currently +above this on the stack to be evaluated unless, of course, this is the +initial element of the stack. + + Figure 2: + + <+ .A .B .C 5> + <+ ↓ .B .C 5> + <+ 6 .B .C 5> + <+ 6 ↓ .C 5> + <+ 6 8 .C 5> + <+ 6 8 ↓ 5> + <+ 6 8 12 5> + + 31 + +III.3 A Displayed Representation of Program Execution +----------------------------------------------------- + +The printed representation of the stack occupies the top section of +the screen and is the most prominent and important characteristic of +MEND. Most often, in fact, it is only necessary to watch this display +as the application program is executed to ascertain where a bug is +located or to observe exactly how the program operates. Therefore +considerable time has been spent making the operation of the MSTACK +and associated display as natural and informative as possible. + +Using the collected information described in the previous section, a +representation of the stack is displayed as a number of lines, each +corresponding to one level. Each line shows a level number and the +displayed object printed in "&-printing", named for the printing +function &[^15] created by Greg Pfister. Although strictly speaking +the stack builds upward (towards higher memory locations), it seams +more natural to display and speak of the stack as building from the +top downward, in the direction that printing normally occurs. As each +element of the bottom level (the bottom line on this section of the +screen) is placed on the stack for evaluation, a new line is added +beneath the previous bottom-level line showing that element, and the +element is replaced in the previous line by a pointer ("↓") marking +its location. When the element finally returns a value, the returned +value will replace the pointer in the displayed object. + +To avoid visual distraction, a minimum of updating is done on the +screen. In most cases random access is used to replace only those +lines that have changed. In general the complete stack will not fit in +the display area allocated for it (whose size is user adjustable) so a +scrolling procedure has been devised. The complete display area is +rewritten whenever an attempt is made to write past the bottom or +erase upward past a certain level while some lines are invisible +because they have been scrolled off. The scrolling parameters have +been selected to optimize the number of lines visible on the average +vs. the frequency of scrolling. Level numbers allow the user to see +how much is hidden "above the screen" and how deep the evaluation is +nested. + +III.4 MEND Program Steps Vs. Muddle Steps +----------------------------------------- + +To make it easier for the programmer to follow what the application +program is doing, the speed of execution of the program must be +controllable. MEND does this by inserting a constant, user adjustable +delay between program "steps." One MEND step is not precisely the same +as one Muddle step. Remember that a Muddle step is one call to or +return from EVAL. Each MSTACK level, and therefore each displayed +line, will have two Muddle steps associated with it. At the first +step, MEND will create the level and add one line to the screen. At +the second step, MEND will erase that line and put the returned value +back into the previous line. For clarity MEND adds a third step +between these two which actually occurs at the second Muddle stop. +Before substituting into the previous line, the current one is first +replaced by the returned value, the normal delay occurs, and then the +"second" step occurs as described. + +Some types of Muddle objects are self-evaluating; EVAL will simply +return the object it was given. Although nothing interesting has +happened, two steps have occurred. In this case MEND will avoid +clutter by pretending that no steps have occurred. (MEND only does +this with built-in types that MEND recognizes, and the programmer +should recognize, as being self-evaluating. Programmer-defined types +that are self-evaluating will generate the usual number of MEND +steps.) + +Another case of disparity between Muddle and MEND stops is more +complex. First some further explanations about Muddle objects are +needed Generally the interesting objects, the ones that generate MEND +steps, are linear (usually list) structures containing a number of +other Muddle objects, as are the FORMs described earlier. Normally +during evaluation of such an object the elements will be evaluated one +at a time from first to last. However this sequence is not always +followed by Muddle. MEND cannot directly determine which element is +about to be evaluated at each call to EVAL. It is only given the +object to be evaluated itself and not its position in the parent +structure. It is normally sufficient to do a comparison of this object +with the elements of the parent, starting with the first element +believed to not yet have been evaluated. Naturally, if the elements +are evaluated out of order, this procedure may fail to find the +desired match, because a Muddle object may contain the same element in +two or more positions. Thus it is possible to match the +about-to-be-evaluated object to the wrong occurrence of it. Further +complications arise because some functions can sometimes back up and +re-evaluate their arguments. + +A strong attempt was made to make MEND dependent only upon the general +characteristics of Muddle functions and not upon specific exceptions +and idiosyncrasies. It was felt to be desirable to make MEND +independent of both future changes to the language and +programmer-defined "primitives" that would not be known to MEND. +Besides, without actually simulating Muddle it is not possible to +always get the information MEND needs. It was felt that the "general +rule" approach would take care of a sufficiently large number of cases +without falling into the simulator problem. + +It was determined after some experimentation, however, that MEND could +not be made to work properly without some specific knowledge about +several important cases in Muddle. Two functions, PROG and REPEAT, +allow for branching the flow of control. They are normally +first-to-last functions as described above but at times control may +jump backwards to re-evaluate some elements. MEND was implemented so +that if it cannot locate an element in its normal search path, it will +start looking again from the beginning of the structure. If it is then +found, the displayed object will be reinitialized to be as if +evaluation had not yet proceeded past that point. Evaluation will then +continue normally. + +Another phenomenon of Muddle that we must discuss is what this author +labels the "clause" behavior. A clause is a list of objects given to a +function as a single argument. The list is not itself evaluated, but +some or all of its elements are evaluated. The most common function +illustrating this behavior is COND, a general purpose conditional +function. COND's arguments are all lists of objects. It sequences +through these lists, evaluating the first object in each, until an +evaluated object returns something considered "true." Then the rest of +the objects in that list are evaluated and COND returns what the last +object in the list returns. MEND's normal search path only looks at +top-level elements and would therefore never find the ones actually +being evaluated. + +This phenomenon seemed to be more widespread than the PROG/REPEAT one +and could not be easily attributed to certain functions. The solution +chosen here was to in all cases do a nested search in elements that +looked as if they might be clauses. (The search actually goes one +extra level deep to allow for certain special cases.) When a match is +found in a clause, MEND will for clarity generate extra steps to make +it appear to the user as if first the clause and then its appropriate +element was put on the stack for evaluation. The clause will stay on +the stack until some element that is not above it in the evaluation +tree is evaluated. At that time the clause will be removed in an +orderly manner, and the new element or clause plus element will be put +onto the stack. To do this smoothly, up to six MEND steps may have to +be generated for the one Muddle step. (See the example in Appendix A.) + +III.5 What the User Does Not See +-------------------------------- + +MEND, in its display of the MSTACK, attempts to show the user +everything of importance that is happening as the program is executed. +However certain features of Muddle cannot be captured in this sort of +representation. + +One such feature is the existence of compiled code. Although Muddle +was originally intended to be a high-level interpretive language, an +assembler was written[^16], producing machine code that executes in +the Muddle environment, to allow programmers to create "primitives" +that perform functions not otherwise available in Muddle. Once the +assembler was written, it was natural that a compiler[^17] followed. +It translates normal Muddle code into Muddle assembly code which is +then assembled. Typically Muddle programs are tested interpretively +and, when fully debugged, complied in order to obtain a major increase +in speed of execution. + +A call to a compiled (or assembled) function usually looks to the +programmer and to MEND like a call to a Muddle primitive. The +operation of the function is not seen except when it calls uncompiled +functions. This does not present a major problem to MEND since +generally only uncompiled functions are being debugged, and the +compiled ones encountered are hopefully performing known functions +properly. + +One feature of Muddle that MEND is unable to cope with is the +interrupt system. The programmer may enable a large class of +interrupts and assign handling functions wherever desired. Examples +Include interrupts for characters being typed to a certain input +channel and notification that the system is about to be brought down. +(MEND uses interrupts to catch single character commands and to catch +errors.) + +Recall that MEND monitors application program execution by placing its +process into a single-stepping mode. When Muddle passes control to an +interrupt handier, it temporarily causes the process to leave +single-stepping mode. This is necessary partially because such a +handler may be specified to run in a process other than the current +one at the time of the interrupt. It unfortunately makes the handler +invisible to MEND. it is therefore not currently possible to use MEND +to debug interrupt handlers. + +There is a whole series of side-effects, such as printing by the +application program, that are not directly seen in the MSTACK +representation but are made visible by various other features of MEND. +These will be discussed where appropriate in later sections. + +IV Issuing Commands to MEND +=========================== + +IV.1 Types of Commands +---------------------- + +There is a need in debugging systems similar to MEND for two types of +commands for controlling operation. One type is a set of short, +immediate-action commands that the user of the debugging system may +issue at any time, such as a command to completely stop all activities +of the debugging system and to exit. The other type is the set of all +commands not belonging to the first set. This includes commands that +take arguments and those that can only be given while the application +program is suspended from execution. + +IV.2 Immediate Interrupt-Level Commands +--------------------------------------- + +In MEND's normal mode, various actions occur automatically. Most +importantly, the application program is executing and the displayed +representation of the MSTACK is being updated correspondingly. During +this time the programmer may type ahead to the application program, +but, since there is only one physical cursor that is used by both +MEND's display and typein echoing that must therefore jump back and +forth between the two text entry positions, a large amount of typein +is awkward. Therefore, all immediate action commands that the user can +issue while MEND is in automatic mode are single characters. To +minimize the chance of conflict with typein that the executing +application program might read, MEND immediate action commands are +invoked by typing certain ASCII control characters. Furthermore typing +one of these control characters causes an interrupt to occur which is +handled by MEND and allows immediate response. + +Note that this arrangement requires that there be certain reserved +characters, as listed below, that cannot be used to communicate with +the application program. Normally this presents no difficulty. An +alternative method was considered that required the reservation of +only one control character. However, the user would be required to +type an additional character as an argument signifying what function +is intended. There did not seem to be a great advantage to this scheme +and it was considered after the first scheme had been implemented. For +this and other reasons stated later in this section, the alternative +scheme was discarded. + +From the user's viewpoint, the currently implemented interrupt-level +commands are as follows. (ASCII control characters are represented by +"↑" followed by the corresponding letter.) + + ---- ------------------------------------------------ + ↑L clear screen, reprint stack and input + ↑Q Quit from current MEND + ↑E End automatic mode + ↑B Begin automatic mode + ↑U Unprint (stop displaying stack) + ↑P Print (start displaying stack) + ↑O skip Over (completely evaluate) current object + ↑N Next step (used when not in automatic mode) + ---- ------------------------------------------------ + +The command invoked by typing ↑L is for housekeeping purposes. It +causes extraneous information (e.g., old program output) to be cleared +from the screen and all MEND-related constantly-displayed information +to be reprinted. Unread input is also reprinted. + +The command invoked by typing ↑Q is used to exit from an invocation of +MEND. It has the effect of stopping all actions related to monitoring +the application program and allowing the program to continue normally. +In this way a programmer may discard MEND and continue running the +application program without the need for restarting it at the +beginning. + +The two commands invoked by typing ↑E and ↑B switch MEND between +automatic mode, the only one described thus far, and non-automatic +(command) mode. Command mode will be described in the next section. + +Sometimes it is desirable for the sake of saving both computer time +and the application programmer's time to turn off printing of the +MSTACK. MEND will continue to monitor program execution and store the +appropriate information but it does not display it. Nor does it pause +between steps in the normal manner. This is mainly useful when +breakpoints are present to turn on printing or switch to command mode. +At that time MEND will know how it got to the current level and will +be able to display the MSTACK as usual. Two commands invoked by typing +↑U and ↑P toggle the state of printing. + +Whenever the programmer is satisfied that a particular call of a +function is working properly or for some reason he or she is not +interested in seeing the details of evaluation of some object, typing +↑O just before the object's evaluation invokes a command that causes +MEND to skip over that evaluation and continue normal monitoring and +display immediately after a value is returned. Unlike turning off the +printing, no monitoring is performed here at all so the evaluation +proceeds as fast as it would without MEND. This is actually handled by +causing Muddle to leave single-stepping mode during the evaluation of +the object. + +The last command, invoked by typing ↑N, is special in that it is +ignored in automatic mode. Its actions in command mode will be +described in the next section. It is an interrupt-level command mainly +for convenience and compatibility with DEBUGR. + +Bruce Daniels' DEBUGR is the prototype Muddle multiprocessing +debugging system. It provides a simple user interface to Muddle's +single-stepping functions that makes single-stepping through a Muddle +program appear similar to single-stepping through an assembly-language +program with DDT[^18][^19]. The choices of characters for invoking +many of the MEND functions were based upon the characters used to +invoke similar functions in DEBUGR. Many of DEBUGR's command +invocation characters were in turn based upon those in DDT. The object +of all of this is to build character/command associations in the +user's mind that may be carried over from one system to the next. + +Several other control-character commands are handled by MEND +invisibly. That is, the user may not be aware that they are being +handled. Most of these are commands that are already being handled by +other subsystems but must be intercepted by MEND to maintain +consistency in its environment. Two of this type, invoked by typing ↑S +and ↑G, are already set up in an initial Muddle and a third, invoked +by typing ↑F , is set up by the subsystem EDIT, which is called by +MEND as described in the next section. All three of these are used to +escape to various command levels. MEND has its own command level (see +next section) and must in many cases escape to that one instead to +maintain control. Until a method was discovered for having ITS section +the screen, it was necessary to also interrupt on carriage-returns +(↑M, the new-line character) on input to insure that typein was kept +in the proper section. + +IV.3 MEND's Command Level +------------------------- + +Sometimes the user may wish to stop the application program at some +point to examine it in more detail or to alter it or its environment +in some way. Alternatively the user may want to issue commands to MEND +that require arguments. A command level is provided for both of these +activities. + +The command level differs from the automatic mode described in the +last section in two ways. First, the application program is not +continually executing. It runs one step at a time under the direct +control of the user rather than automatically. Second, in +non-automatic mode typein is normally passed to MEND instead of the +application program, even that class of typein which does not produce +immediate action. + +When the application program is stopped, the user may either request a +service from the debugging system or examine and/or modify the program +and/or its environment. Since editing functions form a large part of +the latter class of actions, it was decided that instead of requiring +the user to "import" an editor, MEND should provide an editor by +making one available at command level. + +It is generally believed and empirical evidence indicates, that +creating a new editor is "the kiss of death" for a Muddle subsystem. A +number of Muddle editors have been tried over the years and the only +one that finally became generally accepted (and is now pre-loaded in +Muddle) is EDIT[^20] . Members of the Muddle community will tolerate +minor changes to EDIT, but they will not accept a new editing system. +The situation is analogous to one of the major obstacles blocking the +acceptance of ESP. Programmers were accustomed to using DDT to examine +and modify their machine-language programs. ESP was not compatible +with DDT and therefore did not provide the familiar interface desired. + +In view of the situation, it seemed desirable to incorporate EDIT into +the command level, essentially unaltered. EDIT uses a special reader +that either interprets input as a command to it or passes input on to +the normal Muddle reader. At first the task of superimposing a MEND +reader on top of both of these appeared difficult. After much +discussion with the current maintainer of EDIT, a very satisfactory +solution was arrived at. + +A general capability was added to EDIT allowing the specification at +runtime of a table of EDIT-like commands to be handled by +programmer-defined functions. This table is searched before EDIT's +command table and thereby provides a capability to override standard +EDIT commands. MEND basically uses an invocation of EDIT as its +command level with all MEND commands included in a table as described. +EDIT-format commands are all one or two letters and may take suffix +arguments. Currently the MEND table includes the following commands. +(FIX here means a Muddle object of type FIX, i.e., a fixed-point +number. FLOAT means a floating-point number. PPRINT[^21] is a function +that prints a Muddle object in a format which indicates the positions +of its elements and sub-elements in the tree hierarchy.) + + NAME ARG TYPE MEANING + ------ ---------- -------------------------------------------------- + ? none type out short summary of MEND commands + ?? none type out complete summary of all commands + O any Open object or MCSTACK level n (if arg n is FIX) + V none toggle Verbosity + N FIX do Next n steps (like ↑N) + OV none skip OVer current object (like ↑O) + Q none Quit EDIT & return to automatic mode (like ↑B) + QM none Quit MEND (like ↑Q) + SN FIX Set number of lines used for stack display + SV FIX Set leVel below which MEND will not 1STEP + SD number Set Delay time (FIX or FLOAT) between steps + PD FIX Pprint Displayed object in level n + PO FIX Pprint Original (actual) object in level n + AI any Add an Item to the list being monitored + DI FIX Delete Item number n from the list + PI FIX Pprint Item number n + +What the user types to the command level is inspected by EDIT. If it +looks like an EDIT command, it is looked-up in the MEND command table +or the EDIT one and handled as appropriate. Otherwise it is passed to +the Muddle reader. In general any interesting (useful) input that +Muddle should read and evaluate will not look like an EDIT command, so +there is no confusion. + +As can be seen from the table, the MEND commands include general +information retrieval ones (? and ??), system tailoring ones (V, SN, +SV, and SD), and commends that allow objects to be accessed in special +MEND locations (O, PD, PO, AI, DI, and PI. The O command is special in +that it allows an object known only by its location in the MSTACK to +be opened for examination and alteration by the normal EDIT commands. +The remaining commands duplicate control-character commands except +that they are read at normal input level rather than at interrupt +level. + +The most powerful feature of this command level is seen when Muddle +objects are evaluated. This level, and therefore the evaluation, uses +stack space below the application program and in the same process. All +bindings and pending evaluations of the program are above the command +level where they may be examined and modified at will. Most of what +constitutes MEND is in another process safely removed and hidden from +the user. Even the small amount of overhead constituting the command +level function is hidden from functions such as FRAMES[^22], which may +be used to view the levels of the application program's current +control stack. The effect is much the same as that of Muddle's +listening loop which is invoked at the current bottom of the stack in +case of error, to allow the programmer to run any program (evaluate +any object) to find and correct the problem. + +Note that for critical examination of the program, the user may +request that it be continued for a limited number of steps (usually +one) with control then being returned to him or her at the command +level. One normally would employ such a feature when the program is +executing statements near the area of suspected trouble but it is not +entirely clear how or why the program is misbehaving. + +IV.4 Breakpoints +---------------- + +Normally MEND operates in automatic mode where the application program +is running continuously. If one is aware of a particular area of +concern, one cannot and should not have to see that area as it is +reached and quickly type ↑E in order to stop the program. One may have +the program running with a very small delay time or have the printing +turned off. + +In their simplest form, MEND breakpoints stop the program when +evaluated, putting the user in command mode if she or he was not +already in it. This is the Muddle equivalent of DDT breakpoints, which +stop a program at a certain instruction. The breakpoints can also be +conditional, where the evaluation of an arbitrary object determines +whether or not to actually break at that point. + +The breakpoints as so far described are very much like the breakpoints +that can be set by EDIT. As a matter of fact, EDIT is used to set and +clear these breakpoints just as it would be in the absence of MEND. +The only real difference is that, when MEND is present, a MEND +function is called to handle the break instead of an EDIT function. + +MEND breakpoints would be useful even if they only did what was just +described. However they are more powerful. A standard EDIT-style +breakpoint is a call to the break function with a number of arguments. +The first of these is the object at which the breakpoint is set, which +will be evaluated when the user returns from the breakpoint and whose +value will be returned by the break function to the application +program. The next is the conditional object and the rest are objects +to be evaluated and printed at each break. MEND's break function +handles these as EDIT's does but also looks for a recognized ATOM +(variable name), which may come after or replace the conditional. If +such an ATOM is found, it will cause a special action to occur instead +of stopping the program: + + ------- --------------------------------------- + ON printing will be turned on (like ↑P) + OFF printing will be turned off (like ↑U) + GO free-run the object (like ↑O) + PRINT just print arguments & continue + ------- --------------------------------------- + +Other arguments will still be printed and all actions are still +predicated upon the value of the conditional. + +The first two special ATOMs (ON and OFF), perhaps coupled with manual +control, are used to allow the MSTACK to be viewed only during areas +of interest while maintaining maximum speed in other places. The next +one (GO) is used to avoid wasting time examining the details of a +functional call that is known to be working and is probably evaluated +repeatedly. When the break function returns, single-stepping resumes +as before the break. The last special ATOM (PRINT) is used to give +information at key places that might not otherwise be seen. + +One thing that was considered extremely important was to make MEND's +breakpoints compatible with those of EDIT. The problem is that a +breakpoint inserted outside of MEND might still be present when MEND +is started and vice versa. As has been stated EDIT breakpoints work +almost exactly as usual when handled by MEND's break function. The +converse is not quite true. EDITs break function will ignore the +significance of a special ATOM end simply print it as a normal +argument. Fortunately, an ATOM evaluates to itself. If it is in the +conditional position it will always be considered "true" and no harm +will be done. + +It would be easy to extend this arrangement to other special ATOMs if +other functions were considered useful. The above seem to form a basic +set in this system. At least they are useful and no one has yet +suggested another type of breakpoint that would also prove useful. + +[^1]: G.A. Mann, "A Survey of Debug Systems", Honeywell Computer + Journal 1973, volume 7, number 3, pages 182-198 + +[^2]: Digital Equipment Corporation, "DDT-10 Programmer's Reference + Manual", Assembly Language Handbook, DEC-10-NRZA-D + +[^3]: B. Bressler, DDT: A Debugging Aid, SYS.06.01, Programming + Technology Division Document, Laboratory for Computer Science, + M.I.T., November, 1971 + +[^4]: S.W. Galley, Debugging with ESP -- Execution Simulator and + Presenter, SYS.09.01, Programming Technology Division Document, + Laboratory for Computer Science, M.I.T., November, 1971 + +[^5]: S.W. Galley and R.P. Goldberg, "Software Debugging: The Virtual + Machine Approach", Proceedings of the Association for Computing + Machinery Annual Conference, November, 1974, volume 2, pages + 395-401 + +[^6]: M.H. Liu, DETAIL: A Graphical Debugging Tool, S.B. Thesis, + Department of Electrical Engineering, M.I.T., February, 1972 + +[^7]: G.J. Farrell, A System for Muddle Programming, M.S. Thesis, + Department of Electrical Engineering, M.I.T., August, 1973 + +[^8]: S.W. Galley and G. Pfister, Muddle Programming Language Primer + and Manual, Laboratory for Computer Science, M.I.T., May, 1977 + +[^9]: J. Haverty, IMEDIT Editor Program for Use with the Imlac + Terminals, SYS.08.01.02, Programming Technology Division Document, + Laboratory for Computer Science, M.I.T., August, 1972 + +[^10]: B. Berkowitz, UNDO, Undergraduate Research Report, Programming + Technology Division, Laboratory for Computer Science, M.I.T., + December, 1974 + +[^11]: N. Ryan, EDIT: The Muddle Editor, SYS.11.14, Programming + Technology Division Document, Laboratory for Computer Science, + M.I.T., August, 1974 + +[^12]: D. Eastlake, R. Greenblatt, J. Holloway, T. Knight, and S. + Nelson, ITS 1.5 Reference Manual, Memo No. 161A, Artificial + Intelligence Laboratory, M.I.T., July 1969 + +[^13]: P.D. Lebling, SSV User's Manual, SYS.52.07, Programming + Technology Division Document, Laboratory for Computer Science, + M.I.T., (in preparation) + +[^14]: S.W. Galley, Pre-loaded Pure MDL RSUBRs, SYS.11.28, Programming + Technology Division Document, Laboratory for Computer Science, + M.I.T., November 1975 + +[^15]: B. Daniels, The MDL Assembler, SYS.11.07, Programming + Technology Division Document, Laboratory for Computer Science, + M.I.T., (in preparation) + +[^16]: C. Reeve, The MDL Compiler, SYS.11.25, Programming Technology + Division Document, Laboratory for Computer Science, M.I.T., (in + preparation)