/sys$common/syshlp/DBG$HELP.HLB  —  DEBUG  CALL
    Calls a routine that was linked with your program.

    Format

      CALL  routine-name [(argument[, . . . ])]

1  –  Parameters

 routine-name

    Specifies the name or the memory address of the routine to be
    called.

 argument

    Specifies an argument required by the routine. Arguments can be
    passed by address, by descriptor, by reference, and by value, as
    follows:

    %ADDR   (Default, except for C and C++.) Passes the argument by
            address. The format is as follows:

            CALL routine-name (%ADDR address-expression)

            The debugger evaluates the address expression and
            passes that address to the routine specified. For
            simple variables (such as X), the address of X is
            passed into the routine. This passing mechanism is how
            Fortran implements ROUTINE(X). In other words, for named
            variables, using %ADDR corresponds to a call by reference
            in Fortran. For other expressions, however, you must use
            the %REF function to call by reference. For complex or
            composite variables (such as arrays, records, and access
            types), the address is passed when you specify %ADDR,
            but the called routine might not handle the passed data
            properly. Do not specify a literal value (a number or an
            expression composed of numbers) with %ADDR.
    %DESCR  Passes the argument by descriptor. The format is as
            follows:

            CALL routine-name (%DESCR language-expression)

            The debugger evaluates the language expression and
            builds a standard descriptor to describe the value. The
            descriptor is then passed to the routine you named. You
            would use this technique to pass strings to a Fortran
            routine.
    %REF    Passes the argument by reference. The format is as
            follows:

            CALL routine-name (%REF language-expression)

            The debugger evaluates the language expression and passes
            a pointer to the value, into the called routine. This
            passing mechanism corresponds to the way Fortran passes
            the result of an expression.
    %VAL    (Default for C and C++.) Passes the argument by value.
            The format is as follows:

            CALL routine-name (%VAL language-expression)

            The debugger evaluates the language expression and passes
            the value directly to the called routine.

2  –  Qualifiers

2.1    /AST

       /AST (default)
       /NOAST

    Controls whether the delivery of asynchronous system traps
    (ASTs) is enabled or disabled during the execution of the called
    routine. The /AST qualifier enables the delivery of ASTs in the
    called routine. The /NOAST qualifier disables the delivery of
    ASTs in the called routine. If you do not specify /AST or /NOAST
    with the CALL command, the delivery of ASTs is enabled unless you
    have previously entered the DISABLE AST command.

2.2    /SAVE_VECTOR_STATE

       /SAVE_VECTOR_STATE
       /NOSAVE_VECTOR_STATE (default)

    Applies to VAX vectorized programs. Controls whether the current
    state of the vector processor is saved and then restored when a
    routine is called with the CALL command.

    The state of the vector processor comprises the following:

    o  The values of the vector registers (V0 to V15) and the vector
       control registers (VCR, VLR, and VMR)

    o  Any vector exception (an exception caused by the execution of
       a vector instruction) that might be pending delivery

    When you use the CALL command to execute a routine, execution
    of the routine might change the state of the vector processor as
    follows:

    o  By changing the values of vector registers or vector control
       registers

    o  By causing a vector exception

    o  By causing the delivery of a vector exception that was pending
       when the CALL command was issued

    The /SAVE_VECTOR_STATE qualifier specifies that after the called
    routine has completed execution, the debugger restores the state
    of the vector processor that exists before the CALL command is
    issued. This ensures that, after the called routine has completed
    execution:

    o  Any vector exception that was pending delivery before the CALL
       command was issued is still pending delivery

    o  No vector exception that was triggered during the routine call
       is still pending delivery

    o  The values of the vector registers are identical to their
       values before the CALL command was issued

    The /NOSAVE_VECTOR_STATE qualifier (which is the default)
    specifies that the state of the vector processor that exists
    before the CALL command is issued is not restored by the debugger
    after the called routine has completed execution. In this case,
    the state of the vector processor after the routine call depends
    on the effect (if any) of the called routine.

    The /[NO]SAVE_VECTOR_STATE qualifiers have no effect on the
    general registers. The values of these registers are always saved
    and restored when you execute a routine with the CALL command.

3  –  Description

    The CALL command is one of the four debugger commands that
    can be used to execute your program (the others are GO, STEP,
    and EXIT). The CALL command enables you to execute a routine
    independently of the normal execution of your program. The CALL
    command executes a routine whether or not your program actually
    includes a call to that routine, as long as the routine was
    linked with your program.

    When you enter a CALL command, the debugger takes the following
    actions. For more information, see the qualifier descriptions.

    1. Saves the current values of the general registers.

    2. Constructs an argument list.

    3. Executes a call to the routine specified in the command and
       passes any arguments.

    4. Executes the routine.

    5. Displays the value returned by the routine in the return
       status register. By convention, after a called routine has
       executed, register R0 contains the function return value
       (if the routine is a function) or the procedure completion
       status (if the routine is a procedure that returns a status
       value). If a called procedure does not return a status value
       or function value, the value in R0 might be meaningless, and
       the "value returned" message can be ignored.

    6. Restores the values of the general registers to the values
       they had just before the CALL command was executed.

    7. Issues the prompt.

    The debugger assumes that the called routine conforms to the
    procedure calling standard (see the OpenVMS Calling Standard).
    However, the debugger does not know about all the argument-
    passing mechanisms for all supported languages. Therefore,
    you might need to specify how to pass parameters, for example,
    use CALL SUB1(%VAL X) rather than CALL SUB1(X). For complete
    information about how arguments are passed to routines, see your
    language documentation.

    When the current language is C or C++, the CALL command by
    default now passes arguments by value rather than by reference.
    In addition, you can now pass the following arguments without
    using a passing mechanism lexical (such as %REF or %VAL):

    o  Routine references

    o  Quoted strings (treated as %REF strings)

    o  Structures, records, and objects

    o  Floating-point parameters by value in F_, D_, G_, S_, and T_
       floating format by dereferencing a variable of that type.

    If the routine contains parameters that are not read-only, the
    values assigned to parameters may not be visible, and access
    to values is unreliable. This is because the debugger adjusts
    parameter values in an internal argument list, not the program
    argument list. To examine changing values, consider using static
    variables instead of parameters.

    The CALL command converts all floating-point literals to F_
    floating format for VAX and Alpha systems and T_floating format
    for Integrity servers.

    On Alpha, passing a floating-point literal in a format other than
    F_floating is not supported, as shown in the example below.

    A common debugging technique at an exception breakpoint
    (resulting from a SET BREAK/EXCEPTION or STEP/EXCEPTION command)
    is to call a dump routine with the CALL command. When you enter
    the CALL command at an exception breakpoint, any breakpoints,
    tracepoints, or watchpoints that were previously set within the
    called routine are temporarily disabled so that the debugger does
    not lose the exception context. However, such eventpoints are
    active if you enter the CALL command at a location other than an
    exception breakpoint.

4  –  Description, Continued...

    When an exception breakpoint is triggered, execution is suspended
    before any application-declared condition handler is invoked.
    At an exception breakpoint, entering a GO or STEP command after
    executing a routine with the CALL command causes the debugger to
    resignal the exception (see the GO and STEP commands).

    On Alpha processors, you cannot debug routines that are activated
    before the routine activated by a CALL command. For example, your
    program is stopped in routine MAIN, and you set a breakpoint in
    routine SORT. You issue the debugger command CALL SORT. While
    debugging routine SORT, you cannot debug routine MAIN. You must
    first return from the call to routine SO RT.

    If you are debugging a multiprocess program, the CALL command is
    executed in the context of the current process set. In addition,
    when debugging a multiprocess program, the way in which execution
    continues in your process depends on whether you entered a SET
    MODE [NO]INTERRUPT command or a SET MODE [NO]WAIT command. By
    default (SET MODE NOINTERRUPT), when one process stops, the
    debugger takes no action with regard to the other processes.
    Also by default (SET MODE WAIT), the debugger waits until
    all processes in the current process set have stopped before
    prompting for a new command.

    Related commands:

       GO
       EXIT
       SET PROCESS
       SET MODE [NO]INTERRUPT
       STEP

5  –  Examples

    1.DBG> CALL SUB1(X)
      value returned is 19
      DBG>

      This command calls routine SUB1, with parameter X (by default,
      the address of X is passed). In this case, the routine returns
      the value 19.

    2.DBG> CALL SUB(%REF 1)
      value returned is 1
      DBG>

      This command passes a pointer to a memory location containing
      the numeric literal 1, into the routine SUB.

    3.DBG> SET MODULE SHARE$LIBRTL
      DBG> CALL LIB$SHOW_VM
       1785 calls to LIB$GET_VM, 284 calls to LIB$FREE_VM, 122216 bytes
       still allocated, value returned is 00000001
      DBG>

      This example calls Run-Time Library routine LIB$SHOW_VM
      (in shareable image LIBRTL) to display memory statistics.
      The SET MODULE command makes the universal symbols (routine
      names) in LIBRTL visible in the main image. See also the SHOW
      MODULE/SHARE command.

    4.DBG> CALL testsub (%val 11.11, %val 22.22, %val 33.33)

      This example passes floating-point parameters by value, to a
      C subroutine with the function prototype void testsub (float,
      float, float). The floating-point parameters are passed in F_
      floating format.
Close Help