This technique is useful for running the Debugger as a tool started from one application to debug other applications. The invoking procedure runs the Debugger much like a subroutine, but it does not specify any procedure for the Debugger to run as its initial current procedure. You must run all procedures you want to debug from the Debugger after it starts by using the Run option on the Debug menu.

To start the Debugger from an ABL procedure while blocking the invoking procedure:

  1. Optionally, define a logical variable you can use to assign the return value for the DEBUGGER system handle method.
  2. Add a DEBUGGER system handle statement that invokes the DEBUG( ) method at the point where you want to start the Debugger.
In the following example, the procedure presents four execution options. The first three options invoke procedures. The fourth option invokes the DEBUG( ) method and blocks at the subsequent statement (line 33) while the Debugger runs, as shown:

        1   DEFINE VARIABLE procname   AS CHARACTER NO-UNDO EXTENT 3.
        2   DEFINE VARIABLE programNum AS INTEGER   NO-UNDO INITIAL 1
        3      VIEW-AS RADIO-SET
        4      RADIO-BUTTONS "Customer Report", 1,
        5                    "Order Report", 2,
        6                    "Item Report", 3,
        7                    "Other", 4.
        8   DEFINE BUTTON runReport LABEL "Run Report".
        9   DEFINE BUTTON done LABEL "Done".
       10   
       11   /* Initialize the list of procedure names to be run */
       12   procname[1] = "custrpt.p".
       13   procname[2] = "ordrpt.p".
       14   procname[3] = "itemrpt.p".
       15   
       16   DISPLAY "R E P O R T I N G   S Y S T E M" SKIP(1)
       17            WITH COLUMN 18 NO-BOX.
       18     FORM
       19       SKIP(1) space(1) programNum
       20       SKIP(1) SPACE(1) runReport SPACE(2) done SPACE(1)
       21       SKIP(1)
       22       WITH FRAME mainMenu
       23       COLUMN 21 NO-LABELS
       24       TITLE "M A I N   M E N U".
       25   
       26     ON 'choose':U OF runReport IN FRAME mainMenu
       27     DO:
       28       ASSIGN programNum.
       29       IF programNum < 4 THEN
       30           RUN VALUE(procname[programNum]).
       31       ELSE
       32           DEBUGGER:DEBUG().
  =>   33     END.
       34   
       35   ON 'choose':U OF done IN FRAME mainMenu
       36       APPLY "close" TO THIS-PROCEDURE.
       37   
       38   ENABLE ALL WITH FRAME mainMenu.
       39   WAIT-FOR CLOSE OF THIS-PROCEDURE.

When the Debugger starts, you can open a procedure using File > Open and then run the procedure using Debug > Run.

As a result, while the invoking procedure waits on the blocked statement, the Debugger runs on its own, allowing you to control any other procedure that you start from it.

When you exit the Debugger, it returns control to the invoking procedure, which continues execution from the next statement (line 33 in the example). In stand-alone mode, you cannot otherwise access the invoking procedure until the Debugger returns control.