You can cause debugging to be triggered at a specific point in your code by using the CBL_DEBUGBREAK and CBL_DEBUG_START library routines. This is particularly useful for debugging Windows dynamic link libraries that are called by other programs.
These statements are often included through conditional compilation so that they can be enabled or disabled by setting a directive. In the example below, CBL_DEBUGBREAK is called only if the user sets CONSTANT DEBUG(1) as a compiler directive before building the application.
Use CBL_DEBUGBREAK to invoke the debugger (Windows) or Animator (UNIX).
Alternatively use CBL_DEBUG_START and CBL_DEBUG_STOP to respectively attach and detach the debugger to the application. These routines include parameters that give you more control over debugging, such as identifying which debugger process should start and how long to wait for it to do so.
The debugger remains in a wait state until CBL_DEBUGBREAK or CBL_DEBUG_START is executed. If you use CBL_DEBUG_START you can then use CBL_DEBUG_STOP to detach the debugger from the application, which resumes running without the debugging features.
perform with test after
until char not = "Y" and char not = "y"
call clear-screen
display
"To select a square type a number between 1 and 9"
upon crt
perform init
move "Shall I start ? " to question
perform get-reply
$if DEBUG defined
call "CBL_DEBUGBREAK"
$end
if char = "Y" or char = "y"
move 10 to check(5)
perform put-move
end-if
perform new-move
until game not = spaces
move "Play again ? " to question
perform get-reply
end-perform.
working-storage section.
copy 'cbltypes.cpy'.
01 dbg.
02 flgs cblt-os-flags.
02 tmout cblt-os-ssize.
02 identifier pic x(80) value "XsessID ".
02 st-code pic x(2) COMP-5.
01 transaction pic x(80).
01 stop-flags cblt-os-flags.
01 argument pic x(80).
procedure division.
move "transaction" to argument
*> Set CBL_DEBUG_START flags to :-
*> Start debugging via a waiting debugger,
*> when a debuggable program is entered.
*> Error if no debugger is available.
*>
move h"03" to flgs
move 0 to tmout
*> Set CBL_DEBUG_STOP flags to :-
*> Stop debugging and return the debugger to
*> a waiting state
*>
move h"01" to stop-flags
*> Run the transaction
perform run-transaction
call "CBL_THREAD_SLEEP" using by value 5000 size 4
*> Run the transaction
perform run-transaction
stop run.
run-transaction section.
call "CBL_DEBUG_START" using by value flgs
tmout
by reference identifier
returning st-code
if st-code not = 0
display "No waiting debugger"
goback
end-if
call argument
call "CBL_DEBUG_STOP" using by value stop-flags
returning st-code
if st-code not = 0
display "Failed to stop debugger"
end-if
.