You can configure the debug instrumentation to automatically record procedure flow as your program calls subroutines and then returns back to main code. The available control flow statements that can be recorded are:

If you are using the Instrumentation Log window, this feature can be enabled from the Control Flow icon in the upper right corner. Clicking on this icon brings up a popup menu:

Use this menu to tell Panorama which control flow operations you want recorded.

Keep in mind that if you record all of these statements, your log may contain more information than you really want to look at. In fact, recording all of these may slow down Panorama operation as it takes time to record each item.

The instrumentation log not only shows code in your own databases that are triggered, but code in Panorama itself. Much of Panorama is written in Panorama code, so it can be educational to enable recording of control flow statements and then start clicking on things in Panorama to see what is being called within Panorama. For example you’ll see lots of action if you open the Find/Select dialog and click a few buttons.

-[ExecuteStatement run] findselectdialog
-[ExecuteStatement run] windowglobal «_HotKeys»
-[ExecuteStatement run] rtn           settrigger "Key.ESCAPE"         resume {}         if error             global dlgStack             dlgStac
-[ExecuteStatement run] rtn              global dlgStack             define dlgStack,""             local s             let cb=tagparameter(arra
-[ExecuteStatement run] rtn              global dlgStack             define dlgStack,""             local s,cb             let cb=tagparameter(a
-[CallStatement run] initializeDimensions (in _FindSelectLib)
-[CallStatement run] adjustQueryHeight (in _FindSelectLib)
-[CallStatement run] makeQueryRows (in _FindSelectLib)
-[CallStatement run] deleteAllQueryRows (in _FindSelectLib)
-[CallStatement run] makeQueryRow (in _FindSelectLib)
-[ExecuteStatement run]      fileglobal q0field,q0operator,q0operand1,q0operand2     q0field="" q0operator="" q0operand1="" q0operand2=""     
-[CallStatement run] makeQueryRow (in _FindSelectLib)
-[ExecuteStatement run]      fileglobal q1field,q1operator,q1operand1,q1operand2     q1field="" q1operator="" q1operand1="" q1operand2=""     
-[ExecuteStatement run]          showvariables q1field,q1operator,q1operand1,q1operand2         
-[CallStatement run] makeQueryFormula (in _FindSelectLib)
-[CallStatement run] editQueryRow (in _FindSelectLib)
PopupButtonObject RUN CODE --> call queryFieldChanged,1
-[CallStatement run] queryFieldChanged (in _FindSelectLib)
-[CallStatement run] initializeDimensions (in _FindSelectLib)
-[CallStatement run] makeQueryRow (in _FindSelectLib)
-[ExecuteStatement run]      fileglobal q1field,q1operator,q1operand1,q1operand2     q1field="" q1operator="" q1operand1="" q1operand2=""     
-[ExecuteStatement run]          showvariables q1field,q1operator,q1operand1,q1operand2         
-[CallStatement run] makeQueryFormula (in _FindSelectLib)
-[CallStatement run] editQueryRow (in _FindSelectLib)
TextDisplayObject RUN CODE --> call queryRowInsert,1
-[CallStatement run] queryRowInsert (in _FindSelectLib)
-[CallStatement run] initializeDimensions (in _FindSelectLib)
-[CallStatement run] adjustQueryHeight (in _FindSelectLib)
-[CallStatement run] makeQueryRow (in _FindSelectLib)
-[ExecuteStatement run]      fileglobal q2field,q2operator,q2operand1,q2operand2     q2field="" q2operator="" q2operand1="" q2operand2=""     
-[ExecuteStatement run]          showvariables q2field,q2operator,q2operand1,q2operand2         
-[CallStatement run] makeQueryFormula (in _FindSelectLib)
-[CallStatement run] editQueryRow (in _FindSelectLib)
PopupButtonObject RUN CODE --> call queryFieldChanged,2
-[CallStatement run] queryFieldChanged (in _FindSelectLib)
-[CallStatement run] initializeDimensions (in _FindSelectLib)
-[CallStatement run] makeQueryRow (in _FindSelectLib)
-[ExecuteStatement run]      fileglobal q2field,q2operator,q2operand1,q2operand2     q2field="" q2operator="" q2operand1="" q2operand2=""     
-[ExecuteStatement run]          showvariables q2field,q2operator,q2operand1,q2operand2         
-[CallStatement run] makeQueryFormula (in _FindSelectLib)
-[CallStatement run] editQueryRow (in _FindSelectLib)
PopupButtonObject RUN CODE --> call queryOperatorChanged,2
-[CallStatement run] queryOperatorChanged (in _FindSelectLib)
-[CallStatement run] initializeDimensions (in _FindSelectLib)
-[CallStatement run] makeQueryRow (in _FindSelectLib)
-[ExecuteStatement run]      fileglobal q2field,q2operator,q2operand1,q2operand2     q2field="" q2operator="" q2operand1="" q2operand2=""     
-[ExecuteStatement run]          showvariables q2field,q2operator,q2operand1,q2operand2         
-[CallStatement run] makeQueryFormula (in _FindSelectLib)
-[CallStatement run] editQueryRow (in _FindSelectLib)

(Note: Some code built into Panorama is protected and will not be recorded.)

Enabling Control Flow Recording with the Instrumentation Panel

If you are not using the Instrumentation Log window (see [Debug Instrumentation Monitoring using an External Program]), you can still enable control flow recording using the Instrumentation panel of the Preferences window. First, click on Objective-C Classes at the bottom of the list on the left, then choose the control flow statements you want to record in the log.

Click again to disable recording.


See Also


History

VersionStatusNotes
10.2NewNew in this version.