AaÿFo!:Ï•™™ …†††‡‡ˆ”HH $ d H6$$ÌÌÌÌÌÌff@€€€öÿø ø ø ÿÿÿ ø ÿÿÿÿd#± ÿFootnote TableFootnote* à* à. . / - Ð Ñ:;,.É!?±`O//aTOCHeadingl!C'sDylanGwydion Implementors Instantiable accessorsbytecharacterdo(rcurry(checklentrancyeof. filestream-filename forceoutput getinputiinputavailablealimited( †? ‡H@ ˆ$A ‰ÌB Š@C ‹D Œ€E F ŽG H ø I ‘ÿJ ’ø K “ÿL ”dM •N –O — ÿP ˜e Q ™notR š* S ›T œ. U V ž±W Ÿ`X  /Y ¡Z ¢[ £\ ¤l]! ¥Dy^" ¦dioµ# §men¶$ ¨tana% ©cceb& ªytec' «rd( ¬(che) ­ranf* ®fig+ ¯-¥, °fo¹- ›t z. œi{/ œilaº0 ›ite…µ©,… (Mindy Debuggerne† invoke-debuggere‡ yStack Manipulation Commandsaˆ eup‰ downŠ eframeuyp‹ c backtrace(ooŒ nExamining Variablesi tlocalsŽ print colon notation library‘ module’ Evaluating Expressions“ call” Debugger Variables• flush – $aN— $…˜ $$™ $-Nš $N‰› Restarts and ReturningŒœ restart abortž Interrupting;Steppingø Ÿ continue  step¡  breakpointÿ¢ delete™£  disassemble ¤ thread¥! disable¦" enable §# inspect¨$ xinspect©% helpª& yquit«' tron¬( troff©­) errore®* gc¬¯+ describe°, i"22222: Heading: The Mindy Debugger5E75™àila6šèµ,8œçMieuferÊŒ„3ø›e›ñÉe*39747: Heading: The Mindy Object InspectorÝýòeÝ<$lastpagenum>Þ*<$daynum01> <$shortmonthname> <$shortyear>ß"<$monthnum>/<$daynum>/<$shortyear>à)<$daynum> <$shortmonthname> <$shortyear> á"<$monthnum>/<$daynum>/<$shortyear>â<$monthname> <$daynum>, <$year>aã"<$monthnum>/<$daynum>/<$shortyear>ä <$fullfilename> å <$filename>$$æ <$paratext[Title]>ç <$paratext[Heading]> Rè <$curpagenum>é <$marker1>ê <$marker2>ë (Continued)ø ì+ (Sheet <$tblsheetnum> of <$tblsheetcount>)pntíPagepage<$pagenum> îHeading & Page Ò<$paratext>Ó on page<$pagenum>ïSee Heading & Page%See Ò<$paratext>Ó on page<$pagenum>. ð Table & Page7Table<$paranumonly>, Ò<$paratext>,Ó on page<$pagenum>eñDocument"the document <$paratext>ÉÙÊÉlibrariesinspector.fmÑñÛ ÑÒÓÔÕAaumÖ  Aa×!!Ø""Ù##AÚ$0Arm¡%m6n$d&n6e'o6o>/(p7$ea)q7fi*r6 +s6 ,t7ele-u8teªv55>/w6g.x9a0y:a1. 1z5nø 2{5htb3|;ols7}5p8~5een9<¥:€<<¥;=¥<‚5ein=ƒ5ear?„:p2. e@…5e A†;lraF‡5<exGˆ5eenH‰5meIŠ;uEmL‹5rMŒ5c>N;>toOŽ:3. P5Q;R‘5S’;T“5U”;V•5W–5mJ—5K˜5X™:4. Yš5Z›;[œ5A\;]ž5m4Ÿ;n^ 5e_¡5o`¢:5. a£5b¤;c¥5d¦5e§<¥5¨>¥f©>¥gª>¥h«?¥i¬?¥j­<¥k®<¥l¯<¥m°=¥n±5o²;~À5Á;5€Â5;Ã;5‚Ä5;ƒÅ:7. „Æ5…Ç5†È;m‡É5ˆÊ5‰Ë;ŠÌ55‹Í;;ŒÎ:8. Ï5ŽÐ;Ñ5Ò;‘Ó5’Ô;“Õ55”Ö;;ü×55•Ø: 9. –Ù5—Ú;˜Û5™Ü;šÝ5›Þ;œß5à;žá5Ÿâ; ã5¡ä5¢å;£æ5¤ç;¥è5¦é;§ê5 ¨ë;a©ì: 10. ªí5«î;¬ï5­ð5®ñ;¯ò5°ó;±ô5²õ;³ö5´÷5µø55¶ù55·ú5;¸û:m 11. ¹ü5ºý56þ;»ÿ5¼5½55¾5;>;5¿: 13. À5Á5B<¥C<¥D @E 5r 55 :: 12. · 5:é91HdÂéM; …dÃêM;!#†H$Ô ÄëNé 5H$Ô ÿÿ ¦ªªªªUUdw‚; Hw­ìÔ ÅìNé Hw­ìÔ ÿÿ ð5;ªªªªUUdm‚ H$Ô ÆíNé ;H$Ô ÿÿ µ5ªªªªUUdn‚5 Hw­ìÔ ÇîNé Hw­ìÔ ÿÿ ÿ55ªªªªUUdo‚ HHÔˆÈïNé :HHÔˆÿÿ 5ªªªªUUdp‚ HHÔˆÉðNé HHÔˆÿÿ 1291H ªªªªUUdq‚ lúÿ"Ô ÊñNê lúÿ"Ô ÿÿ !$ªªªªUUnr‚ý22 May 97 þ HúÿûÔ ËòNê HúÿûÔ ÿÿ w­ìÔ"NªªªªUUns‚ì! /Running H/F 2 .ÿ#  $HšÌóNê $Hšÿÿ Ô #ÔªªªªUUdt‚ dÍôMõ‡ H#¬*¹É ÎõNöô H#¬*¹É HR HR yFootnoteH•ˆrÿª7¹É ÏöNõ÷ô ÔH•ˆrÿª7¹É H¯·zH¯·zy Single LineˆH'´ðÿÐ÷NöùôøøFootnote  -øO÷ ÿ 12 ™ H•ˆ¨îR<¹É ÒùP÷úô H•ˆ¨îR<¹É H¯·°H¯·°y Double LineHðÿ¹Ô ÓúNùýôûü Double LineÔ1ûQüúHÔNÔÔ3üQûúÔÔHúÿ…Ô ÖýNúÿôÿ þþ Single LineÔ6þQýÔÔHZ´ðÿØÿNýô TableFootnoteϸE]çGì'E¹É ÙNÿô ϸE]çGì'E¹É ϸEwPϸEwPy TableFootnoteodÚM$$ˆHz$HšÛN $HšÕÿ‰(($ (TU TU ªªhu€  , The € Mindy Debugger ¨ª*ªªUU x„cCopyright (c) 1994, 1995, 1996, 1997 Carnegie Mellon University All rights reserved. Refer to the H§ª6ªªUU@x„0end of this document for precise terms of use. PUYTU ªª`y€ Introduction ¤ªnªªUU z‚sWhen something goes wrong with your program, Mindy drops into the debugger. From the debugger, you can examine the £ªzªªUUz‚H|stack, print out variables, evaluate expressions, and do various other things that can be helpful in figuring out what went ¢ª†ªªUU@z‚Ôwrong. ¡ªœªªUU`{‚HwFor example, if you did not define a method for main, after starting Mindy you would see something like the following:  ª²ªªUU |†G=No applicable methods for main with arguments #[ÒmindyÓ] Ÿª¾ªªUU|† žªÊªªUU|†thread [0] D main ªÖªªUU|†@fp 0x10034090: invoke-debugger({ 0x1023fa91}) œªâªªUU@|† mindy> ›ªøªªUU }‚ TwThe first line is the error message. The second line tells you about the thread that encountered the error. For more htsšªªªUU}‚to‡information about threads see Section ŽThreads‚. The third line tells you about the current stack frame for the thread; in this Wh™ªªªUU}‚wrŠexample, the last function called, which is at the top of the stack, is the  invoke-debugger‚ function. It was called with one ˜ªªªUU@}‚re$argument, a ‚. at—ª2ªªUU ~‚ fsThe following sections discuss the various commands provided by the debugger. As a general rule, you can invoke a tho–ª>ªªUU~‚stzcommand by typing at least a unique prefix of its name. There are three commonly used commands for which a single letter •ªJªªUU@~‚ 1suffices, regardless of all other command names: h”ª`ªªUU`ƒ(d)own U“ªoªªUU`€ƒx1 (l)ocals v’ª~ªªUU`ƒpl (c)ontinue 23f‘ª”ªªUU ‚‚pThroughout this document, some examples build on previous examples, even when those previous examples come from t ª ªªUU‚‚cowprevious sections of the document. If there is a reference to the Òprevious exampleÓ, then please look to the previous ineª¬ªªUU@‚‚hesection's text. meŽªÂªªUU ƒ‚n €This documentation uses the term Žbuilt-in‚ for definitions created in C code, within Mindy's implementation. Opposed to ‚ªÎªªUUƒ‚s built-in definitions are definitions written in Dylan code. Parts of Mindy are built-in and parts are defined in Dylan code. theŒªÚªªUUƒ‚prxOf course, all user code is written in Dylan. Some debugger commands behave differently depending on whether the object pr‹ªæªªUU@ƒ‚ T9being manipulated was defined in Dylan code or built-in. t4UTU ªªh„€~  Stack Manipulation Commands otˆªªªUU(…‚ h{The Mindy debugger offers a few commands for moving up and down the stack. The two most common commands are ‘ up‚ oug‡ª(ªªUU…‚, …and ‘ down‚. Mindy considers the most recently called function to be at the top of the stack and the least recently called d†ª4ªªUU…‚is~function to be at the bottom of the stack. Hence, moving down the stack moves you from a callee to its caller. For example, …ª@ªªUU@…‚umiif you were to type ‘down‚ after the previous example, you would see something like the following: O„ªVªªUU ††mindy> down t-ƒªbªªUU†† d@fp 0x10034078: error({ 0x1023fa91}, #[], #()) p‚ªnªªUU††n A/afs/cs.cmu.edu/project/gwydion/mindy/src/runtime/cond.dylan rªzªªUU††me132 signal(cond); €ª†ªªUU@††g mindy> odÜMad %%‰orui$HšÝN ila$HšÕÿ•**debuƒ%N*ªªªªUU ‡‚owŠThe first line tells you about the new current frame, which is a call to the error‚ function. For a function written in Dylan, as ©ªªªUU‡‚ t~opposed to a built-in function, the debugger tries to show the line of source code associated with the current frame. If the ¨ªªªUU@‡‚he_debugger could not find the source file, it still prints the line number from the source file. typ§ª4ªªUU ˆ‚erŒWhile moving down the stack, you might have expected to see a call to the signal‚ function before seeing a call to the error‚ 34¦ª@ªªUUˆ‚e-function. This does not happen because signal‚ tail calls invoke-debugger‚. When a function tail calls another function, the ¥ªLªªUU@ˆ‚on5callee reuses the current stack frame of the caller. ¤ªbªªUU(‰‚‹In addition to the ‘up‚ and ‘down‚ commands, you can move to a specified stack frame using the ‘ frame‚ command. The ebu£ªnªªUU‰‚Nvdebugger numbers stack frames starting at zero at the top of the stack. Currently, the debugger does not print frame ¢ªzªªUU‰‚fu}numbers when it prints frame information, so moving with the ‘frame‚ command is only useful as a rough thumb bar. The ¡ª†ªªUU@‰‚thMfollowing is an example of using this command to go to the top of the stack: o ªœªªUU Іl mindy> frame 0 r fŸª¨ªªUUІe.@fp 0x10034090: invoke-debugger({ 0x1023fa91}) avžª´ªªUU@Іa mindy> ªÊªªUU ‹‚n |If you use the ‘frame‚ command without supplying a frame number, the command prints the current frame's information. caœªÖªªUU@‹‚ugrThis is useful if the description of the current frame has scrolled off the screen, and you want to see it again. ›ªìªªUU(Œ‚ ‡You can view the entire stack by using the ‘ backtrace‚ command. The current frame stays the same, but the ‘backtrace‚ frašªøªªUU@Œ‚hevcommand always shows the entire stack from the top to the bottom. The following is example output from this command: ™ªªªUU †frmindy> backtrace u˜ªªªUU†pr@fp 0x10034090: invoke-debugger({ 0x1023fa91}) s —ª&ªªUU†ouBfp 0x10034078: error({ 0x1023fa91}, #[], #()) \ –ª2ªªUU†d M[/afs/cs.cmu.edu/project/gwydion/mindy/src/runtime/cond.dylan, line 132] •ª>ªªUU†fp 0x10034058: main() ”ªJªªUU@†r> mindy> av=UkTU ªªhŽ€a  Examining Variables ‘ª€ªªUU(‚se„The ‘ locals‚ command prints the value for every local variable in the function associated with the current frame. If you ugªŒªªUU@‚f †were at the frame for the error‚ call in the previous example, using the ‘locals‚ command would look like the following: ª¢ªªUU †ngmindy> locals Žª®ªªUU†henoise: #[] aysªºªªUU† &cond: { 0x1023fa91} ŒªÆªªUU@†‰ mindy> st‹ªÜªªUU(‘‚o ‘You can use the ‘ print‚ command to print a specific local variable. The following is an example of printing the cond‚ variable :ŠªèªªUU@‘‚ print cond ˆª ªªUU’†, #$0={ 0x1023fa91} [/‡ªªªUU@’†je mindy> dy†ª,ªªUU`“‚dyHThe ‘print‚ command can also print the value of global variables: …ªBªªUU ”†y>mindy> print size „ªNªªUU”†ri!$1={ size} ƒªZªªUU@”†om mindy> e ‚ªpªªUU`•‚caFor information on the labels the debugger assigns to values (that is, the ‘$N‚ identifications), see Section ŽDebugger Variables‚. prª†ªªUU –‚in|If the debugger does not find a local variable with the name you supplied, the debugger looks for a global variable by that no€ª’ªªUU–‚yname in the current library and module. For more information about libraries and modules, see Section ŽLibraries and hdÞMic &&Šwi i$HšßN aab$HšÔÿe˜nothing to do with legal Dylan syntax. For example, ‘foo:bar:baz‚ refers to the ‘baz‚ variable in the ‘bar‚ module of the ‘foo‚ V¦ª@ªªUU—‚†…library. There must not be any whitespace anywhere in the Židentifier‚. To refer to a variable in the current library but in a y¥ªLªªUU@—‚module that is not the current module, use the form ‘quux:splat‚, which refers to the ‘splat‚ variable in the ‘quux‚ module. ¤ªbªªUU`˜‚bFor more information about the ‘print‚ command, see Section ŽEvaluating Expressions‚. MUƒTU ªª`™€Libraries and Modules ¡ª˜ªªUU š‚ˆWhen evaluating expressions, the debugger uses the Žcurrent library‚ and Žcurrent module‚. When the debugger starts up, it no ª¤ªªUUš‚ar}guesses at what library and module to make current. If you want to access a global variable from another module or library, tŸª°ªªUUš‚rk‹you first make another module or library be the current one with the ‘ library‚ or ‘ module‚ command. If you invoke the ‘žª¼ªªUUš‘n ~library‚ command without an argument, it lists the available libraries and tells you which one is the current one. If you ªÈªªUUš‚ r~invoke the ‘library‚ command with an argument, the debugger makes that library be the current library. In the same way, œªÔªªUUš‚the ‘module‚ command either lists the modules of the current library, or it selects another module be the current module. i›ªàªªUU@š‚e AThe following are examples of using the ‘library‚ command: ršªöªªUU ›†˜mindy> library n e™ªªªUU›†onDylan-User ses˜ªªªUU›†ib Dylan —ªªªUU›†e .–ª&ªªUU›†r Current library is Dylan •ª2ªªUU›†hamindy> library dylan-user ”ª>ªªUU@›† t mindy> ba“ªTªªUU`œ‚ot~The following is an example of using the ‘module‚ command after having just switched to the ‘Dylan-user‚ library: ’ªjªªUU †momindy> module ‘ªvªªUU†‘Dylan-User ª‚ªªUU†ani File-Descriptors liªŽªªUU†lii Threads yoŽªšªªUU† ci Extensions ª¦ªªUU† ri System Œª²ªªUU†nd i Dylan n‹ª¾ªªUU†ke hŠªÊªªUU†cu%The current module is Dylan-User ‰ªÖªªUU@†N mindy> omˆªìªªUU ž‚th…The ‘i‚ in the second column indicates that those modules are being imported into the ‘Dylan-user‚ library as opposed to s‡ªøªªUUž‚liybeing defined there. The ‘module‚ command also indicates which modules are exported from the current library. For b†ªªªUU@ž‚|example, if you were to switch to the ‘Dylan‚ library, the ‘module‚ command would produce the following output: …ªªªUU Ÿ†mimindy> library dylan t„ª&ªªUUŸ† amindy> module ƒª2ªªUUŸ†coDylan-User ‚ª>ªªUUŸ†e x File-Descriptors ªJªªUUŸ†mox Threads e €ªVªªUUŸ†‘Builtin-Stuff ªbªªUUŸ†x Extensions lidàM''‹sis $HšáN $HšØÿd n''ŠªÊªª''ªªªªUUŸ†lax System U©ªªªUUŸ†y>x Dylan ¨ªªªUUŸ†i §ª*ªªUUŸ†mn%The current module is Dylan-User ¦ª6ªªUU@Ÿ† mindy> ‚¥ªLªªUU  ‚d ‘The ‘x‚ in the first column indicates that those modules are exported. There were no ‘x‚s in the listing of modules in the ‘Dylan-b¤ªXªªUU ‘Šuser‚ library because no modules are exported from the ‘Dylan-user‚ library. There were no ‘i‚s in the listing of modules £ªdªªUU@ ‚y>]for the ‘Dylan‚ library because the ‘Dylan‚ library does not import any modules. ¢ªzªªUU ¡‚e Whenever you change libraries with the ‘library‚ command, the debugger resets the current module to the ‘Dylan-user‚ ¡ª†ªªUU¡‚ns{module. This is because the debugger needs to make a module current in the new library, and every library has a ‘Dylan-  ª’ªªUU@¡‘šuser‚ module. IU³TU ªªh¢€ Evaluating Expressions ªªÈªªUU`£‚xpThe ‘print‚ command can evaluate simple expressions and print their results. The following is an example: leœªÞªªUU ¤†6mindy> print list(1, 2, 3) ªL›ªêªªUU¤†Th$2=#(1, 2, 3) šªöªªUU¤†te!mindy> print vector(4, 5, 6) T™ªªªUU¤†$3=#[4, 5, 6] ˜ªªªUU@¤†‘ mindy> ª—ª$ªªUU ¥‚šThe ‘print‚ command evaluates the variable ‘list‚ and then invokes that function with the arguments ‘1‚, ‘2‚, and ‘3‚. The –ª0ªªUU¥‚ |debugger labels values printed with a dollar sign and a number, and you can use these labels in later expressions. For more th•ª<ªªUU@¥‚‚>information on these, see Section ŽDebugger Variables‚. ”ªRªªUU`¦‚cThe expressions that the debugger accepts are limited. An expression can be one of the following: , a“ªhªªUU`§ƒasOne of the following literals: š’ªwªªUU`¨ƒ decimal number (‘47ƒ) ua‘ª†ªªUU`©ƒkeyword (‘foo:ƒ) ª•ªªUU`ªƒd string (‘"foo"ƒ) ssiª¤ªªUU`«‘r #t ts.Žª³ªªUU`¬‘an#f pleªÂªªUU`­ƒ¤A variable name. iŒªÑªªUU`®ƒL/A debugger variable (for example, ‘$5ƒ). U‹ªàªªUU ¯ƒy>eA function call (for example, ‘foo(a, b)ƒ and ‘bar(c, quux: 3)ƒ). Note that dot notation ŠªìªªUU@¯ƒThM(‘object.slotƒ) and infix operators (‘x + yƒ) are not supported. a‰ªûªªUU °ƒe oThe address, in hexidecimal (C format, not Dylan), of a valid dylan object (for example, ‘0x102050b1ƒ). ollˆªªªUU@°ƒerVNote: use this feature with care, as a mistyped address can cause Mindy to dump core. ‡ªªªUU`±‚, [If the expression results in multiple values, all the values are printed on a single line: er †ª3ªªUU ²†d.!mindy> print values(1, 2, 3) o…ª?ªªUU@²†$4=1, $5=2, $6=3 e„ªUªªUU ³‚s:ƒIf an error occurs while the debugger is evaluating the expression, it prints the error message, aborts the ‘print‚ command, (ƒªaªªUU@³‚¤Tand returns to the debugger prompt. The following is an example of this situation: amdâ Ml(f((Œà$Hšã N  p, $HšÓÿ{,,Note tha( ,ªªªªUU ´†omindy> print error("oops") rs ©ªªªUU´†e invocation failed: U¨ªªªUU´†es oops ima§ª*ªªUU@´†yl mindy> d ¦ª@ªªUU(µ‚ex‹The ‘ call‚ command is like the ‘print‚ command, but the ‘call‚ command does not handle errors by aborting. When you ª¥ªLªªUUµ‚If€use the ‘call‚ command, and the expression causes an error, the debugger returns to its prompt, but any stack frames that v¤ªXªªUUµ‚?„were created due to the ‘call‚ command are now visible for inspection. The following is an example of using the ‘call‚ ri£ªdªªUU@µ‚ag command: h¢ªzªªUU ¶†mmmindy> call error("oops") ¡ª†ªªUU¶†eb e ª’ªªUU¶†lo oops eŸªžªªUU¶†ua nžªªªªUU¶†thread [0] D main lª¶ªªUU¶†@fp 0x100341f4: invoke-debugger({ 0x102456b1}) $œªÂªªUU@¶† mindy> ›ªØªªUU`·‚eThe ‘print‚ and ‘call‚ commands can also evaluate multiple, comma-separated expressions: nšªîªªUU ¸†mindy> print 1, 2, 3 ™ªúªªUU¸† $7=1 ˜ªªªUU¸† $8=2 x—ªªªUU¸† $9=3 i–ªªªUU@¸†nt mindy> bu?U?TU ªªh¹€ c Debugger Variables ror“ªTªªUU º‚enThe ‘print‚ or ‘call‚ commands label every value printed, and these labels identify Ždebugger variables‚. You can use these fr’ª`ªªUU@º‚fidentifers in later expressions to refer to previously computed values. The following is an example: ‘ªvªªUU(»† u#† mindy> p list(1, 2, 3) µª‚ªªUU»†$4=#(1, 2, 3) ªŽªªUU»†r(mindy> p second($4) ebŽªšªªUU»†¶ $5=2 oª¦ªªUU@»†¶ mindy> Œª¼ªªUU(¼‚thƒThe notation ‘ $-N‚ provides a dynamic alternative to identifying debugger variables. This notation refers to previously mi‹ªÈªªUU¼‚…printed values by using ‘N‚ as a count from the most recently printed value to the least recently printed. The counting begins ŠªÔªªUU@¼‚2,at one. ‰ªêªªUU ½†$7 mindy> print a:, b:, c:, d: xˆªöªªUU½† $12=a ‡ªªªUU½†nt $13=b †ªªªUU½†¹ $14=c …ªªªUU½†or $15=d „ª&ªªUU½†pr$mindy> print $-1, $-2, $-3, $-4 eƒª2ªªUU½†, $16=d ‚ª>ªªUU½†de $17=c ªJªªUU½† u $18=b €ªVªªUU½† $19=a ªbªªUU@½†on mindy> pr~ªxªªUUh¾‚va^You can use ‘ $‚ as a shorthand for ‘$-1‚, and ‘ $$‚ for ‘$-2‚: dä M)) son$Hšå N  $HšÑÿ‰y>..ƒThe no)$.ªªªªUU ¿†almindy> p 2 tif©ªªªUU¿†ab $20=2 ¨ªªªUU¿†prmindy> p list($, 4) ¼§ª*ªªUU¿†es$21=#(2, 4)  ¦ª6ªªUU¿†e mindy> p list($$, 6) ¥ªBªªUU¿†tl$22=#(2, 6) nt¤ªNªªUU@¿† mindy> at£ªdªªUU À‚|Mindy keeps references to all debugger variables to prevent them from being garbage collected. If you no longer care about ¹¢ªpªªUUHÀ‚cpreviously printed values, you might want to use the ‘ flush‚ command to get rid of them: , ¡ª†ªªUU Á†mindy> flush 1 ª’ªªUUÁ†½$Flushed all debugger variables. ŸªžªªUUÁ†mindy> p $0 y>žªªªªUUÁ†¾invocation failed: $ª¶ªªUUÁ† fNo debug variable $0 œªÂªªUUÁ†mindy> p list(a:, b:, c:) ›ªÎªªUUÁ†$0=#(a, b, c) šªÚªªUU@Á†H mindy> ™ªðªªUU(‚ ’You can use ‘ $aN‚ notation to refer to the arguments passed to the function call associated with the current stack frame. ‘N‚ is ˜ªüªªUU@‚Gthe argument number, counting from zero. The following is an example:  —ªªªUU Æe mindy> frame (–ªªªUUÆ@fp 0x10034078: error({ 0x1023fa91}, #[], #()) d•ª*ªªUUÆMiA/afs/cs.cmu.edu/project/gwydion/mindy/src/runtime/cond.dylan ”ª6ªªUUÆec132 signal(cond); “ªBªªUUÆmindy> p $a0 y’ªNªªUUÆou#$1={ 0x1023fa91} ‚‘ªZªªUUÆd mindy> p $a1 ªfªªUUÆmi $2=#[] ª’ªrªªUUÆmindy> p $a2 gŽª~ªªUUÆž $3=#() ªŠªªUU@Æy> mindy> ÁŒª ªªUU Ä‚on‚The ‘$aN‚ notation does not identify a debugger variable, and the debugger does not have to create storage for these values ‹ª¬ªªUU@Ä‚) pbecause they are already stored on the call stack. The ‘flush‚ command has no effect on argument values. um4UÍTU ªªhÅ€ f Restarts and Returning theˆªâªªUU Æ‚mezThis section discusses invoking Dylan restart handlers and returning values for conditions whose recovery protocols allow ‡ªîªªUU@Æ‚y>Wreturning. If you do not know what these are, see the ŽDylan Reference Manual‚. #()†ªªªUU Ç‚ÃuThe debugger has commands that allow you to try to continue executing your program. The most common way to continue …ªªªUUÇ‚„execution is to invoke a Dylan restart. To either list the available restarts or invoke a restart, you use the ‘ restart‚ ĪªªUU@Ç‚’ command: ƒª2ªªUU Ȇy>(mindy> call cerror("go on", "oops") ‚ª>ªªUUȆy> ªJªªUUȆ oops n€ªVªªUUȆno iªbªªUUȆfythread [0] D main th~ªnªªUUȆ@fp 0x1003428c: invoke-debugger({ 0x10245361}) us}ªzªªUUȆ smindy> restart ck.|ª†ªªUUȆ (0 [{class }]: go on umdæ Mrng**ŽTh s$HšçN  drs$HšÐÿ‹fo//ery prot*î/ªªªªUUȆg.'1 [{class }]: Blow off call the©ªªªUUȆcemindy> restart 0 ¨ªªªUUȆde $0=#f §ª*ªªUUȆ y@fp 0x10034090: invoke-debugger({ 0x1023fa91}) t¦ª6ªªUU@Ȇ mindy> ex¥ªLªªUU É‚keIn this example, the ‘restart‚ command lists two restarts. The cerror‚ function establishes the ‘"go on"‚ restart (numbered 2¤ªXªªUUÉ‚Œ0). The ‘call‚ command establishes the ‘"Blow off call"‚ restart (numberd 1). The ‘restart 0‚ command caused cerror £ªdªªUU@É‚ai>to return ‘#f‚, which the ‘call‚ command printed. ¢ªzªªUUhÊ‚45ŒThe ‘ abort‚ command invokes the first restart that handles ‚ restarts. The following is an example of this command: M¡ªªªUU ˆngmindy> call error("oops")  ªœªªUUˆ Ÿª¨ªªUUˆ d oops žª´ªªUUˆ ªÀªªUUˆy thread [0] D main /œªÌªªUUˆg.@fp 0x100341fc: invoke-debugger({ 0x10241d49}) ›ªØªªUUˆ mindy> abort ešªäªªUUˆ@fp 0x10034090: invoke-debugger({ 0x1023fa91}) x1™ªðªªUU@ˆ mindy> ˜ªªªUU Ì‚~If Mindy entered the debugger due to a condition that allows returning as part of its recovery protocol, then you can use the —ªªªUUÌ‘t ˆreturn‚ command. For example, consider an ‚ condition that is a subclass of ‚ and that allows ar–ªªªUU@Ì‚uszreturning as part of its recovery protocol. The following example shows returning from the signalling of this condition: •ª4ªªUU ͆ 0mindy> call signal(make()) <”ª@ªªUU͆s. e“ªLªªUU͆xa#{ 0x10247759} Ë’ªXªªUU͆al r‘ªdªªUU͆thread [0] D main ªpªªUU͆ Cfp 0x100341d4: invoke-debugger({ 0x10247759}) /ª|ªªUU͆g.mindy> restart invŽªˆªªUU͆pl'0 [{class }]: Blow off call  ª”ªªUU͆ e Œª ªªUU͆Returning is allowed: ‹ª¬ªªUU͆r>ignore it. Šª¸ªªUU͆mindy> return ‰ªÄªªUU͆in $0=#f ˆªÐªªUU͆ a@fp 0x10034090: invoke-debugger({ 0x10244831}) t‡ªÜªªUU@͆e mindy> Ì0UýTU ªªh΀om% Interrupting and Single Stepping n„ªªªUU Ï‚co|Sometimes it is useful to interrupt your program to see where it is currently executing. Consider the following program as olƒªªªUU@Ï‚d an example: ur‚ª4ªªUU Іalmodule: Dylan-User ª4ª@ªªUUІ i€ªLªªUUІak%define method main (#rest noise) ªXªªUUІfoo(#t); gno~ªdªªUUІ47 end; }ªpªªUUІ r |ª|ªªUUІdefine method foo (x) {ªˆªªUUІ if (x) :dèM7})++mi$HšéN cl$HšÓÿ{f ,,† e +Í,ªªªªUUІowfoo(#f); ©ªªªUUІ i else U¨ªªªUUІy>foo(#t); §ª*ªªUUІf end; ͦª6ªªUU@І34 end; -¥ªLªªUU`Ñ‚erfIf you were to run this program and then interrupt it, you would see output similar to the following: ¤ªbªªUU Ò†^C co£ªnªªUUÒ†usInterrupted yo¢ªzªªUUÒ†whthread [0] R main in¡ª†ªªUUÒ†ol fp 0x10034060: foo(#f, #()) Ï ª’ªªUUÒ†urfoo.dylan ŸªžªªUUÒ†Dy8 if (x) UžªªªªUU@Ò† mindy> ªÀªªUU Ó‚in|After interrupting the program you have the full debugger at your disposal, as if an error had occurred. Additionally, you МªÌªªUUHÓ‚et>can use the ‘ continue‚ command to resume execution: ›ªâªªUU`Ô†mindy> continue +šªøªªUU(Õ‚mi|You can also use the ‘ step‚ command to advance line by line through your program. When stepping, if the debugger ,™ªªªUU@Õ‚owqencounters a function call, it descends into that function and steps line by line. The following is an example: ˜ªªªUU Ö†6^C Зª&ªªUUÖ†LInterrupted If–ª2ªªUUÖ†hithread [0] R main pt•ª>ªªUUÖ† o fp 0x10034060: foo(#f, #()) b”ªJªªUUÖ†foo.dylan “ªVªªUUÖ†In8 if (x) U’ªbªªUUÖ†admindy> step †‘ªnªªUUÖ†foo.dylan ªzªªUUÖ†d11 foo(#t) foª†ªªUUÖ†mindy> step Žª’ªªUUÖ†foo.dylan ªžªªUUÖ†8 if (x) nteŒªªªªUUÖ†ammindy> step d‹ª¶ªªUUÖ†spfoo.dylan ŠªÂªªUUÖ† 9 foo(#f) ̉ªÎªªUUÖ†camindy> step coˆªÚªªUUÖ† tfoo.dylan ‡ªæªªUUÖ†Ô8 if (x) inu†ªòªªUU@Ö†Õ mindy> al…ªªªUU`ׂs†The ‘next‚ command is the same as the ‘step‚ command, but the next command tries to avoid descending into function calls. .U)TU ªª`Ø€nd Breakpoints nc‚ª>ªªUU Ù‚e †The easiest way to insert a breakpoint into a Mindy program is to insert a call to break‚ into the program text, recompile the ªJªªUU@Ù‚aiqprogram, and rerun it.break‚ is exported from the ‘Extensions‚ module of the ‘Dylan‚ library. n€ª`ªªUU v‚x)wThe debugger also has a primitive facility for setting breakpoints in methods written in Dylan, as opposed to built-in foªlªªUUv‚‚methods. The ‘ breakpoint‚ command takes two arguments, a reference to a method in which to install the breakpoint, and ~ªxªªUU@v‚bthe line number at which to install the breakpoint. For example, consider the following program: dêM æ,, if$HšëN l$HšÔÿq,,e same a, ,ªªªªUU Ú†ommodule: dylan-user ndi©ªªªUUÚ†al ¨ªªªUUÚ†nddefine constant foo = §ª*ªªUUÚ†esmethod () br¦ª6ªªUUÚ†nd"puts("this is a test\n"); ¥ªBªªUUÚ†e #puts("of breakpoints.\n"); U¤ªNªªUUÚ† a #f; £ªZªªUU@Ú†te end; ‘E¢ªpªªUU`Û‚lezIf you were to put a breakpoint at line 6 (the second ‘puts‚), Mindy would produce output similar to the following: ¡ª†ªªUU ܆ Dmindy> break foo, 6 in ª’ªªUU܆vCbreakpoint 1 installed in {anonymous 0x10243d31\ s, ŸªžªªUU܆et#()} at line 6 (pc 47) reažªªªªUU܆mindy> call foo() ª¶ªªUU܆inthis is a test FœªÂªªUU܆erBreakpoint ogr›ªÎªªUU܆thread [0] R main  šªÚªªUU܆Afp 0x100341dc: {anonymous 0x10243d31 #()}(#()) ™ªæªªUU܆foo.dylan ˜ªòªªUU܆'6 puts("of breakpoints.\n"); —ªþªªUU@܆er mindy> –ªªªUU`Ý‚‰The ‘continue‚ and ‘step‚ commands can be used to continue execution (see Section ŽInterrupting and Single Stepping‚): •ª*ªªUU Þ†mindy> step ak”ª6ªªUUÞ†Nof breakpoints. “ªBªªUUÞ†foo.dylan ’ªNªªUUÞ†7 #f; er‘ªZªªUUÞ†in mindy> c eªfªªUUÞ†‚ $0=#f ªrªªUUÞ†si@fp 0x10034090: invoke-debugger({ 0x10243e49}) , Žª~ªªUU@Þ†Ü mindy> kpª”ªªUU ß‚n {The ‘breakpoint‚ command evaluates its first argument, so you can use an arbitrary expression for the function. For calŒª ªªUUß‚€example, you could use find-method‚ to extract a specific method from a generic function and insert a breakpoint in that ‹ª¬ªªUU@ß‚x1method: anŠªÂªªUU à†od4mindy> br find-method(size, list()), 886 dy‰ªÎªªUUà†ÜGbreakpoint 1 installed in { size #({class
})}\ miˆªÚªªUUà†at line 886 (pc 35) ‡ªæªªUU@à† mindy> be †ªüªªUU`á‚xe\The ‘breakpoint‚ command with no arguments lists the currently installed breakpoints: y>…ªªªUU â†mindy> breakpoint „ªªªUUâ†id where ƒª*ªªUUâ†*1 pc 47 in { 0x10204ea9} ‚ª6ªªUU@↠e mindy> ÞªLªªUUhã‚rˆThe ‘ delete N‚ command removes a breakpoint, where ‘N‚ is the breakpoint ID reported in the ‘breakpoint‚ listing. n €ªbªªUU ä‚ntzSometimes the Mindy compiler has to split a single top level form into multiple methods. When this happens, the debugger ªnªªUU@ä‚ c[cannot always figure out where to insert your breakpoint. Consider the following program: a bdìMeod--‘mi$HšíN 8dy$HšÌÿ•44 in { break foo, 7 cª¶ªªUUç†guI{anonymous 0x10243f59 #()} does not span line number 7 bœªÂªªUU@ç† mindy> ›ªØªªUU( è‚€To insert a breakpoint into this method, you need to use the ‘ disassemble‚ command. It disassembles a method and all šªäªªUU@è‚4QMindy-generated methods that might be associated with that method. For example: ™ªúªªUU é†nemindy> disassemble foo 嘪ªªUUé† (*anonymous component, from "foo.dylan" —ªªªUU é†å5 block (exit) –ªªªUU é†347: b0 push function catch ªZ•ª*ªªUU é†O48: 21 push const(1) { 0x10205149} de”ª6ªªUU é† r249: b2 push function list “ªBªªUUé†of350: a3 push value So’ªNªªUU é†co:51: 91 call nargs = 1, for single ‘ªZªªUU é†(52: 0e push #() ¶ªfªªUU é†'53: 10 push #t } dªrªªUU é†nu(54: 06 make-method Žª~ªªUUé†455: 71 call nargs = 1, tail uªŠªªUU é†asF{ 0x10205149}, anonymous component, from "foo.dylan" Œª–ªªUU é†te5 block (exit) t‹ª¢ªªUU é†d.+51: 31 push arg(1) dy>Šª®ªªUU é†åO52: 20 push const(0) { 0x102050b1} 剪ºªªUU é†bl253: b1 push function list ˆªÆªªUUé†fu:54: 90 call nargs = 0, for single ‡ªÒªªUU é†t((55: 0e push #() 6†ªÞªªUU é†'56: 10 push #t n l…ªêªªUU é†é(57: 06 make-method va„ªöªªUU é†N-58: 60 pop local(0) aƒªªªUUé†or,6 puts("this is a test\n"); ‚ªªªUU é†#(259: b2 push function puts ªªªUU é†rG60: 23 push const(3) "this is a test\n" 逪&ªªUU é†71561: 81 00 call nargs = 1, for 0 ª2ªªUU é†-i-7 puts("of breakpoints.\n"); o~ª>ªªUU é†263: b2 push function puts }ªJªªUUé†51H64: 24 push const(4) "of breakpoints.\n" |ªVªªUU é†co565: 81 00 call nargs = 1, for 0 {ªbªªUU é†538 #f; zªnªªUU 醯'67: 11 push #f yªzªªUU é†0,*68: 02 return single xª†ªªUUé†pu wª’ªªUUé†A{ 0x102050b1}, exit component, from "foo.dylan" dîMova..’58$HšïN $HšÓÿ] ,,\n"); . é,ªªªªUUé† 5 block (exit) ©ªªªUUé†339: b0 push function apply is ¨ªªªUUé†&040: a1 push value throw §ª*ªªUUé† +41: 30 push arg(0) "of¦ª6ªªUUé† o+42: 32 push arg(2) ¥ªBªªUUé† p443: 73 call nargs = 3, tail pu¤ªNªªUU@é† mindy> \n£ªdªªUU ê‚é’As you can see, the function foo‚ has been split into three methods. The first one corresponds to the part of foo‚ that is outside ¢ªpªªUUê‚ „the block. The second method corresponds to the code inside the block. And the third one corresponds to the exit‚ function 05¡ª|ªªUUê‚restablished by the block. Look for the second method which spans line 7. The following shows how to install the  ªˆªªUU@ê‚ breakpoint: $ŸªžªªUU ë† mindy> br 0x10205149, 7 žªªªªUUë†Kbreakpoint 1 installed in { 0x10205149} at line 7 (pc 63) ª¶ªªUUë† mindy> call foo() œªÂªªUUë†this is a test a1›ªÎªªUUë† Breakpoint ª*šªÚªªUUë†thread [0] R main pu™ªæªªUUë†6Mfp 0x100341f8: {anonymous 0x10245f41 #({class })}\ ˜ªòªªUUë†73 ({ 0x10245f81}, #()) ai—ªþªªUUë†éfoo.dylan –ª ªªUUë†'7 puts("of breakpoints.\n"); f•ªªªUUë†li mindy> c t”ª"ªªUUë†neof breakpoints. rt“ª.ªªUUë†at $0=#f ’ª:ªªUUë† @fp 0x10034090: invoke-debugger({ 0x10244071}) b‘ªFªªUU@ë†rd mindy> ds:UgTU ªª`쀂Threads 05Žª|ªªUU í‚yNormally, there is only one thread of execution, in which case you won't need any of the commands in this section. When ªˆªªUUí‚kp‚you debug a multi-threaded program, these commands become very useful. The ‘ thread‚ command either lists the available Œª”ªªUU@í‚pcPthreads or switches between them, depending on how you invoke it. For example: i‹ªªªªUU î†<mindy> p spawn-thread(foo:, curry(break, "Thread foo")) adŠª¶ªªUUî†æ$0={ 0x10243f49} 4‰ªÂªªUUî†yt<mindy> p spawn-thread(bar:, curry(break, "Thread bar")) 73ˆªÎªªUUî†10$1={ 0x10246f19} ‡ªÚªªUUî†n mindy> thread †ªæªªUUî†("c [0] D main f…ªòªªUUî†li[1] R foo „ªþªªUUî†[2] R bar ƒª ªªUU@î†at mindy> :‚ª ªªUU In this example, the ‘thread‚ command lists three threads: the ‘main‚ (or original) thread and the two threads you just created. ª,ªªUUï‚, ‹The ‘c‚ in the first column indicates which thread the debugger is currently examining. The ‘]‚ indicates the thread ID for ug €ª8ªªUUï‚ro each thread. The ‘D‚ and ‘R‚ designations indicate the status of each thread. The ‘main‚, ‘foo‚, and ‘bar‚ labels are the debug-inªDªªUU@ï‚e <names passed as the first argument to spawn-thread‚. hr~ªZªªUU`ð‚ea2The different thread status codes are as follows: dðMmi//“cuy($HšñN 0$HšÔÿ•f1**mi/ æ*ªªªªUU ñ†] STATUS MEANING ªªUUñ† 8D current thread the debugger is examining ªªUUñ†:R running/runable mpl§ª*ªªUUñ†‚S suspended d¦ª6ªªUUñ† !B blocked on a lock r¥ªBªªUU@ñ†$W waiting for an event  ¤ªXªªUU ò‚n }Giving the ‘thread‚ command an argument causes the debugger to examine another thread. You can designate threads with o£ªdªªUU@ò‚e Heither its numeric ID or the debug-name passed to spawn-thread‚: Th¢ªzªªUU ó†‘mindy> thread foo ¡ª†ªªUUó†buthread [1] R foo na ª’ªªUUó†fiCfp 0x102550bc: {anonymous 0x102443d9 #({class <\ ferŸªžªªUUó†coCobject>})}({ 0x10244421}, #(), { 0x1024436\ žªªªªUUó†#9}, { 0x102441e1}) ª¶ªªUUó†$A/afs/cs.cmu.edu/project/gwydion/mindy/src/runtime/cond.dylan œªÂªªUUó†H212 init-arguments: list(format-string: "Continue from break")) ur›ªÎªªUUó†bumindy> thread 0 šªÚªªUUó†thread [0] D main le™ªæªªUUó†ñ@fp 0x10034090: invoke-debugger({ 0x1023fa91}) ˜ªòªªUU@ó† r mindy> ñ—ªªªUU(ô‚ zSometimes it is useful to temporarily disable some threads while debugging other threads. The ‘ !disable ‚ command disables (suspends) the indicated thread, and the ‘ "enable‚ command allows a thread to run again: •ª*ªªUU õ†mimindy> disable foo U”ª6ªªUUõ†ad[1] S 1 foo ’“ªBªªUUõ†mindy> enable foo ’ªNªªUUõ†0x[1] R foo <\‘ªZªªUU@õ†ó mindy> ectªpªªUU`ö‚24†In this example, the status of the ‘foo‚ thread changes from ‘R‚ (runnable) to ‘S‚ (suspended) when it is disabled. ª†ªªUU ÷‚io|If you repeatedly use the ‘disable‚ command on the same thread, then the ‘enable‚ command must be used the same urŽª’ªªUU÷‚bušnumber of times to before the thread's status changes to ‘R‚. The ‘1‚ after the ‘S‚ above is the number of times the thread ‘foo‚ ªžªªUU@÷‚óhas been disabled. ªŒª´ªªUU ø‚So‡When a thread is suspended, the ‘continue‚ and ‘step‚ commands do not advance the thread's execution. The ‘disable‚ u ‹ªÀªªUUø‚ma~and ‘enable‚ commands can help you find thread synchronization problems by allowing you to explicitly control when each ŠªÌªªUU@ø‚is thread runs. ‰ªâªªUU`ù‚~Invoking the ‘disable‚ or ‘enable‚ command with no argument affects the current thread the debugger is examining. ˆªøªªUU`ú‚IThe ‘kill ‚ command kills the indicated thread. m1UTU ªª`û€leInspect and Xinspect e…ª.ªªUU( ‚bl’The ‘ #inspect‚ and ‘ $xinspect‚ commands can be used to interactively examine an object and related objects. The ‘inspect‚ „ª:ªªUU  ‚÷‘command is a text-based interface to the Inspector facilities, while ‘xinspect‚ is a graphical interface. See ‚ 0the document ŽThe ƒªFªªUUL ŽGMindy Object Inspector‚ - for information on using the Inspector. s s,UgTU ªª` €coMiscellaneous Commands ‚ €ª|ªªUUhü‚vaUThe ‘ %help‚ command prints a one line summary of all the debugger commands. eª’ªªUU(ý‚he•The ‘ &quit‚ command causes Mindy to exit without executing any of the on-exit‚ hooks. If you want the on-exit‚ hooks to run, ndòMom00”ctth$HšóN ø$HšÔÿ++e>‚ c0 he+ªªªªUU@ý‚ Lyou should invoke the exit‚ function with the ‘print‚ command: ‚©ªªªUU`þ†pemindy> print exit() d ¨ª2ªªUU(ÿ‚xa…The ‘ 'tron‚ command turns on an internal trace facility that prints the arguments and results for every function call. The t§ª>ªªUUHÿ‘sp& (troff‚ command turns this off. ¦ªTªªUUh‚ }The ‘ )error‚ command repeats the error message for the condition that caused this thread to drop into the debugger. i¥ªjªªUUh‚ds:The ‘ *gc‚ command invokes the garbage collector. ¤ª€ªªUU(‚ry†The ‘ +describe‚ command takes an expression as an argument and evaluates it. If the result is an instance of a class defined £ªŒªªUU‚. }in Dylan, as opposed to a built-in class, then the debugger identifies the class, prints the slot names, and prints the slot h¢ª˜ªªUU‚„values. If the result of the expression is an instance of a built-in class, then the debugger prints the value and its class. The sh¡ª¤ªªUU‘{describe‚ command does not create or assign to debugger variables, but you can use debugger variables in the expression  ª°ªªUU@‚maQgiven to the command. The following examples show the ‘describe‚ command: eŸªÆªªUU † Tmindy> describe make žªÒªªUU†d K{ make} is an instance of {class } he ªÞªªUU† oœªêªªUU†d mindy> describe "Testing" ›ªöªªUU†6"Testing" is an instance of {class } šªªªUU† ™ªªªUU† "mindy> describe make(
) ˜ªªªUU†enI{ 0x10245d79} is an instance of {class } —ª&ªªUU†yl!and has the following slots: –ª2ªªUU†id3merged-hash-state-slot: {permanent hash state} th•ª>ªªUU†shrink-to-slot: 100 re”ªJªªUU†sishrink-when-slot: 10 t“ªVªªUU†e expand-to-slot: 300 an’ªbªªUU†shexpand-when-slot: 200 ‘ªnªªUU†s Lbucket-states-slot: #[{permanent hash state}, {permanent hash state}, \ iªzªªUU†L{permanent hash state}, {permanent hash state}, {permanent hash state}] ‘ª†ªªUU†anbucket-count-slot: 5 Žª’ªªUU†ma2bucket-array-slot: #[#(), #(), #(), #(), #()] ªžªªUU@† oitem-count-slot: 0 n>}6U¿TU ªª`€Copyright and Terms Of Use ŠªÔªªUU`‚"TWCopyright (c) 1994, 1995, 1996, 1997 Carnegie Mellon University All rights reserved. ª‰ªêªªUU ‚uUse and copying of this software and preparation of derivative works based on this software are permitted, including eˆªöªªUU@‚-tEcommercial use, provided that the following conditions are observed: ‡ª ªªUU ƒmehThis copyright notice must be retained in full on any copies and on appropriate parts of any derivative †ªªªUU@ƒnkworks. t: …ª'ªªUU ƒeDocumentation (paper or online) accompanying any system that incorporates this software, or any part „ª3ªªUU@ƒot_of it, must acknowledge the contribution of the Gwydion Project at Carnegie Mellon University. stƒªIªªUU  ‚asThis software is made available Žas is‚. Neither the authors nor Carnegie Mellon University make any warranty about the #[#‚ªUªªUU@ ‚ #Csoftware, its performance, or its conformity to any specification. ªkªªUU  ‚rmcBug reports, questions, comments, and suggestions should be sent by E-mail to the Internet address ri€ªwªªUU@ ‘gwydionbugs@cs.cmu.edu‚. ªªªUU` ‚wa aH$Ô Né isH$Ô lðÿëëÑmerHw­ìÔ NétnsHw­ìÔ lðÿììÒustH$Ô ‘NépopH$Ô lðÿííÓt: Hw­ìÔ ’NéoonHw­ìÔ lðÿîîÔ, oHHÔˆ“N ésacHHÔˆlðÿïïÕ MeHHÔˆ” Néh sHHÔˆlðÿððÖ nolúÿ"Ô •!N"ên alúÿ"Ô lðÿññ×or HúÿûÔ –"N!#êHúÿûÔ lðÿòòØns $Hš—#N"êdss$HšlðÿóóÙª$Hš˜$N$Hšlðÿ%Úÿ$Hš™%N$Hšlðÿ$&Úÿ$Hšš&N$Hšlðÿ%'Úÿ$Hš›'N$Hšlðÿ&(Úÿ$Hšœ(N  $Hšlðÿ')  Úÿ$Hš)N $Hšlðÿ(*  Úÿ$Hšž*N "$Hšlðÿ)+Úÿ$HšŸ+N#$Hšlðÿ*,Ú$Hš ,N$Hšlðÿ+-Úÿ$Hš¡-N$Hšlðÿ,.Úÿ$Hš¢.N$Hšlðÿ-/Úÿ$Hš£/N$Hšlðÿ.0Úÿ$Hš¤0N$Hšlðÿ/Úÿ…¥•d…éLeftd†êRightd‡ô) Referencedˆ‰d‰ˆŠldЉ‹ d‹ŠŒNdŒ‹ šdŒŽ +dŽ dŽd‘d ‘’Nd ’‘“Hšd “’”-d ”“šE#($0fæ™Q±%  1Heading 1Heading Rule. FirstBody. $$fæ™SE ±*$ 1Step Step Number S:.\tStep. fæ™ ±% 2Heading .. . dff2ff233À@ ±%H  Ø  h ° Argument.  À@ ±%H  Ø   h ° Body. 33+33$fæ™B ±%ul33+n Bullet Bullet SymbolB:¥\t. ™™]™™K$fæ™B ±% ™™]m Bullet2. Bullet SymbolB:¥\t. ffVffD$fæ™B ±%.\t. 33 À@) ±%33 Endnote1.\t. 333333 À@*  ±%He i Ø  h ° Excerpt. ff2™™K33À@+ ±%°H I Ø   h ° Extra Key Arg. ff2ff2 À@, ±% H2  Ø  h ° Function Body. À@-P ±% Function HeadDitem. HHH fæ™.T±% HeadingBody. HHHfæ™/D ±%  HeadingSub. $$fæ™0S ±*$ Step Step Number S:.\t. À@1 ±H  Ø  h ° Verbatim. fæ™2y ±* CellHeading. fæ™3y ±*CellBody. fæ™4|T ±*  TableTitleT:Table : . À@5‚ ±%H  Ø  h ° Body. À@6‚ ±%ê Ô Body. À@7‚ ±%Body. HHH fæ™8€T±% HeadingBody. HHHÀ@9„ ±%H  Ø  h ° Copyright. $0fæ™:€Q±%  1Heading 1Heading Rule. FirstBody. À@;† ±H  Ø  h ° Verbatim. 33+33$fæ™<B ±%33+ yBullet Bullet SymbolB:¥\t. 33+33$ fæ™=B ±%. 33+ Bullet Bullet SymbolB:¥\t. ffVffD$fæ™>B ±%ffV Bulletsubi Bullet SymbolB:¥\t. ffVffD$fæ™?B ±1HffV Bulletsubl Bullet SymboldB:¥\t. À@@‚ ±%H  Ø  h °e tBody. y™z$ ÜÚúy±* ÞÕ)|±*   ã÷~±%Argument  ó÷±  Bullet Symbol|©Õ$€±%  ý`)‚±% ý`)ƒ±% }’å „±% Fm_i†±  ã÷‡±Computer  ã÷ˆ±%Emphasis €‰±EquationVariables  ó÷б  Step Number   ‹± Subscriptull   Œ± Superscript  ã÷±% Variable }’å Ž±%Emphasis |©Õ$±% Variable f`ø±  Bullet SymbolÚú Fm_i‘±ComputerM]RMNt€O±€P±Q±AQF€A±ThinB±Medium €C±`)DoubleD±Thick@E± Very Thin¥µ¥_i ¦AAAAAAAAAC4±±±H232H232H232H232H232Format A §ABAAAAAB4±±±H232H232sH232H232H232Format B   ³Comment™©œ™5ýþ š6ÿ  ¸›e0 - Õ$|œ8/ . ±Á¹led ±`øBlack!T²boWhiteddA³Reddd´Greendd µBlued¶Cyan±d·Magentad ¸±YellowW.Palatino.R.700 Palatino-Bold W.Times.R.400 Times-RomanW.Palatino.R.400Palatino-RomanW.Palatino.I.400Palatino-ItalicW.Courier.R.400Courier W.Times.R.700 Times-BoldW.Courier.R.700 Courier-BoldW.Helvetica.R.700Helvetica-Bold7Courier Helvetica%Palatino*Times Regular Regular BoldItalicRegularŽ†Ë€>Ÿ˜ísõ÷¢¼Õ›T+\-½¦/ÃŒJ—yÛ:Òk•¢§‚Ê3âÐ\‹^‹¼-Àû”º­ᨱœò„„®ð©âçû-ŸN—Yöh&&bËýKâÌ=:+…ñô ‹ÓáF&Ψ.nr#fõ¨õ·Š"kž€O.'8®øHcù÷J1¿ß6™™ªÁ³æÐÁN'Ïz†XS®,Ë´‡"ßS • þ²ç¨† UˆÔå27ò³áD[2Ò ¥‰f3ÉéF]ž±9!ôUfŠb8ecŒH>—ò06q¿b®›ä>žÌÙ2y5‡50¢VQ_‡–/Ø,ï×Jæ5Í+ay¢