ToCedarImplementorsDateOctober20,1983FromJohnMaxwellLocationPARC/CSLSubjectTheCedarSpyDocumentationfortheCedarSpyAttributes:userinterface,Viewers,sub-classing,menusDraft:[Indigo]Documentation>SpyDoc.tiogaLasteditedby:JohnMaxwellonDecember12,198311:37amAbstract:TheCedarSpyisatoolformonitoringtheperformanceofprograms.Itcanmeasureseveraldifferentaspectsofperformance:CPUusage,pagefaults,allocations,orprocesstime.HopefullyaprogrammerwillfindthattheSpyistheonlytoolheneedsforthebulkofhisperformanceanalysis.XEROXXeroxCorporationPaloAltoResearchCenter3333CoyoteHillRoadPaloAlto,California94304DRAFTForInternalXeroxUseOnlyDRAFTpî ìï_/qî1ï_/pî(îï_/qî3Cï_/î8‘î:Îpî ìï[Sqî1ï[Sî™pî(îï[Sqî3Cï[Srî7Ôï[Sî8Òï[Spî ìïWwqî1ïWwî î!sî ìïO3 îzî#î(7î0ópî ìïH• rî¬ïH•î¦ î¤î 2 î( pî ìïFîrî¬ïFîð)pî ìïEGî Vî¯rîmïEGîÕî"nî$tî+î-Uî0›î4Ztî ®ïBÌqîÀïBÌî¨ïBÌî¹îñîÔî`îªî"—î$õ î,1î.± î6Õî8®î?ÞîAuîD!î ìïA$îqî î©îW î"Éî&0î*Gî-ƒî1� î8 î:Yî?!îC î ìï?}î  îøî£î’î`î¿î ‚î!îî$Mî'gî*4î,%î0î2Cî4¢î7Óî9Œî;¿ îCÃuî ìïŽvî(îïŽî-0 î(îïçî,Iî/Xî5ùî(îï@î,‹î1”î4î(îï ˜î,Iî/» î6gwî ìï Jî�îCîYî òî'žî,0î1‰î4.xTVm$-2Introduction.TheCedarSpyisdesignedtobethemaintoolforanalyzingtheperformanceofprogramsinCedar.Itconsistsofofanarrayofmeansforviewingtheexecutionofaprogramallpresentedinasingle,consistentform.WiththeSpy,theprogrammercanseewhichproceduresareconsumingCPUcycles,whicharecausingpagefaults,whichareusingtheallocator,orwhicharecallingaparticularprocedure.Whentheprogrammernarrowshisfocustojustoneprocess,theSpywilltellhimwherethatprocessisspendingitstime,whereitiswaitingonpagefaults,whereitiswaitingonmonitorlocks,whereitiswaitingonconditionvariables,andwhenitispreemptedbyotherprocesses.Inaddition,theprogrammercanmeasurepreciselywhatheisinterestedinsincetheSpyprovidesafacilityforsettingbreakpointstodeterminewheretheSpyshouldstartandstopitsmeasurements.HopefullyaprogrammerwillfindthattheSpyistheonlytoolheneedsforthebulkofhisperformanceanalysis.ThemainparadigmoftheSpyistorecordthecallstackofaninterestingprocess.Thedefinitionof"interesting"variesaccordingtowhattheSpyismeasuring.IftheSpyismeasuringpagefaults,itrecordsthestackoftheprocessthatjustpagefaulted.IftheSpyismeasuringCPUusage,itrecordsthestackofthetop-mostactiveprocessatregularintervals.Theonlythingsrecordedaretheproceduresinthecallstack;parametersandlocalvariablesarenotrecorded.AllofthefunctionalityprovidedbytheSpyviewercanalsobeaccessedprogrammaticallythroughtheinterface"SpyClient".Fordocumentation,seethatinterface.ObtainingtheSpy.TheSpycanbeobtainedbybringingovertheappropriatefilesandloading"Spy.bcd".Tobringoverthefiles,typeBringover/a/p[Indigo]Top>Spy.dftotheuserexecutive.Typing"RunSpy"willcauseaSpyviewertoappearatthebottomofthescreen.(TheSpyviewerlookslikeamagnifyingglasslayingontopoftheword"Spy").IfyoudestroytheSpyviewer,youcanobtainanotheronebytyping"Spy"totheUserExec.PreparingtheSpyforitsMission.TheSpyprovidestheprogrammerwithanumberofparameterstospecifywhatitwillmeasure.TheseparametersallowtheprogrammertotailortheSpysomewhattohisparticularneeds.Theparametersarechangedbyclickingthemwiththemouse;repeatedclickingswillcycleaparameterthroughallofthepossiblevalues.Mostpeoplewillfindthatthedefaultparametersprovideagoodstartingpoint.Watching:{CPU,processnumber,breakProcess,pagefaults,wordsAllocated,allocations,userbreaks}The"Watching"parameterdetermineswhattheSpyshouldmeasure.*If"CPU"ischosen,theSpywillwakeup80timesasecond(10onaDolphin)andrecordthecallstackoftheprocessthatiscurrentlyrunning.*If"processnumber:"ischosen,theSpywillmonitortheprocessgivenbytheuser.Itwillkeeptrackofwhattheprocesswasdoing:whetheritwascurrentlyrunning,currentlypre-emptedbyanotherprocess,waitingonaconditionvariable,waitingonamonitorlock,orwaitingonapagefault.*If"breakProcess"ischosen,theSpywillmonitorthefirstprocessthatcausesastartbreak.Thisisusefulwhentheuserdoesn'tknowwhichprocessisgoingtorun.Otherwise,thisisjustlikethepreviousvîHDïg/xî ìï^õ qî ®ï[¦îxî‚î7î•îCîäî Çî#î&ˆî)Gî+vî1†î3Ø î;Îî=zîCîEî ìïYÿî ‡îªî†îcîvî"îþî eî"Æî'þî*�î0Úî2¶î4î9¶î;ÉîB-îCþîEKî ìïXX îQî°î<îªîÓî A î(2î*Ëî--î1I î8^î:ÀîA¿îE?î ìïV°î ÷îHî0îtîŠî •î"æî&�î(ê î.Úî0›î4§î6øî;Zî<� îB´ î ìïU îîb îCîxîªî#Hî$öî'–î*Aî/lî1Ëî4Œî77î9•îšîB‡îF¶îH#î ìïQºî£îŒî� î…î î"¹î#òî%Aî, î-êî1m î8 î9¿î?jîA­ î ìïPî rîÛî‡îßîËî1 î$xî&!î)�î+éî.§î41î5Vî9×î<î@q îGàî ìïNlî�îÅîCî%îÀî!ïî$Æî'ßî)Ø î3éî:Œî;Ô îCÖîF î ìïLÄî ºîîÜîHî¨îÁîŽîî!`î#�î%ýî)-î*æî- î5î ®ïJIîŽîî;îüîdî /î!£î#Zî'±î*î,¬î0(î1éî3â î:£î@dîCD î ìïH¢î µ îàîÛî,îêî#Xî%Çî(šî* î1µî3Hî5·î8Šî:î@¹îDîH9î ìïFûîÓîEîËî–îîïî Ðî#„î&Ýî,‡î.î0Žî3cî4âî;—î?îCRîD»î ìïESî =î¡îKîœîTî2î!÷î#�î($ î.gî10î4;î8Eî=òî@7îBˆ î ìïC¬î šî úî„îq îwî/î!uî'0î)ƒî+øî ®ïA1îîÂî& î/î!î#î%hî(/î,˜î/(î1ùî3îî9lîDWî ìï?Šî Kîñ î�î: î&ùî)Lî, xî ìï:“îŸîwqî ®ï7Eî”îeîþîýî¼îÆî$Xî'€î)î î1[î4Wî7î< îC°îEåî ìï5�î îeî«î¬ï2Nî îæîâî ìï/î “î ëîÝ î³îhî ,î#˜î&;î)éî+ î-Çî2$î3Ëî8Jî9Ûî<3î@õîB¦îDþî ìï-Xî 6îñîMîãî‡î© î"Óî&î* î,î.Œî0>î2•î6î;î<ùî?¨îDtîFÌî ìï+±î©î`îëî0î;îæî!âî&'î*Jî+øî.Xxî ìï&»îwîOî�î2î†qî ®ï#lî¥î‡î5î´ î"¶î%ðî'9î,…î.] î5ƒî7Qî< î?‰î@ÿîCÉî ìï!Åî5 î‚îrî î$Bî&8î*î,Ãî/Íî6€î8uî:ï îAlîF·î ìï  î(î²îWîˆî Ôî$“î'ãî*yî/‚î5Sî;#î>îA­îC î ìïvîAîOî%î¢îî Gî#íî(†î+Oî.Zî1Fî3Ãî8‰ î?­îDÕîFî ìïÏîÖyî ìï€î•îîÂîÿ î'} î.9î7á î>öîAÛqî 2ï1î î î" î%)î(†î*åî-¨î2$î ïŠî =î ÅîŸîîîhî1î ãî$qî&Šî(vî,&î-Vî1ïî4Tî6`î7‘î=Šî@HîDžîGî ìïâî _îîwîKîî…î bî ï;î `î õî‹îCîŠî î!î#wî&Lî) î.]î0Ïî5µî9|î;Šî=üîAöîC€îF=î ìï“î ]îîoîÌîžîHî  î%ìî'@î)éî/Äî5Qî;, îBŠîD„î ìï ìîîëîòîî:î"Éî'�î)£î*Íî0î3_î5#î9÷î;ýî='î@mî ÿï Eî 8î ¿ îUîÆîµî î"áî%‘î*Øî-=î0î4óî7Æî<î=3î@HîEîH#î ìï �î òî•îâîÉîuî"î#î'ßî)8î,ðî.Œî1Ú î8¢î;1î<Šî?îA²îD ôTVm$Æ3mode.*If"pagefaults"ischosen,theSpywillrecordthecallstackoftheprocessthatpagefaulted.*Thedifferencebetween"allocations"and"wordsAllocated"isthatintheformer1countisrecordedforeachallocationandinthesecond1countisrecordedforeachwordallocated,whichwouldbethesamearecordingncountsfortheallocation,wherenisthenumberofwordsallocated.*If"userbreaks"ischosen,theSpywillrecorddataeachtimeitencountersabreakpointsetusing"SetUserBreak!".SetUserBreak!ClearUserBreaks!ThesetwocommandsallowtheusertospecifybreakpointsthatwillcausetheSpytologdata.ThebreaksareonlyenabledwhiletheSpyisrunningandthe"Watching"modeis"user-defined".Thereareanumberofwaysofspecifyingabreakpoint:*SelectioninanImplmodule.Theselectiondoesnothavetobeaprocedurename,itcanbeanywhereinthecode(justliketheInterpreter).*Selectionofaropeoftheform"FooImpl.Proc".Theselectioncanbeanywhere,eventheSpy'soutput.YoushouldknowthattheSpywillnotbeabletosetabreakpointifa)themodulehasnotbeenloadedyet,orb)thesymbolsarenotonthedisk.If"ClearUserBreaks!"isbugged,ALLofthebreakpointswillgoaway.SetTrace!Wheneveratracebreakpointisencountered,theSpywillputanentryinitslogsayingwhenandwhereitwas.ThetracesareonlyenabledwhiletheSpyisrunningandthe"Watching"modeis"user-defined".Tracebreaksaresetjustlikeuserbreaks.Theyareclearedwith`ClearUserBreaks!'.StartingandStoppingtheSpy.TherearetwomainwaysofstartingandstoppingtheSpy:bybugging"Spy:{on}"and"Spy:{off}",orbysettingbreakpointsthatdetermineprogrammaticallywheretheSpyistostartandstop.StartandStopbreakpointsaresetinexactlythesamemannerasgivenaboveforuserbreakpoints.TheonlydifferenceisthatifaStopbreakpointissetonathebeginningprocedure,thebreakwilloccurattheexitoftheprocedureratherthanitsentry.SettingaStartorStopbreakpointdoesnotactuallyenabletheSpytorun.Instead,the"Spy:{off}"switchwillbechangedtosay"Break:{off}".TheStartandStopbreaksareonlyenabledwhentheprogrammerhassettheswitchto"Break:{on}".ThisallowstheprogrammertospecifyallofthebreakshewantsbeforetheSpystartsmeasuring.Changingtheswitchto"Break:{off}"doesn'tremovethebreaks,itjustdisablesthem.Thustheusercanreusethebreakshehasalreadyset.ThebreakpointfacilityisdesignedsothattheSpyisrecordingdataaslongasthenumberofStartbreaksexceedsthenumberofStopbreaks.Thisallowsbreakstobesetinrecursiveprocedures.When"ClearBreaks!"isbugged,alloftheStartandStopbreaksareremovedandtheon/offswitchischangedtosay"Spy:{off}".DisplayingtheData.Clicking"DisplayData!"willcausethedatatobedisplayedinanewtypescript.ItwillalsoautomaticallyturnofftheSpyifitisrunning."DisplayData!"doesnotdestroythedatastored.IfsomevîHDïg/qî ìï_/î õï]‡î )î « î�îúîäîDî!î#²î(î*aî,ëî0_î2î4wî9Kî< î ëï[àî îî î`îÊ î"êî%œî0ªî2î4Ûî6„î8Þî=jî>šîBlîCÓî ìïZ9î 9yîzïZ9î*ïZ9qîÂïZ9îhïZ9îŠîGî·î!Xî"�î&ƒî'ÿî-Ëî0yî3XïZ9î4@ïZ9î6¹qî;çïZ9î<ÓïZ9î@ñîE/îG/î ìïX‘î iî“î½îîcî îÿ î%—î)¯î*úî,fî.Åî3òî5«î9· î ïVêî Xî êî£î½î9î2î¢î"tî%/î)Žî,£î/ãî3î4~ î;î<¸ îC¹îEåî ìïUByî ìïQó î3qî ®ïN¤î¨îMî,îÎî &î#î$¿î)U î0Ãî3Šî6.î9Ýî<5î>ñî@˜îBäîF·î ìïLüîXî½îèî&îíî^î"2î#¯î(øî+Áî.2 î5Úî9Áî;>îE�î ìïKUî ?î iî–îOî«îd îÚî! î WïI®î ½îÖîµî×îdî ¢î#«î)‚î,ãî/‰î3î4áî7î8]î?îCZîDâîGžî ìïHî!îÏî.îuî�î;î› î .ïF_î €î…î[î¢îïîÅîAî Åî+ùî.îî4±î7Yî9gî@îCsîEðî ìïD·î ìïCî óîfîîãî;îõî˜î"î#íî&Þî(„î*™î+» î2£î3ûî5–î7îî<åî?RîA¿îEî ìïAhî �îQîîuîÂîîŠî�î ðî ìï?Áî nî¿î+îcî!¾î#wî%× î-Kî/÷î1çyî ìïÏîCîFØî ìï7{î<îËîÂîÓîìîxî Êî&.î*î,²î/­î1Qî6Àî9¯îqî ®ï-ŽîØîTî(îÎîRî3î$Fî'%î,éî/pî2Õî4ùî:nî>ƒîBÃîE¢î ìï+çî¦î‰î£î' îºî!§î(Hî3Mî7ƒî:î<âî>mî@:îChîF>î ìï*?î 8îèî î‹îØîíî ”î%*î'ƒî*ùî/üî1£î5Qî9Kî;‚î>t îF·î ìï(˜î î‹îþîÔî<îlî° î$¨î&î(?î*Lî+}î-ãî4V î;8î=ŸîA|îD/îGöî ìï&ñyî Kï&ñî æï&ñqîï&ñîÀï&ñî¾îî î®î Ôî"®î ®ï$uîCîZîšîKît î!Rî$oî&Òî+Õî0(î2tî5$î6Àî: î?%îArîEKî ìï"ÎîAîîîžîhîâî"î'sî*fî-Ôî0§î3þî8tî:âî>îC_îG/î ìï!& î»îî%îqî—î2î#>î( î+î/)î1u î9Dî:Þî?gîADîBéîE5î ìïî òîéîNîÃîœîF î$ðî+Eî-ºî2 î3Îî9î=]îB1îG/î ìïØîžîôî–îÂî'î¥î"î$þî'‰î+(î-‡î1áî3Òî6Gî;î ®ï\î‡ îxîÿîlî"(î#íî&¼î)î+àî-Lî3wî6}î8,î;Fî<õî?UîD‚îF<î ìïµîFîQî±îÝî–îÒî%î("î,Pî0ªî2Xî4Iî6fî8î=å î ®ï:î¹ î1î�yî »ï:î!kï:qî"©ï:î#dï:î$Uî&¨î)îî,™î/Èî4î6\î<î>ªî@ýîEUî ìï’î XîÇîuîÔîÀxî ìïœ îîàqî ®ï Lîk îmî]î#Wî%ûî)Eî+8î-mî3Ñî5Äî72î:e îBîCÒîFÂî ìï ¥ îQîGîkî½îqîÄî î iî&_ î0î31î5˜î:]î<¯î?¥îDˆîEüÿ êTVm$³4ofthesymbolsweremissing,theusercanfetchthemandclick"DisplayData!"again.Thesecondinvocationwilltakeadvantageofthenewsymbols.Totheleftofthe"DisplayData!"buttonisabuttoncalled"cutoff".The"cutoff"buttonletsyouspecifyhowmuchinformationyouwanttobedisplayed.Thenumberafterthecutoffisthepercentageoftimesaproceduremustbeinthecallstackinordertobedisplayed.Ifaprocedureisinthecallstackfewertimesthanthis,thenitwillnotbedisplayed.InterpretingtheResults.TheSpy'soutputisdividedintothreemainparts:aheader,abreakdownoftheprocesses,andabreakdownoftheprocedures.TheheadergivesoverallstatisticsabouttheexecutionoftheSpywhilethetwobreakdownsectionsarefocussedondetaileddata.Thethreesectionsareseparatedbydoublerowsoftildas(~~~).==================================CedarSpyof:29-Apr-829:19:41.Executedat:29-Apr-829:20:15....Theheaderisprettymuchself-evident.Atthetopitrecordstheparametersthattheprogrammerspecifiedforthisparticularrun:whatwasbeingmeasured,wherebreakswereset,etc.BelowthisitgivesoverallstatisticssuchashowlongtheSpyran,howmanywakeupswererecorded,whatprioritiesdidthingsrunat,howmanypagefaultsoccurredoverall,andsoon.Atthebottomisasectioncalled"StatisticsontheexecutionoftheSpy"whichgivessomedataabouttherunningoftheSpyitself.Thisisonlyfordebuggingpurposes.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Breakdownofinterestingprocesses.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Thesecondsectiongivesalistoftheinterestingprocessesthatranandsomedataaboutthem.Atypicalentrymightlooklikethis:Process220Brunningatpriority[normal,pagefaultLow](39pagefaults)=609(32.6%).BBStart.EvalBase=608(32.5%).CachedRegionImplB=1(0.1%).Thefirstlinesaysthatprocess220Branattwodifferentpriorities(normalandpagefaultLow)andthat39pagefaultsoccurredasanimmediateconsequenceofitswork.Italsosaysthat609countswererecordedforthisprocess,andthatthisaccountedfor32.6%ofthetime.Thesecondandthirdlinessaysthatofthese609counts,608countswereinBBStart.EvalBaseand1countwasinCachedRegionImplB.Thesecountscorrespondedto32.5%and0.1%ofallofthecountsrespectively.Process220Bhastwoentriesbecauseitwassharedbymorethanonelogicalprocess.Mostprocesseswillonlyhaveoneentryunlessalotofprocessesarebeingforked.vîHDïg/qî ìï_/î ×îhîçîjîèîzî"¥î%bî)î,Ãî/¬î3 î= îAóîDýî ìï]ˆ îšîEî?î¶îoî Îî#¼î ®ï[ îÜîCî¿îîæ î!«î&$î'—î(Èî-Aî1?î7�î:mî?ØîDQîFØî ìïYeîƒî‚îS î×îˆî"àî$ˆî&s î-cî05î5\î8’î:ìî>éî@OîB© î ìïW¾î ¼î}î¾îXîØîàî¥î!î#¾î'Hî)î,Ùî.Ÿî0§ î7Ðî9jî:«îAEîBÈîD�îGî ìïVî _î)îÓîùîóîîoî"î$�î&€ xî ìïQ! îöîÎqî ®ïMÒî˜îJîÎîLîTî!>î$Úî(jî,]î-šî2‹î3Çî:öî<Áî?3 îE›îHeî ìïL+îîÛîG îCî (î$»î(:î,Ì î2=î6+î8—î>Ùî@ŸîC îEÚî ìïJƒî Xîî:îgîÈî#dî%wî*»î.µî1šî50î:]î<½îBéîDòî ìïHÜî 2îëî•zî ìïD¹ð"qî ìïCîîÇîùî î ìïAkîëî�î‘î¬ï?Ãî¬ï>î¬ïRî?Äî@ôîE˜î ìï3\ î;î9î‘î¾îoîÇî"2î&7î)¡î-,î0)î4î6[î;‰î=:î?’îBMîFuî ìï1µî Xîqî¯îhî ìï-“ð.î ìï+ëî)îâ î› î ìï*Dð.î ìï&õî ¸î>îÏî5îSî„î1î … î'2î-$î/æî2Oî4úî8�î;zî?PîC�îEî ìï%Nî €îwî‘î<î ìï!ÿîÊîGî~îî î#ƒ î,…î.äî2*î6dî8Iî:Þî õï XîÄîªî?î õï±îîîÓîî ®ïºî�îpî0îîôîÑî#Wî%Õî'wî*-î/Ü î5¶î:öî=¶ îFØî ìïî ¶î—îÙî•îBîëî×î%— î-˜î/Lî1#î5rî6åî9®î<Œî?VîAçîF>î ìïlî¨îåî‡î³îjî8î!Úî(]î*šî.�î0Iî2¨î ®ïñîŒî%îãîRî“î }î#Qî%î(¡î+=î/÷î2“î6õî:Lî<îFØî ìïIî îñî™îDî!î%î)h î1íî3˜î7Šî:>î=€î?6îA"îBØîE4î ìï¢ î ®ï'îuîÛî9îÎî(î#3î$rî'î+Vî-;î0·î3Æî6[î:žî@ îC‘î ìï €î —î±îøî£î7îZî„î •î"Nî(Lî*Ÿî.jÿpTVm$•5~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Breakdownofinterestingprocedures.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Thelastsectiongivesalistofmodulesandproceduresindentedsoastoindicateprecedencerelationships.(ModuleinformationisonlyprintedwhentheSpyisunabletoobtainthesymbolsnecessarytoprintouttheprocedures.)Eachmoduleorprocedurethatoccursinmorethan3.0%ofthecallstackswillbeprintedexactlyoncesomewhereinthissection.Atypicalentrymightlooklikethis:ProcedureStackSpy.AddSon(2refs)=93,2794(2.9%)(92.6%).(20154)StackSpy.AddProcedure=1946(62.4%).(20277)RTPrefAllocImpl.NewPrefixedObject=78(2.5%).(20348)StackSpy.AddProcedure=632(20.2%).(20398)RTPrefAllocImpl.NewPrefixedObject=60(1.9%).(20444)waiting.pagefault=59(1.9%).ThefirstlineindicatesthattheprocedureStackSpy.AddSonwascalledfromtwoplaces(2refs)andwasinthecallstackatotalof92.6%ofthetime.This92.6%ofthetimewasdividedinto93countswhentheCPUwasexecutingcodeintheprocedureitself,and2794countswhentheCPUwasexecutingcodeinprocedurescalledfromAddSon.The2.9%isonlytherebecausethenumberofcountsthatwereintheprocedureitselfwasgreatenough(>1.0%)toforceittoprintapercentageforjustthosecounts.Notethatpercentagesarealwaysfortheamountoftimethataprocedureisinthecallstack.Thismeansthatpercentagesmayadduptomorethan100%sincemostcallstackshavemorethanoneprocedure.Themeaningsofthesenumbersareprintedintheheaderoftheoutputforeasyreference.Thenumberofrefstoaprocedureisnotthesameasthenumberofcalls;itindicatesthenumberofdifferentplacesthatacalltothisprocedureoccursinthestatictextofthecode.Inthiscase,AddSonwascalledfromtwodifferentplacesintheprocedureStackSpy.EnterStack.ThenextfivelinesgivethelistofproceduresthatoccurinthecallstackunderAddSonmorethan1.0%.ThesearethesignificantproceduresthatAddSoncalls.TheyaresortedbyPC,andsotheyarelistedintheorderthattheyappearinthecodelistings.Thenumbersinparenthesisatthebeginningarethesourceindexesforthecalls.Selectingoneofthenumbersandclicking"Position"inthefileStackSpy.mesawillshowyouwherethecallwasmade.Ifaprocedureiscalledfrommorethanoneplace(asStackSpy.AddProcedureis)thenitwillappearinthelistmorethanonce.SincetheSpydoesnotprintproceduresthatarecalledlessthan1.0%,thesumofthecountsfortheprocedureslisted(1946+78+632+60+59=>2775)maybelessthatthetotalnumberofcallsgivenintheprocedureheader(2794).ThecountthatappearsaftereachprocedurelistedisthenumberoftimesthatthatprocedurewasinthecallstackunderAddSon.Thepercentageistheratioofthatcounttothetotalnumberofcounts.Thelastentry,waiting.pagefault,isanentrythatonlyappearswhenexactlyoneprocessisbeingobserved.ItsaysthatAddSonwaswaitingonapagefaultfor1.9%ofthetime.(Other"waiting"proceduresareML(monitorlock),CV(conditionvariable)andpreempted.Preemptedmeansthattheprocesswasreadytorun,butanotherprocessgottoruninstead.)InterpretingIndentation.Theproceduresasawholeareindentedaccordingtothefollowingrule:Aprocedureisindentedimmediatelyunderthedeepestprocedurethatcompletelycontainsallofthecallstoit.Usuallythisjustmeansthataprocedureisindentedundertheprocedurethatcallsit,butitmeanssomethingdifferentifaprocedureiscalledfrommorethanoneplace.Indentationcanbeusedtoeliminatewholesub-treesoftheprintout.Ifyouaren'tinterestedinaprocedure,youcanignorealloftheproceduresindentedbelowit.vîHDïg/qî ìï_¦ð.î ìï]ÿî)îâ î› î ìï\Wð.î ®ïYÜîÈî‹îjîî‹î î!î&Íî)Ç î1î7î9î;î<÷îBf î ìïX5 îNî5 î!î"­î&î+î/î1´î4¸î6eî;-î=îA¢îDBî ìïV�îûî¦î î{îÖ î"*î%™î*•î,Uî2Ôî5žî9ßî;ˆî?îB9îEzîG/î ìïTæî wînîî îßî{î!Âî(éî*—î-8î2±î4=î8®îîBîCºîFØî ìïE0î ­îpîäî„î îKî…îSî!^î#,î% î)Ëî,úî1î2Óî5Gî8‚î;Bî@MîC:îE4î ìïCˆî ’îãîFîãîÿî7î Öî#'î)›î-Aî/êî3!î7mî;î=dî@ÈîCeî ìïAáî $îÄ î½î¦îþî#!î%êî)!î*~î-Šî1î6î8iî=‡î?1îC~îF>î ìï@:î §îî¤î îÆîFî#=î(3î)îî-yî.Üî0˜î4 î5D î<7î>�îA0îDÜî ìï>’î ˆî| î î„îî!qî#öî)&î+î.Oî1Cî2’î9:yî:Ëï>’î;.ï>’î<—î?îAÃqîDÊï>’îFuï>’î ìï<ëîbîc îÿî5îî!dî#Dî' î*bî.2î1×î5fî8#î^î@òîD+î ìï5zî ˜î�îöî¢îHî `î"î$nî*ñî ®ï2ÿî†î–îLîˆîuîÕî î!Ì î(Ôî+¢î/cî1î3qî5üî9oî=rîBÕîFiî ìï1Wîî%î€îç î† î$•î'jî,Õî0Ïî4^î6¹î:äî<çî?šîBYîD$îG;î ìï/°î ¨îhîÙî î€î¢î ;î!ûî$lî'Åî-aî0Kî6 î7Í î?î@²îC#î ìï. î ZîÔî?îNî¦î î!Aî'8î)ÿî+Òî.Mî4î6êî< îBâîD«îG%î ìï,a îJîî±î‚î ³î#,î%Ñî(–î-eî/î0Dî6àî8eî­ îEåî ìï'kî€î3î î#2î%Aî'ôî*áî-^î0¢î5ìî7Ãî:ðî>Âî@ŽîC î ìï%Äîsî ®ï#Iî�îpîHî\î¢î!Üî(iî,î-’î/ûî51î6ôî:§î=î@WîFãî ìï!¡î ’î êînîÙîÔîî Ô î'³î)î+oî.¢î0Tî3î6éî8�î:èî>îC+îDÜî ìïúî ©îîßîÁîî æî$_î'î*î/î2›î7î9­î>fî?¶îCfî ìïSî oî]î7î¦î]î<î Mî!‚î'Œî)Õî-%î.êî1Uî5mî9éî@) îG;î ìï«î Öîºî­îU î î%îî(Î î0âî7ûîî,_î-§î4Hî75î<î>»î@/îF=î ìï]î0îèî î îtî!Hî"öî&×î)î,î5Éî8tî>î?zîAîDîE�î ìï[Øî îéîªîAîZîîî8î!î$Lî%×î'Mî-î1 î2¶î6Íî9ýî;sî=Aî?ÔîBøîDmî ìïZ1î êî[ î;îƒîWîõî 8î#,î$¿î&åî)Î î1·î3Uî5Úî:žî;îî>¡îBˆ î ìïX‰î Äî"î#î”îiîŒî!Aî%Òî)î*ºî-$î3Bî6’î;Pî>jî@ÈîE6îGáî ìïVâî GîÎîîî�î*îOî"Kî%¹î'î)Èî,î1ðî4Ùî6�î9Äî<åî>�î@ê îFØî ìïU;î IîîÄîrîî‡îî. î%cî&Äî(î)†î-ìî/šî5®î7gî:˜î ®ïR¿ îÁî‘îæîØîrîÓî"Rî%šî'U î.Ÿî0õî6eî9?î;âî=œîBˆ î ìïQî ¤ îTî†îoîÐî ˜î# î*î,ùî/[î5íî7÷î9/î;õî=¼ îEkî ìïOqî =îþîBîîtî*î‡ î%Œî'8î)•î+¯î.±î1¾î4\î6î8pî< îCîD½îGî ìïMÉî Ïî¼îw î`î;îëî$Ì î+Êî.î4�î7¡î=î?âîBôîEKî ìïL"î FîÂî„ î»î î"°î% î'·î(êî,» î3Öî7Fî<õî?ŸîB«îD¥î ìïJ{î "îÆîÆî înîQî ïî$Üî+ î1øî3–î5æî9Sî>-î@9îB} î ìïHÓî šî ‹î ®ïFXî× î/îî/î!³î#³î&!î)lî+üî-aî0¡î3%î69î9ºî; î=ºîB-îD-î ìïD±î ¶ îuîmîÔî~î î%äî(æî+yî2Z î9Öî>›îBAîD.îF€î ìïC î Sîò îÕî²îºî"fî$Vî'[î) î.Ð î6î8?î9iî=axî ìï>î¬î„îÅ qî ®ï:Äîdî³î1 î@î!Xî${î'/î)–î,Vî0mî6sî93 î@BîBŸî ìï9î kîWîî¦î©îüî#!î%åî)èî. î4-î5èî8Tî<çî>¢îAîBoîFîHeî ìï7vî áî ~î¨îMîô î[îÁî".î$¾î'Yî+4î.tî0î2€î4Äî7jî:i îAS î ìï5Îî ° î·î ®ï3SîGîµîî®îìîÆîî"Iî#‹î'Xî*ùî,:î0î1Øî4oî5±î8Hî;œî=çî@ØîCÞî ìï1¬î”îAî¹îÂîÅî Áî#*î&|î(î*ªî-Ù î5î8Ÿî:Bî<î>ÓîEKî ìï0î cîîDî£îðî§î!â î*ðî ®ï-‰îAî¨îíîæî‚îÓîãî ³î%Åî( î/ î8Ùî:mî>ŒîB î ìï+âî ÷îïîòîî¨î!‘î#tî$Èî'gî*Öî1ƒî3[î5äî9¬ î@"îCîFSî ìï*;î¶îmî ýî$œî'3î*n î1¡î6'î:?î<Ÿî?xîCNîDºîG/î ìï(“î ¯îZîj î…îåî ¹î#‡î&3î*˜î,÷ î ®ï&î[îÜî’î[î(î?î ’î%Èî)ÿî/ î0Iî6Êî85î;ÿî?õîB^îFIîHeî ìï$qî éîÃî|îÁî Ëî#.î)µî,pî/ î1n î8¤î=1î@OîBþîF‹î ìï"Êî ¶î`îÀîCîî!î#¾î&Ãî*ºxî ìïÓî çî¾îqî ®ï„îDîî� îìî Åî"×î%¯î)†î/î0ûî4¼î9Ó îAîCZî ìïÝî ƒîoîìîîAî0îjîî"î(ƒî+oî.©î0Ðî3ÿî5ãî:î<±î>Á îFî ìï6 îWî×îËîÉî{îôî"Wî%î*. î35î6=î7—îî«îwîuîÍî �î#™î%î(sî*Êî-èî3dî5Xî; î?øîCºîGî ìï[àî ²î“îŸîôî6î"î!î"‹î&nî)=î,Oî.î0Ãî2áî7Íî<î> î@¨îCºîE€îH.î ìïZ9î mî¶î´îÝîùî‰î\î!çî%áî(,î*Ðî.$î/Êî3Kî5Uî6åî;� îA…îCòîEî ìïX’ î¦îdîçîôîõîPî#î(wî+J î4î6]î9<î<î=¸îBÉîEEîF–î ìïVêîQ îçîîî¦î î"Èî&Õî(çî*íî-Mî2!î ®ïTeîñî‡î\îVîpî"î#üî(ûî+Oî-˜î09î5Oî;5î?-îE îGŸî ìïR¾ î<îèîFîîõî$�î'\î)®î/}î1wî7î:î>—î@DîB2îGgî ìïQî ¨î÷î0îoîðî@î$iî'Œî*î,ÿî0-î2î5Öî: î@3îBòîENîG/î ìïOoî¹î îîmîÑî¢î ‰î!Øî%eî'½î,‰î/êî4×î7 î=î?ÊîC îFî ìïMÈî³î^îÜîxî™îîÈî#zî%Pî&£î+7î/xî0÷î4³î7;î;.î=”î?îB®îEðî ìïL îÿîvî›îî»îiîÞîÚî%«î(�î+µî/î2æî6 î9sî?MîB}îH#î ìïJyî  î îàîaî¸î#î"î%Aî ®ïGôîUî½îˆîî1î!Gî&$î'Ûî,‹î-êî2î3Iî6Åî8Éî=¼î?×îB?îF>î ìïFLî –î;îùîKî4îÞî!Ïî#Cî%–î(ûî+cî.éî1ªî3�î8Gî9�î=¦î?sîBãîE�î ìïD¥î ßîTîëîœîþîUî2îÖî Ýî%}î&Öî(Eî,)î0/ î6‰î8’î:ôîA-îBéîEKî ìïBþînîÄîÆî%î˜îï î$Dî'î)|î ®ï@xîîÌîÅîxîî¿î$kî)î+$î-î.<î0Ÿî5 î<7î? îAÅîDjîGáî ìï>Ñî Žî´îòî>î¡î#îÑîîî"bî$î&]î*Åî,Íî.î2î4áî78î<î=9 îD»î ìï=*îîrî\îîÚîLîLî î$ðî&Xî(î*Šî-¬î2[î4&î6˜î:î;  îC=îH#î ìï;‚î ;îÂî5yî ï;‚î¥ï;‚qî‹ï;‚îRï;‚îåî"$î% î,®î1–î4­î9Gî; î=|îA.îF£îH9î ìï9Ûî uîËîvî½îîÜî ®ï7V îúîUî?îæîÓî “î#Õî&Ÿî(ûî+Ïî/ùî2 î5î6þî:Äî<ýî?YîBîEÈîGî ìï5®î/î2î“îîî!¿î'/î)�î,Tî.öî2äî6,î8�î;fî?–îAîE¬îG/î ìï4î ÄîDî,pî ï4îkï4qîøï4îêï4î î ùî#Üî%Hî(aî+�î,Îî/„î2Êî4˜î7 î;õîA‚îD¦îGFî ìï2`î ‡îˆîIîTî'î_î¸î$Fî&Iî+Dî,åî/Lî4Sî9‡î;Gî?ªîB'îFÁî ìï0¸î PîýîŽîåîIîûîSî"‘î$ î&cî+[î,¿î/Mî2î4Iî7Õ î?WîAûîE^îFØî ìï/î�î5î¯îôîöî«î¡î,Bpî-Éï/î.‚ï/qî1?ï/î1åï/î3Ïî ìï-jpî ™ï-jî Rï-jqîÅï-jî"ï-jîöîîî}î>î èî%6î'” î.þî0µî4âî:Oî>©îBªîEî ìï+ îCîIî©îÞî—î÷ÿ TVm$Š8Appendix:SpyCommands.nameSpy:{off,on}descriptionClickingthe'Spy'buttontogglesthecurrentstateoftheSpy.IftheSpyisoff,thenclickingthebuttonwillturniton.IftheSpyison,thenclickingthebuttonwillturnitoff.TheSpyisinitializedusingtheparametersshownintheviewerwhenthebuttonisclicked.examplesSupposeyouwanttoknowwhyopeningaviewertakessolong.OpentheSpyandtogglethe'Watching'buttonuntilitsays'CPU'andthenclickthe'Spy'buttonsothatitsays'{on}'.Thenopenaviewer.Finallyclick'DisplayData!'toseetheresults.('DisplayData!'turnstheSpyoffautomatically.)contactJohnMaxwellkeywordhintsspying,performance,measurementkeywordstobesuppliedbytheIndexCzarattheappropriatetimeinthefuturenameBreak:{off,on}descriptionClickingthe'Break'buttonenables/disablesthestartandstopbreakssetbytheuser.examplesSupposeyouonlywanttomeasuretheperformanceofthegarbagecollector,andaren'tinterestedintakingmeasurementswhenitisn'trunning.ThenyoucouldsetstartandstopbreaksonthegarbagecollectorsothattheSpywouldonlytakemeasurementswhilethegarbagecollectorisrunning.Use'SetStartBreak!'and'SetStopBreak!'tosetbreaksonthetop-levelprocedure.Clickingeitherofthesewillchangethe'Spy'buttonintoa'Break'button.Whenyouhaveallofthebreaksset,thenclick'Break'toenablethem.(Havinga'Break'buttonallowsthebreakstobeenabledatomically).stop/undoClick'ClearBreaks'tochangethe'Break'buttonbackintoa'Spy'button.contactJohnMaxwellkeywordhintsvîHDïg/xî ìï^õîKî�yî ìï[¦tîï[¦îñï[¦î:î^yî ìïXX qî ìïU î_î¹î&î“î)î ƒî%Gî(sî*&î,€î0î1�î3êî6§î8 î:’î=³îBÃîEî ìïSaî ¤î¶îîî£îîÞîWîÂî!õî'î)„î.î0ºî3Ìî5/î8Vî;;î> î?ƒ îEåî ìïQºî K îRî¡îOî¯î î#Èî&(î*™î,yî ìïNkqî ìïKî^îîKîæî’îxî"±î#Çî(î+ƒî-3î1î4¹î7î9µîî4˜î6µî8±î;yî ìï&¹qî ìï#kî�îdî›îîâî mî"ê î+ î,ãî/`î4ž î:¤î=yîAx îGáî ìï!Ãî1 î?î îxîˆî%Éî)î,Mî00î2cî5Šî8Yî;iî?ÚîAøîDnî ìï î�î‚îrîóî×î'î!bî$} î-•î1kî3ìî9.î>ßî@lîFÂî ìïuîËî˜î aî"%î$Wî(Çî*âî-Wî3 î:§î@5îD7îFî ìïÍî ½îŠîî§î?î<î ‹î%Wî*ïî/-î2 î5uî7‹î9iî;îî@mîCîFSî ìï&î“îAî¦î îYîƒî$)î(›î,Èî/(î3‚î50î7!î]CR".(TheSpyprintsoutthesourceindexforyouwheneveryousetabreak.)examplesYouhaveruntheSpywatchingtheCPU,andareinterestedinfindingoutmoreaboutaprocedurethatappearsintheoutput.Soyouselectthenameoftheprocedureandclick'SetStartBreak!'and'SetStopBreak!'.Thenyouset'Watching'to'breakprocess'andruntheexperimentagain.Whentheexperimentisdoneyoucanclick'DisplayData!'toseetheresults.warningsTheSpywon'tbeabletosetabreakpointifthemodulehasn'tbeenstartedyetortheirarenosymbolsforit.stop/undoClick'ClearBreaks!'.contactJohnMaxwellkeywordhintsspying,performance,measurement,breakpointskeywordstobesuppliedbytheIndexCzarattheappropriatetimeinthefuturenameSetStopBreak!descriptionvîHDïg/qî ìï_/îž îû yî ìï[ßqî ìïX�î šî ‹îîîvîbî¨î Aî"  î*î-%î.Óî13yî ìïU@tîïU@îñïU@ yî ìïQñ qî ìïN¡îîZîÁîîñî8î!”î+~î-Mî/Šî0Õî4Ëî7ºî:†î=·î@7îDî ìïLúîºîjîtîØîPî#Çî&¤î'Òî,~î1Lî5Rî7«î:\î=¼î?zîEîFHî ìïKRî}îYîÕîßîî‘î Ñî%Yî&þî(Úî.Vî/`î3î4šî6Úî:"î ìïI«î Ýî‰îMîî]îKîî î"Pî$î&yî,ýî.Ïî1Gî7âî<£î?“îBnîE2îGáî ìïHî î´îî@îùîîcî$nî&Íî+ùî-²î0¬î ìïD´î ~î”îpîî÷îî‡î¶î$î&�î'óî*°î.uî0Úî50î9î:¿î=%îAâîDÁîGRî ìïC î0î'î,Aî1Fî5ªî9"î< î@îB¹îE?î ìïAeî ·îôî«îàî—î³îÝyî ìï>qî ìï:Æî òî0î¾îîÏî™îðî#²î&aî(¬ î.ïî0”î5Tî7Áî;Lî?%î@FîFÁî ìï9îPîWîîîoîî#™î&Qî*jî,|î/4î6î9 î<µîFØî ìï7xî–îBîî1 î$$î%àî*î/Tî2î4½î7* î>jîC îG/î ìï5Ð îîŠîýî´î?î{ î'ˆî)7î+Šî-éyî ìï2�qî ìï/1î ÂîƒîLî:î2îÞîùî! î$î%nî'Ëî,Éî0Êî4%î8Ÿî:æî<¨î?íîB>îDBî ìï-Šî )yî ìï*:qî ìï&ëî Šyî ìï#›qî ìï Lî Tyî ìïüîDqî ìï¬îž îû îÅ yî ìï]qî ìï î šî ‹îîîvîbî¨î Aî"  î*î-%î.Óî13yî ìï¾tîï¾îñï¾ yî ìï n ÿ-TVm$f10Selectacodelocationandthenclick'SetStopBreak!'tosetabreakthatwillstoptheSpy.Clicking'SetStopBreak!'willturnthe'Spy'buttonintoa'Break'button.Therearetwowaysofselectingacodelocation:byselectingapositioninthesource,orbyselectinganameoftheform'ModuleImpl.Procedure'.Thelatterwillcauseabreaktobesetattheendoftheproceduregiven.TheSpywillrunaslongasthenumberofstartbreaksexceedsthenumberofstopbreaks.Astopbreakcanbesetfromacommandfileifyouknowthesourceindexofthebreak.Justcall"_SpyClient.SetStopBreak[NIL,"FooImpl.mesa",]CR".(TheSpyprintsoutthesourceindexforyouwheneveryousetabreak.)warningsTheSpywon'tbeabletosetabreakpointifthemodulehasn'tbeenstartedyetortheirarenosymbolsforit.stop/undoClick'ClearBreaks!'.contactJohnMaxwellkeywordhintsspying,performance,measurement,breakpointskeywordstobesuppliedbytheIndexCzarattheappropriatetimeinthefuturenameClearBreaks!descriptionClicking'ClearBreaks!'clearsthestartandstopbreaksthathavealreadybeenset.examplesSupposeyouhavesetanumberofstartandstopbreaks,andthenfindthatyousetabreakinthewrongplace.Clicking'ClearBreaks!'willclearallofthebreaksandallowyoutostartagain.(Thereisnowaytoclearjustonebreak.)stop/undoImpossible.contactJohnMaxwellkeywordhintsvîG~ïg/qî ìï_/îî_îÉî#îýîFî!¥î+|î-Mî/�î0Úî4Óî7Äî:’î=¯î@2îDî ìï]ˆî¥îWîbîÇîAî#¸î&—î'Æî,sî1Cî5Kî7¤î:Vî=¸î?xîEîFHî ìï[àî}îYîÕîßîî‘î Ñî%Yî&þî(Úî.Vî/`î3î4šî6Úî:"î ìïZ9î Ðîqî(îéîîî¼î¹î!âî#†yî%òïZ9î&�ïZ9qî(ŒïZ9î)GïZ9î*Qî,½î3Lî7ôî:Øî=§î@^îCîD»îGáî ìïX’î Kîxî1îAî›î¦î"î'2î(ëî+äî ìïUCî î€î]îïîæî îxî¨î$î&€î'èî*¦î.lî0Òî5)î8úî:ºî= îAàîDÀîGRî ìïS›îî' î,1î18î5 î9î<î@îB·îE?î ìïQôî ·îôî«îàî—î³îÝyî ìïN¥qî ìïKVî ÂîƒîLî:î2îÞîùî! î$î%nî'Ëî,Éî0Êî4%î8Ÿî:æî<¨î?íîB>îDBî ìïI¯î )yî ìïF`qî ìïCî Šyî ìï?Âqî ìïáîCTîD¸îF·î ìï^î šîìî�î9yî ìïqî ìïÀ yî ìïqqî ìï#î Tyî ìï ÔîDÿ²TVm$L11spying,performance,measurement,breakpointskeywordstobesuppliedbytheIndexCzarattheappropriatetimeinthefuturenameDisplayData!descriptionClicking'DisplayData!'turnstheSpyoffandproducesatypescriptofthedatagatheredsincetheSpywasturnedon.Thedataisdisplayedinacomplicatedtreestructurewhichisexplainedinthesectionabovecalled'InterpretingtheResults'.Ifyouholddownthecontrolkeywhileclicking'DisplayData!',thentheSpywillmonitoritselfwhileitisdisplayingitsdata.Whenthefirsttypescriptisfinished,asecondonewillappearwiththedatafortheSpy.warningsIftheSpycannotfindthesymbolsforamodule,thenitwillprintPCrangesinsteadofprocedurenames.Youcangetanewtypescriptbybringingoverthecorrectsymbolsandclicking'DisplayData!'again(youdonothavetoruntheexperimenttwice).Thenewtypescriptwillusethelatestsymbols.stop/undoYoucanstoptheoutputbydestroyingthetypescriptviewerorbyclickingcontrolDEL.(ItmaytakeseveraltriesbeforeitrespondstothecontrolDEL.)contactJohnMaxwellkeywordhintsspying,performance,measurementkeywordstobesuppliedbytheIndexCzarattheappropriatetimeinthefuturenamecutoff:{n}descriptionThecutoffparameterdetermineshowmuchofthedatawillbedisplayed.Theparametermeasuresthepercentageoftimethataprocedureisinthecallstack.Iftheprocedureisinthecallstacklesstimethanthecutoffspecifies,thenitgetsprunedfromtheoutput.Youcandisplaythedatausingseveraldifferentcutoffparametersjustbychangingthecutoffandclicking'DisplayData!'again.Left-clicking'cutoff'incrementstheparameter,right-clickingdecrementsit.Middle-clicking'cutoff'setsittothedefaultvalue,3.vîG~ïg/qî ìï_/îž îû îÅ yî ìï[àqî ìïX‘î šî ‹îîîvîbî¨î Aî"  î*î-%î.Óî13yî ìïUBtîïUBî(ïUB yî ìïQó qî ìïN¤îr î�î$î’î!bî#¢î&gî,Sî-Š î3äî5«î8î;+î@ßîD_îFÌî ìïLýî £î!îîþîî†î!±î#kî$¡ î,Yî/'î4ðî9 î:�î@ÍîB‡îDòî ìïKVî îîå îßî>î ìïHî nî$îUîî~î1îÆî"zî'�î0õî4î6zî9<î;çîA(îD„îH9î ìïF_î e îþîæîáîîrî!W î'±î))î.Ñî0î4¦î7_î:î>«îAÓîD@îGRî ìïD¸î Kyî ìïAiqî ìï>î Yî £îPî·î�îÛîî!:î"Oî'‘î*¢î+ãî.yî1Ìî4 î8Dî<âî>†îDóî ìïÅyî ìï7|qî ìï4-î î›î î î‡î� î"Eî$° î+î/vî1Dî3Kî8kî=(îAŒîC‡îF–î ìï2†î}î�îÐî&îíî›î ûî%­yî ìï/7qî ìï+èî Tyî ìï(™îDqî ìï%Jîž îû yî ìï!ûqî ìï¬î šî ‹îîîvîbî¨î Aî"  î*î-%î.Óî13yî ìï]tîï]îºï]îyyî ìï qî ìïÀî ÄîÈîJ îQî!Uî%,î&åî)Eî,Jî.öî0ç î7âî:ºîA=îG/î ìï îäî¯îæîÇîî —î"î#Õî&Gî(äî-Vî.êî1\î7ñî9nî;/î= î@=îCÂîFiî ìïqî #î”î¨ î‹îÂî*î!î%ãî)[î+Ìî1<î4\î6øî;¼î>-îACîDþî ìïÊî’î• î›î=î8î%î'tî+wî./î3D îqî ìïQîî Tyî ìïNŸîDqî ìïKOîž îû yî ìïGÿqî ìïD°î šî ‹îîîvîbî¨î Aî"  î*î-%î.Óî13yî ìïA`tîïA`îuïA`îÁyî ìï> qî ìï:Áî û îî¿ îüî#�î&&î)î*Âî.Âî0§î5è î>#î?° îG/î ìï9 î_î"îã î î$ˆ î+æî-Qî/î1‰î6.î@!îDîElîG/î ìï7rî Hîøî·î ìï4"î ÷î½îîÍî îÖî"Öî$Üî&gî)Øî/Oî1úî7î9lî<Ñî>sî@ºîD»î ìï2{î Xî5îGîbîÔîý î$æî)Žî+Gî.Lî/·î6¨î:yî ìï/+qî ìï+Ûî…îOî¿î�îSîkîêî#§î&î,Aî0 î2|î8î9“î?°îArîCvîG/î ìï*4 îÝî—îÄî‡î¸îÉî"3î%î'úî+aî,–î0®î3qî6¢î9éîCéîFÌî ìï(�î ‘î°îîDîîƒîxî$�î)ùî.î3÷î7Bîî ìï&åîÉîyî ìï#–qî ìï Fî Âî3îïî3îàîÏî!î"°î$µî'¡î)cî/î1üî4î6^î9î#î?° îG/î ìïI« î_î"îã î î$ˆ î+æî-Qî/î1‰î6.î@!îDîElîG/î ìïHî Hîøî·î ìïDµî ôîfî–îTîîSî…î$î&åî+î-Öî/Šî1¸î3lî5Òî;î<Äî?)îDîFØî ìïCî =îàî�îªîpîŽ î$¹î)Ùî,-î.äî2åî4ìî6yî9ëî?cîBîG/î ìïAfî·î]î¨îýîKî®îƒî#.î'(î)sî,!î01î2÷î4Dî8î9ðî>A îD»î ìï?¿î -îœîNîÆî)îŸî">î#kî'¾î,¶î1�î8wî:£î?zîAƒîB±îEûî ìï>î¿îÆîïî1î‚îFî!î# î$Iî*hyî ìï:Éqî ìï7zîŸî„îîëîØîbî!ðî$õ î/î3Ìî5Ôî9(î>@î@Í îGàî ìï5ÒîÏî[îBîÏî²î �î"ýî%ä î/çî3iî6/î9dîæîA¸îD¸îHeî ìï4+î îîQî,î þî#¹î&^î(¶î+fî..î0† î:tî>ôîBäîD–îFiî ìï2„îÁîî¤îTîµî¬î!gî#Cî&jî+?î-~î/ßî3'î5àî9×î;’î=nî@•îEjîGî ìï0Üî Kyî ìï-�qî ìï*?î îeîÖî¡î»î!›î&Óî( î,éî/ î2zî5øî8dî=DîB|îGFî ìï(—îaî¬îîçî¸î!î"†î$éî)Áî+0 î2rî5-î7¼î:®î=(î?‹îDbî ìï&ðî òî4îžîkî‘înî!]î%Áî'Nî)¸î.–î0 î6î8×î;mî=ìîCÉîE¹î ìï%IîÀî�îîÁîîgî";î'g î.° yî ìï!úqî ìï«î Š îÐî” î ¡î"Pyî ìï\qî ìï î Tyî ìï¾îDqî ìïoîž îû îÅ î&î+]î/2î5Qyî ìï qî ìï Ñî šî ‹îîîvîbî¨î Aî"  î*î-%î.Óî13ÿUTVm$Õ14nameWatching:{breakprocess}descriptionThe'Watching'buttondetermineswhattheSpyisgoingtowatch.Left-clickingitenumeratesthepossibilitiesinonedirection,right-clickingenumeratesitintheother.Middle-clickingresetsittothemostcommonchoice:'CPU'.Whenwatchingaparticularprocess,theSpywakesupatfixedintervalsandsamplestheprocesstoseewhatitiscurrentlydoing.Therearefivethingsthatitcouldbedoing:executing,waitingforpermisiontousetheCPU(becauseahigherpriorityprocesspreemptedit),waitingonapagefault,waitingonamonitorlock,orwaitingonaconditionvariable.Thefirststartbreakencounteredwilldeterminewhichprocessedwillbewatched.examplesSupposeyouhaveaprocedureFooImpl.Foothatyouthinkisspendingtoomuchtimewaitingonmonitorlocks.Select"FooImpl.Foo"andthenclick'SetStartBreak!'and'SetStopBreak!'.Thenset'Watching'to'breakprocess'andclick'Break'toenablethestartandstopbreaks.Thensay'_FooImpl.Foo[...]'totheinterpreter.Whenitreturns,click'DisplayData!'toseetheresults.stop/undoClick'Spy'/'Break'or'DisplayData!'tostop.contactJohnMaxwellkeywordhintsspying,performance,measurement,processeskeywordstobesuppliedbytheIndexCzarattheappropriatetimeinthefuturenameWatching:{pagefaults}descriptionThe'Watching'buttondetermineswhattheSpyisgoingtowatch.Left-clickingitenumeratesthepossibilitiesinonedirection,right-clickingenumeratesitintheother.Middle-clickingresetsittothemostcommonchoice:'CPU'.Everytimeapagefaultisencountered,anentryisloggedintheSpy.Theoutputwilldistinguishbetweenpagefaultsthatoccurbecausecodehadtobeswappedin(pagefault.code)andpagefaultsthatoccurbecausedatahadtobeswappedin(pagefault.data)Proceduresthathadpagefaultsinthemainbodyofthecodewillbeprintedinbold.(Non-boldproceduresonlyhadpagefaultsinproceduresfurtherdowninthestack.)stop/undovîG~ïg/yî ìï_,tîï_,îuï_,îÁî<yî ìï[Ý qî ìïXŽî û îî¿ îüî#�î&&î)î*Âî.Âî0§î5è î>#î?° îG/î ìïVç î_î"îã î î$ˆ î+æî-Qî/î1‰î6.î@!îDîElîG/î ìïU@î Hîøî·î ìïQñîîÝî îCî sî"Öî%œî)¬î+Áî-]î0Þî6fî9 î>Oî@²îEŠîG;î ìïPIî Cî’îøîÎî~îzî Çî#wî'‰î*Qî+¡î/fî1Pî5¤ î< î@íîC$î ìïN¢î §î(î”îî»îñîMî$Nî)/î0!î2Vî76î9Hî:î=ÒîArîFRîHeî ìïLûî$îlî'îñîîîî"%î(%î*ôî-Ãî0Éî4– îî%#î(wî+àî5×î8¼îC¦îGrî ìïAg îîî‡îüîûî#î(nî*eî/î1»î5î8î;UîAîEîGªî ìï?¿ î¿î›îwîî¼î î!Çî%ßî'6î,Aî/| î8Šî:8î<Œî>ëyî ìï#î?° îG/î ìï´ î_î"îã î î$ˆ î+æî-Qî/î1‰î6.î@!îDîElîG/î ìï î Hîøî·î ìï¾îsîŒîyîÕ î õî"Õî&Xî'³î,î-°î/ÿî3|î6Dî:¥î=@ îD î ìï îŸîžî�îâî Zî#Bî%!î'Cî-î.øî94î< îBÏîEÎî ìïoî îî»îdîPîðî™î)Ü î0éî3²î6e î<âî>‹î@åîD]îGÖî ìïÈî Dîƒî'îîÝîƒî€î%A î,@î/Rî2 î8}î:$ îA#îEÄî ìï î šî úyî ìï Òq½TVm$Ë15Click'Spy'/'Break'or'DisplayData!'tostop.contactJohnMaxwellkeywordhintsspying,performance,measurement,pagefaultskeywordstobesuppliedbytheIndexCzarattheappropriatetimeinthefuturenameWatching:{allocations}descriptionThe'Watching'buttondetermineswhattheSpyisgoingtowatch.Left-clickingitenumeratesthepossibilitiesinonedirection,right-clickingenumeratesitintheother.Middle-clickingresetsittothemostcommonchoice:'CPU'.Wheneveranallocationoccurs,theSpylogsoneentry.Ifyouwanttomonitorthetotalwordsallocatedratherthantheallocations,use'Watching:{wordsAllocated}'.warningsTheSpyonlymeasureswordsallocatedfromsafestorage,itdoesnotmeasurewordsallocatedfromanuncountedheap.stop/undoClick'Spy'/'Break'or'DisplayData!'tostop.contactJohnMaxwellkeywordhintsspying,performance,measurement,allocationskeywordstobesuppliedbytheIndexCzarattheappropriatetimeinthefuturenameWatching:{wordsAllocated}descriptionThe'Watching'buttondetermineswhattheSpyisgoingtowatch.Left-clickingitenumeratesthepossibilitiesinonedirection,right-clickingenumeratesitintheother.Middle-clickingresetsittothevîG~ïg/qî ìï_/î Š îÐî” î ¡î"Pyî ìï[àqî ìïX‘î Tyî ìïUBîDqî ìïQóîž îû îÅ yî ìïN¤qî ìïKUî šî ‹îîîvîbî¨î Aî"  î*î-%î.Óî13yî ìïHtîïHîuïHîÁ yî ìïD¸ qî ìïAiî û îî¿ îüî#�î&&î)î*Âî.Âî0§î5è î>#î?° îG/î ìï?Á î_î"îã î î$ˆ î+æî-Qî/î1‰î6.î@!îDîElîG/î ìï>î Hîøî·î ìï:Ëîzî` î•î(î~î"6î%î'¥î,î-yî0&î3xî5î:Tî<ªî?ÅîCÈî ìï9$î úî î î›î î$yî ìï5Õqî ìï2†î Éî‘î±î¨îºî"‡î%óî(Åî-Õî/0î2fî4àî:Tî>fîD2îGžî ìï0ßî½yî ìï-�qî ìï*Aî Š îÐî” î ¡î"Pyî ìï&òqî ìï#£î Tyî ìï TîDqî ìïîž îû îÅ yî ìï¶qî ìïgî šî ‹îîîvîbî¨î Aî"  î*î-%î.Óî13yî ìïtîïîuïîÁyî ìïÉ qî ìï zî û îî¿ îüî#�î&&î)î*Âî.Âî0§î5è î>#î?° îG/î ìï Ó î_î"îã î î$ˆ î+æî-Qî/î1‰î6.î@!îDîElîG/(TVm$¶16mostcommonchoice:'CPU'.Wheneveranallocationoccurs,theSpylogsanentryforeachwordallocated.Ifyouwanttomonitortheallocationsratherthanthetotalwordsallocated,use'Watching:{allocations}'.warningsTheSpyonlymeasureswordsallocatedfromsafestorage,itdoesnotmeasurewordsallocatedfromanuncountedheap.stop/undoClick'Spy'/'Break'or'DisplayData!'tostop.contactJohnMaxwellkeywordhintsspying,performance,measurementkeywordstobesuppliedbytheIndexCzarattheappropriatetimeinthefuturenameWatching:{userbreaks}descriptionThe'Watching'buttondetermineswhattheSpyisgoingtowatch.Left-clickingitenumeratesthepossibilitiesinonedirection,right-clickingenumeratesitintheother.Middle-clickingresetsittothemostcommonchoice:'CPU'.Aentryisloggedeachtimeauser-specifiedbreakisencountered.Userscansetandclearbreakswith`SetUserBreak!'and`ClearUserBreaks!'.examplesSupposeyouwanttoknowwhoissendingpacketsoutontheEthernet.Thenyoushouldsetauserbreakontheprocedurethatsendspackets,andclick'Spy'toturniton.(Settingauserbreakautomaticallysetsthe'Watching'parameterto'userbreaks').Letthingsrunforawhileandthenclick'DisplayData!'toseewhathappened.stop/undoClick'Spy'/'Break'or'DisplayData!'tostop.contactJohnMaxwellvîG~ïg/qî ìï_/î Hîøî·î ìï[ßî�î† îÎîuîÝî"©î%‰î'‚î+î-eî0Ÿî41 î:åîfîD2îGžî ìïQñî½yî ìïN¢qî ìïKRî Š îÐî” î ¡î"Pyî ìïHqî ìïD³î Tyî ìïAcîDqî ìï>îž îû yî ìï:Ãqî ìï7tî šî ‹îîîvîbî¨î Aî"  î*î-%î.Óî13yî ìï4$tîï4$îuï4$îÁîjyî ìï0Ô qî ìï-…î û îî¿ îüî#�î&&î)î*Âî.Âî0§î5è î>#î?° îG/î ìï+Ý î_î"îã î î$ˆ î+æî-Qî/î1‰î6.î@!îDîElîG/î ìï*6î Hîøî·î ìï&æî €îî�îî@îmîž î%Pî).î*¡ î3eî7Cî9Õî;úî>¹îBîFtî ìï%?î´îkyî ìï!ïqî ìï î‰îXîÍî”îkî‡î î%9î*0î,½î.Üî1Sî8î;¼î>‹îCîETîF–î ìïøî �î~î¸îî¿îZî#mî%ÿî)î,cî-íî0Íî1þî4–î9’î:—î=kîA î ìïQî ‰îå îÇîFîñî!?î'?î)»î-Ðî0bî2œî3Âî7sî:'î=Iî@� î ìïªî šî îîKyî ìïZqî ìï î Š îÐî” î ¡î"Pyî ìï»qî ìï kî Tÿ“TVm$÷17keywordhintsspying,performance,measurementkeywordstobesuppliedbytheIndexCzarattheappropriatetimeinthefuturenameSetUserBreak!descriptionSelectacodelocationandthenclick'SetUserBreak!'tosetauserbreakintheSpy.(See'Watching:{userbreaks}'formoreinformation.)Therearetwowaysofselectingacodelocation:byselectingapositioninthesource,orbyselectinganameoftheform'ModuleImpl.Procedure'.Thelatterwillcauseabreaktobesetatthebeginningoftheproceduregiven.Auserbreakcanbesetfromacommandfileifyouknowthesourceindexofthebreak.Justcall"_SpyClient.SetUserBreak[NIL,"FooImpl.mesa",]CR".(TheSpyprintsoutthesourceindexforyouwheneveryousetabreak.)stop/undoClick`ClearUserBreaks!'.contactJohnMaxwellkeywordhintsspying,performance,measurement,breakpointskeywordstobesuppliedbytheIndexCzarattheappropriatetimeinthefuturenameSetTrace!descriptionSelectacodelocationandthenclick'SetTrace!'tosetatracebreakintheSpy.Wheneverthetracebreakisencountered,atracewillbeloggedintheSpy'slog.ThetracetellswhenandwheretheSpywas.Therearetwowaysofselectingacodelocation:byselectingapositioninthesource,orbyselectinganameoftheform'ModuleImpl.Procedure'.Thelatterwillcauseabreaktobesetatthebeginningoftheproceduregiven.Atracebreakcanbesetfromacommandfileifyouknowthesourceindexofthebreak.Justcall"_SpyClient.SetTrace[NIL,"FooImpl.mesa",]CR".(TheSpyprintsoutthesourceindexforyouwheneveryousetabreak.)examplesvîG~ïg/yî ìï_,îDqî ìï[Ýîž îû yî ìïXŽqî ìïU?î šî ‹îîîvîbî¨î Aî"  î*î-%î.Óî13yî ìïQðtîïQðîñïQð yî ìïN¡ qî ìïKSîîEî¢îðî½îúî!Kî+*î,îî/"î0bî3qî7]î9"î;—î?bîBˆ î ìïI«î ªî!îrî î" î&6î(žî+^î.Îî0›î6Jî7ˆî:ãî@§îB·îHeî ìïHî!îÃîî±îhîWî åî"î%¶î'bî)µî-î<çî?³îC;îEÚî ìïF]î îìîšî‹î§î@îŸî î Äî##î)¦î ìïCî î€î\îîîæî îwî¨î$î&€î'èî*¦î.lî0Òî5)î8úî:ºî= îAàîDÀîGRî ìïAfî/î'î,@î1Eî5©î9!î< î@îB¹îE?î ìï?¿î ·îôî«îàî—î³îÝyî ìïóîAdîEÄî ìï î )îàîîÌîéîyî ìï ÑÿlTVm$‡18Supposeyouaretinkeringwithamulti-processsystemthatdoesspurtsofworkatsporadicintervals.ThenormalSpydoesn'thelp,becausethereistoolittlegoingontomeasure.Soinsteadyousettracebreaksatalloftheinterestingpoints.Whatyougetasoutputisalogofthetracesencountered,givingthebreaklocation,theabsolutetimeofthetrace,andthedeltasincethelasttrace.Examiningthislogcarefullymaygiveyoucluesastowhatisgoingon.stop/undoClick'ClearUserBreaks!'.contactJohnMaxwellkeywordhintsspying,performance,measurement,tracing,breakpointskeywordstobesuppliedbytheIndexCzarattheappropriatetimeinthefuturenameClearUserBreaks!descriptionClicking'ClearUserBreaks!'clearsanyuserbreaksortracebreaksthathavebeenset.examplesSupposeyouhavesetanumberofuserbreaksortracebreaks,andthenfindthatyousetabreakinthewrongplace.Clicking'ClearUserBreaks!'willclearallofthebreaksandallowyoutostartagain.(Thereisnowaytoclearjustonebreak.)stop/undoImpossible.contactJohnMaxwellkeywordhintsspying,performance,measurement,breakpointskeywordstobesuppliedbytheIndexCzarattheappropriatetimeinthefuturevîG~ïg/qî ìï_/î�îgîÙîÕîîX î'êî,„î/rî2Áî6ïî8ÇîîC´ î ìï]ˆî Îî”î`î(î¤î!Ðî%cî&Øî)Kî,†î0Yî2iî4!î:~î<ŽîAKîD îF2î ìï[àîDîÛîÉî€îÝ î•î!�î%Nî(î*Jî+öî0fî1Ðî2øî5Iî7î9^î== îElî ìïZ9î Nî&î¸îî‹î ³î"nî$Ðî(ˆî+Bî-¤î1î4„î6æî9hî=¦îD˜îG<î ìïX’î‘î•îƒî:î­î[î î"fî#Òî'œyî ìïUCqî ìïQôî Šyî ìïN¦qî ìïKWî Tyî ìïHîDqî ìïDºîž îû îÅî$¯ yî ìïAkqî ìï>î šî ‹îîîvîbî¨î Aî"  î*î-%î.Óî13yî ìï:Îtîï:Îîï:Îyî ìï7 qî ìï40îeîîÛî!|î$uî(Ðî*“î-ñî2Kî5î8_î;¼yî ìï0âqî ìï-“îiîîVîkîŒî°îaî"Rî&¤î(_î+´î0^î3 î6+î9î;×î>†î@›îA¼îEŠîG/î ìï+ìîî\îÁî#Pî%èî)'î+î,ªî.öî3=î5âî9xî<î=·î@´îEî ìï*Dî Xî ^î6îäî6î×îƒyî ìï&öqî ìï#§ yî ìï Xqî ìï î Tyî ìï»îDqî ìïlîž îû îÅ yî ìïqî ìïÏî šî ‹îîîvîbî¨î Aî"  î*î-%î.Óî13ÿ TVm$á ÿGACHAþŸ ÿ TIMESROMANþŸÿ TIMESROMANþYÿ HELVETICAþÿ HELVETICAþŸÿLOGOü´ÿ TIMESROMANþŸÿ HELVETICAý…ÿLAURELþŸÿ TIMESROMANþŸÿ TIMESROMANþæ– ¿ W2 O, ?8 èBÝHMZRfX|^ÿeÕl5p¾uÂ{j/‚€œÇxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ SpyDoc.tioga"Monday, December 12, 1983 11:41 am