DBMS_DEBUG
is a PL/SQL interface to the PL/SQL debugger layer, Probe, in the Oracle server.
This API is primarily intended to implement server-side debuggers and it provides a way to debug server-side PL/SQL program units.
Note:
The term program unit refers to a PL/SQL program of any type (procedure, function, package, package body, trigger, anonymous block, object type, or object type body).This chapter contains the following topics:
Overview
Constants
Variables
Exceptions
Operational Notes
RECORD Types
TABLE Types
To debug server-side code, you must have two database sessions: one session to run the code in debug mode (the target session), and a second session to supervise the target session (the debug session).
The target session becomes available for debugging by making initializing calls with DBMS_DEBUG
. This marks the session so that the PL/SQL interpreter runs in debug mode and generates debug events. As debug events are generated, they are posted from the session. In most cases, debug events require return notification: the interpreter pauses awaiting a reply.
Meanwhile, the debug session must also initialize itself using DBMS_DEBUG
: This tells it which target session to supervise. The debug session may then call entry points in DBMS_DEBUG
to read events that were posted from the target session and to communicate with the target session.
The following subprograms are run in the target session (the session that is to be debugged):
DBMS_DEBUG
does not provide an interface to the PL/SQL compiler, but it does depend on debug information optionally generated by the compiler. Without debug information, it is not possible to examine or modify the values of parameters or variables.
A breakpoint status may have the following value:
breakpoint_status_unused
—breakpoint is not in use
Otherwise, the status is a mask of the following values:
breakpoint_status_active
—a line breakpoint
breakpoint_status_disabled
—breakpoint is currently disabled
breakpoint_status_remote
—a shadow breakpoint (a local representation of a remote breakpoint)
These values are returned by the various functions called in the debug session (SYNCHRONIZE
, CONTINUE
, SET_BREAKPOINT
, and so on). If PL/SQL exceptions worked across client/server and server/server boundaries, then these would all be exceptions rather than error codes.
Value | Description |
---|---|
success |
Normal termination |
Statuses returned by GET_VALUE
and SET_VALUE
:
Status | Description |
---|---|
error_bogus_frame |
No such entrypoint on the stack |
error_no_debug_info |
Program was compiled without debug symbols |
error_no_such_object |
No such variable or parameter |
error_unknown_type |
Debug information is unreadable |
error_indexed_table |
Returned by GET_VALUE if the object is a table, but no index was provided |
error_illegal_index |
No such element exists in the collection |
error_nullcollection |
Table is atomically NULL |
error_nullvalue |
Value is NULL |
Statuses returned by SET_VALUE
:
Status | Description |
---|---|
error_illegal_value |
Constraint violation |
error_illegal_null |
Constraint violation |
error_value_malformed |
Unable to decipher the given value |
error_other |
Some other error |
error_name_incomplete |
Name did not resolve to a scalar |
Statuses returned by the breakpoint functions:
Status | Description |
---|---|
error_no_such_breakpt |
No such breakpoint |
error_idle_breakpt |
Cannot enable or disable an unused breakpoint |
error_bad_handle |
Unable to set breakpoint in given program (nonexistent or security violation) |
General error codes (returned by many of the DBMS_DEBUG
subprograms):
Status | Description |
---|---|
error_unimplemented |
Functionality is not yet implemented |
error_deferred |
No program running; operation deferred |
error_exception |
An exception was raised in the DBMS_DEBUG or Probe packages on the server |
error_communication |
Some error other than a timeout occurred |
error_timeout |
Timout occurred |
Exception | Description |
---|---|
illegal_init |
DEBUG_ON was called prior to INITIALIZE |
The following exceptions are raised by procedure SELF_CHECK
:
Exception | Description |
---|---|
pipe_creation_failure |
Could not create a pipe |
pipe_send_failure |
Could not write data to the pipe |
pipe_receive_failure |
Could not read data from the pipe |
pipe_datatype_mismatch |
Datatype in the pipe was wrong |
pipe_data_error |
Data got garbled in the pipe |
There are two ways to ensure that debug information is generated: through a session switch, or through individual recompilation.
To set the session switch, enter the following statement:
ALTER SESSION SET PLSQL_DEBUG = true;
This instructs the compiler to generate debug information for the remainder of the session. It does not recompile any existing PL/SQL.
To generate debug information for existing PL/SQL code, use one of the following statements (the second recompiles a package or type body):
ALTER [PROCEDURE | FUNCTION | PACKAGE | TRIGGER | TYPE] <name> COMPILE DEBUG; ALTER [PACKAGE | TYPE] <name> COMPILE DEBUG BODY;
Figure 53-1 and Figure 53-2 illustrate the flow of operations in the session to be debugged and in the debugging session.
The interpreter pauses execution at the following times:
At startup of the interpreter so any deferred breakpoints may be installed prior to execution.
At any line containing an enabled breakpoint.
At any line where an interesting event occurs. The set of interesting events is specified by the flags passed to DBMS_DEBUG
.CONTINUE
in the breakflags
parameter.
There is no event for session termination. Therefore, it is the responsibility of the debug session to check and make sure that the target session has not ended. A call to DBMS_DEBUG
.SYNCHRONIZE
after the target session has ended causes the debug session to hang until it times out.
The diagram suggests that it is possible to set breakpoints prior to having a target session. This is true. In this case, Probe caches the breakpoint request and transmits it to the target session at first synchronization. However, if a breakpoint request is deferred in this fashion, then:
SET_BREAKPOINT
does not set the breakpoint number (it can be obtained later from SHOW_BREAKPOINTS
if necessary).
SET_BREAKPOINT
does not validate the breakpoint request. If the requested source line does not exist, then an error silently occurs at synchronization, and no breakpoint is set.
To debug Probe, there are diagnostics parameters to some of the calls in DBMS_DEBUG
. These parameters specify whether to place diagnostic output in the RDBMS tracefile. If output to the RDBMS tracefile is disabled, these parameters have no effect.
Exceptions that are declared in PL/SQL programs are known as user-defined exceptions. In addition, there are Oracle Errors (OERs) that are returned from the Oracle kernel. To tie the two mechanisms together, PL/SQL provides the exception_init
pragma that turns a user-defined exception into an OER, so that a PL/SQL handler may be used for it, and so that the PL/SQL engine can return OERs to the Oracle kernel. As of the current release, the only information available about an OER is its number. If two user-defined exceptions are exception_init'd to the same OER, they are indistinguishable.
Program units on the server reside in different namespaces. When setting a breakpoint, specify the desired namespace.
Namespace_cursor
contains cursors (anonymous blocks).
Namespace_pgkspec_or_toplevel
contains:
Package specifications.
Procedures and functions that are not nested inside other packages, procedures, or functions.
Object types.
Namespace_pkg_body
contains package bodies and type bodies.
Namespace_trigger
contains triggers.
These values are used to disambiguate among objects in a given namespace. These constants are used in PROGRAM_INFO
when Probe is giving a stack backtrace.
LibunitType_cursor
LibunitType_procedure
LibunitType_function
LibunitType_package
LibunitType_package_body
LibunitType_trigger
LibunitType_Unknown
These are values to use for the breakflags
parameter to CONTINUE
, in order to tell Probe what events are of interest to the client. These flags may be combined.
Value | Description |
---|---|
break_next_line |
Break at next source line (step over calls) |
break_any_call |
Break at next source line (step into calls) |
break_any_return |
Break after returning from current entrypoint (skip over any entrypoints called from the current routine) |
break_return |
Break the next time an entrypoint gets ready to return. (This includes entrypoints called from the current one. If interpreter is running Proc1 , which calls Proc2 , then break_return stops at the end of Proc2 .) |
break_exception |
Break when an exception is raised |
break_handler |
Break when an exception handler is executed |
abort_execution |
Stop execution and force an 'exit' event as soon as DBMS_DEBUG .CONTINUE is called. |
These are flags which may be passed as the info_requested
parameter to SYNCHRONIZE
, CONTINUE
, and GET_RUNTIME_INFO
.
Flag | Description |
---|---|
info_getStackDepth |
Get the current depth of the stack |
info_getBreakpoint |
Get the breakpoint number |
info_getLineinfo |
Get program unit information |
After CONTINUE
is run, the program either runs to completion or breaks on some line.
Reason | Description |
---|---|
reason_none |
- |
reason_interpreter_starting |
Interpreter is starting |
reason_breakpoint |
Hit a breakpoint |
reason_enter |
Procedure entry |
reason_return |
Procedure is about to return |
reason_finish |
Procedure is finished |
reason_line |
Reached a new line |
reason_interrupt |
An interrupt occurred |
reason_exception |
An exception was raised |
reason_exit |
Interpreter is exiting (old form) |
reason_knl_exit |
Kernel is exiting |
reason_handler |
Start exception-handler |
reason_timeout |
A timeout occurred |
reason_instantiate |
Instantiation block |
reason_abort |
Interpreter is aborting |
The DBMS_DEBUG
package defines RECORD
types and TABLE
types.
This type gives information about a breakpoint, such as its current status and the program unit in which it was placed.
TYPE breakpoint_info IS RECORD ( name VARCHAR2(30), owner VARCHAR2(30), dblink VARCHAR2(30), line# BINARY_INTEGER, libunittype BINARY_INTEGER, status BINARY_INTEGER);
Table 53-2 BREAKPOINT_INFO Fields
Field | Description |
---|---|
|
Name of the program unit |
|
Owner of the program unit |
|
Database link, if remote |
|
Line number |
|
|
|
See Constants for values of |
This type specifies a program location. It is a line number in a program unit. This is used for stack backtraces and for setting and examining breakpoints. The read-only fields are currently ignored by Probe for breakpoint operations. They are set by Probe only for stack backtraces.
TYPE program_info IS RECORD( -- The following fields are used when setting a breakpoint namespace BINARY_INTEGER, name VARCHAR2(30), owner VARCHAR2(30), dblink VARCHAR2(30), line# BINARY_INTEGER, -- Read-only fields (set by Probe when doing a stack backtrace) libunittype BINARY_INTEGER, entrypointname VARCHAR2(30));
Table 53-3 PROGRAM_INFO Fields
Field | Description |
---|---|
|
See Namespaces |
|
Name of the program unit |
|
Owner of the program unit |
|
Database link, if remote |
|
Line number |
|
|
|
A read-only field, to disambiguate among objects that share the same namespace (for example, procedure and package specifications). See the Libunit Types for more information. |
This type gives context information about the running program.
TYPE runtime_info IS RECORD( line# BINARY_INTEGER, terminated binary_integer, breakpoint binary_integer, stackdepth BINARY_INTEGER, interpreterdepth BINARY_INTEGER, reason BINARY_INTEGER, program program_info);
Table 53-5 DBMS_DEBUG Package Subprograms
Subprogram | Description |
---|---|
Notifies the debug session about the target debugID |
|
Continues execution of the target program |
|
Turns debug-mode off |
|
Turns debug-mode on |
|
Deletes a breakpoint |
|
Deletes an OER breakpoint |
|
Stops debugging the target program |
|
Disables a breakpoint |
|
Activates an existing breakpoint |
|
Executes SQL or PL/SQL in the target session |
|
Returns the set of indexes for an indexed table |
|
Provides additional source in the event of buffer overflow when using SHOW_SOURCE |
|
Returns information about line numbers in a program unit |
|
Returns information about the current program |
|
Returns the current timeout behavior |
|
Gets a value from the currently-running program |
|
Sets debugID in target session |
|
Pings the target session to prevent it from timing out |
|
Prints a stack backtrace |
|
Prints a stack backtrace |
|
Returns the version number of |
|
Performs an internal consistency check |
|
Sets a breakpoint in a program unit |
|
Sets an OER breakpoint |
|
Sets the timeout value |
|
Tells Probe what to do with the target session when a timeout occurs |
|
Sets a value in the currently-running program |
|
Returns a listing of the current breakpoints |
|
Fetches the frame source |
|
Fetches program source |
|
Waits for program to start running |
|
Returns |
This procedure notifies the debug session about the target program.
DBMS_DEBUG.ATTACH_SESSION ( debug_session_id IN VARCHAR2, diagnostics IN BINARY_INTEGER := 0);
This function passes the given breakflags (a mask of the events that are of interest) to Probe in the target process. It tells Probe to continue execution of the target process, and it waits until the target process runs to completion or signals an event.
If info_requested
is not NULL
, then calls GET_RUNTIME_INFO
.
DBMS_DEBUG.CONTINUE ( run_info IN OUT runtime_info, breakflags IN BINARY_INTEGER, info_requested IN BINARY_INTEGER := NULL) RETURN BINARY_INTEGER;
Table 53-7 CONTINUE Function Parameters
Parameter | Description |
---|---|
|
Information about the state of the program |
|
Mask of events that are of interest (see "Breakflags" ) |
|
Which information should be returned in |
Caution:
There must be a debug session waiting if immediate is TRUE
.
This procedure notifies the target session that debugging should no longer take place in that session. It is not necessary to call this function before ending the session.
This procedure marks the target session so that all PL/SQL is run in debug mode. This must be done before any debugging can take place.
DBMS_DEBUG.DEBUG_ON ( no_client_side_plsql_engine BOOLEAN := TRUE, immediate BOOLEAN := FALSE);
Table 53-9 DEBUG_ON Procedure Parameters
Parameter | Description |
---|---|
|
Should be left to its default value unless the debugging session is taking place from a client-side PL/SQL engine |
|
If this is |
This procedure stops debugging the target program. This procedure may be called at any time, but it does not notify the target session that the debug session is detaching itself, and it does not terminate execution of the target session. Therefore, care should be taken to ensure that the target session does not hang itself.
This function makes an existing breakpoint inactive but leaves it in place.
This function is the reverse of disabling. This enables a previously disabled breakpoint.
This procedure executes SQL or PL/SQL code in the target session. The target session is assumed to be waiting at a breakpoint (or other event). The call to DBMS_DEBUG
.EXECUTE
occurs in the debug session, which then asks the target session to execute the code.
DBMS_DEBUG.EXECUTE ( what IN VARCHAR2, frame# IN BINARY_INTEGER, bind_results IN BINARY_INTEGER, results IN OUT NOCOPY dbms_debug_vc2coll, errm IN OUT NOCOPY VARCHAR2);
Table 53-17 EXECUTE Procedure Parameters
Parameter | Description |
---|---|
|
SQL or PL/SQL source to execute |
|
The context in which to execute the code. Only -1 (global context) is supported at this time. |
|
Whether the source wants to bind to 0 = No 1 = Yes |
|
Collection in which to place results, if |
|
Error message, if an error occurred; otherwise, |
This example executes a SQL statement. It returns no results.
DECLARE coll sys.dbms_debug_vc2coll; -- results (unused) errm VARCHAR2(100); BEGIN dbms_debug.execute('insert into emp(ename,empno,deptno) ' || 'values(''LJE'', 1, 1)', -1, 0, coll, errm); END;
This example executes a PL/SQL block, and it returns no results. The block is an autonomous transaction, which means that the value inserted into the table becomes visible in the debug session.
DECLARE coll sys.dbms_debug_vc2coll; errm VARCHAR2(100); BEGIN dbms_debug.execute( 'DECLARE PRAGMA autonomous_transaction; ' || 'BEGIN ' || ' insert into emp(ename, empno, deptno) ' || ' values(''LJE'', 1, 1); ' || ' COMMIT; ' || 'END;', -1, 0, coll, errm); END;
This example executes a PL/SQL block, and it returns some results.
DECLARE coll sys.dbms_debug_vc2coll; errm VARCHAR2(100); BEGIN dbms_debug.execute( 'DECLARE ' || ' pp SYS.dbms_debug_vc2coll := SYS.dbms_debug_vc2coll(); ' || ' x PLS_INTEGER; ' || ' i PLS_INTEGER := 1; ' || 'BEGIN ' || ' SELECT COUNT(*) INTO x FROM emp; ' || ' pp.EXTEND(x * 6); ' || ' FOR c IN (SELECT * FROM emp) LOOP ' || ' pp(i) := ''Ename: '' || c.ename; i := i+1; ' || ' pp(i) := ''Empno: '' || c.empno; i := i+1; ' || ' pp(i) := ''Job: '' || c.job; i := i+1; ' || ' pp(i) := ''Mgr: '' || c.mgr; i := i+1; ' || ' pp(i) := ''Sal: '' || c.sal; i := i+1; ' || ' pp(i) := null; i := i+1; ' || ' END LOOP; ' || ' :1 := pp;' || 'END;', -1, 1, coll, errm); each := coll.FIRST; WHILE (each IS NOT NULL) LOOP dosomething(coll(each)); each := coll.NEXT(each); END LOOP; END;
Given a name of a variable or parameter, this function returns the set of its indexes, if it is an indexed table. An error is returned if it is not an indexed table.
DBMS_DEBUG.GET_INDEXES ( varname IN VARCHAR2, frame# IN BINARY_INTEGER, handle IN program_info, entries OUT index_table) RETURN BINARY_INTEGER;
Table 53-18 GET_INDEXES Function Parameters
Parameter | Description |
---|---|
|
Name of the variable to get index information about |
|
Number of frame in which the variable or parameter resides; |
|
Package description, if object is a package variable |
|
1-based table of the indexes: if non- |
When source does not fit in the buffer provided by that version of the SHOW_SOURCE Procedures which produce a formatted buffer, this procedure provides additional source.
DBMS_DEBUG.GET_MORE_SOURCE ( buffer IN OUT VARCHAR2, buflen IN BINARY_INTEGER, piece# IN BINARY_INTEGER);
Table 53-20 GET_MORE_SOURCE Procedure Parameters
Parameter | Description |
---|---|
|
The buffer |
|
The length of the buffer |
|
A value between 2 and the value returned in the parameter pieces from the call to the relevant version of the SHOW_SOURCE Procedures |
This function finds line and entrypoint information about a program so that a debugger can determine the source lines at which it is possible to place breakpoints.
DBMS_DEBUG.GET_LINE_MAP ( program IN program_info, maxline OUT BINARY_INTEGER, number_of_entry_points OUT BINARY_INTEGER, linemap OUT RAW) RETURN BINARY_INTEGER;
Table 53-21 GET_LINE_MAP Function Parameters
Parameter | Description |
---|---|
|
A top-level program unit (procedure / package / function / package body, and so on). Its |
|
The largest source code line number in 'program' |
|
The number of subprograms in 'program' |
|
A bitmap representing the executable lines of 'program'. If line number N is executable, bit number N MOD 8 will be set to 1 at linemap position N / 8. The length of returned linemap is either |
This function returns information about the current program. It is only needed if the info_requested
parameter to SYNCHRONIZE
or CONTINUE
was set to 0
.
Note:
This is currently only used by client-side PL/SQL.DBMS_DEBUG.GET_RUNTIME_INFO ( info_requested IN BINARY_INTEGER, run_info OUT runtime_info) RETURN BINARY_INTEGER;
Table 53-23 GET_RUNTIME_INFO Function Parameters
Parameter | Description |
---|---|
|
Which information should be returned in |
|
Information about the state of the program |
This procedure returns the current timeout behavior. This call is made in the target session.
Less functionality is supported on OER breakpoints than on code breakpoints. In particular, note that:
No "breakpoint number" is returned - the number of the OER is used instead. Thus it is impossible to set duplicate breakpoints on a given OER (it is a no-op).
It is not possible to disable an OER breakpoint (although clients are free to simulate this by deleting it).
OER breakpoints are deleted using delete_oer_breakpoint.
This function gets a value from the currently-running program. There are two overloaded GET_VALUE
functions.
DBMS_DEBUG.GET_VALUE ( variable_name IN VARCHAR2, frame# IN BINARY_INTEGER, scalar_value OUT VARCHAR2, format IN VARCHAR2 := NULL) RETURN BINARY_INTEGER;
Table 53-27 GET_VALUE Function Return Values
Return | Description |
---|---|
|
A successful completion |
|
Frame does not exist |
|
Entrypoint has no debug information |
|
|
|
The type information in the debug information is illegible |
|
Value is |
|
The object is a table, but no index was provided |
This form of GET_VALUE
is for fetching package variables. Instead of a frame#, it takes a handle, which describes the package containing the variable.
DBMS_DEBUG.GET_VALUE ( variable_name IN VARCHAR2, handle IN program_info, scalar_value OUT VARCHAR2, format IN VARCHAR2 := NULL) RETURN BINARY_INTEGER;
Table 53-29 GET_VALUE Function Return Values
Return | Description |
---|---|
|
One of the following: - Package does not exist - Package is not instantiated - User does not have privileges to debug the package - Object does not exist in the package |
|
The object is a table, but no index was provided |
This example illustrates how to get the value with a given package PACK
in schema SCOTT
, containing variable VAR
:
DECLARE handle dbms_debug.program_info; resultbuf VARCHAR2(500); retval BINARY_INTEGER; BEGIN handle.Owner := 'SCOTT'; handle.Name := 'PACK'; handle.namespace := dbms_debug.namespace_pkgspec_or_toplevel; retval := dbms_debug.get_value('VAR', handle, resultbuf, NULL); END;
This function initializes the target session for debugging.
DBMS_DEBUG.INITIALIZE ( debug_session_id IN VARCHAR2 := NULL, diagnostics IN BINARY_INTEGER := 0) RETURN VARCHAR2;
You cannot use DBMS_DEBUG
and the JDWP-based debugging interface simultaneously. This call will either fail with an ORA-30677 error if the session is currently being debugged with the JDWP-based debugging interface or, if the call succeeds, any further use of the JDWP-based interface to debug this session will be disallowed.
Calls to DBMS_DEBUG
will succeed only if either the caller or the specified debug role carries the DEBUG
CONNECT
SESSION
privilege. Failing that, an ORA-1031 error will be raised. Other exceptions are also possible if a debug role is specified but the password does not match, or if the calling user has not been granted the role, or the role is application-enabled and this call does not originate from within the role-enabling package.
The CREATE
ANY
PROCEDURE
privilege does not affect the visibility of routines through the debugger. A privilege DEBUG
for each object has been introduced with a corresponding DEBUG
ANY
PROCEDURE
variant. These are required in order to see routines owned by users other than the session's login user.
Authentication of the debug role and the check for DEBUG
CONNECT
SESSION
privilege will be done in the context of the caller to this routine. If the caller is a definer's rights routine or has been called from one, only privileges granted to the defining user, the debug role, or PUBLIC
will be used to check for DEBUG
CONNECT
SESSION
. If this call is from within a definer's rights routine, the debug role, if specified, must be one that has been granted to that definer, but it need not also have been granted to the session login user or be enabled in the calling session at the time the call is made.
The checks made by the debugger after this call is made looking for the DEBUG
privilege on individual procedures will be done in the context of the session's login user, the roles that were enabled at session level at the moment this call was made (even if those roles were not available within a definer's rights environment of the call), and the debug role.
This procedure pings the target session to prevent it from timing out. Use this procedure when execution is suspended in the target session, for example at a breakpoint.
If the timeout_behaviour
is set to retry_on_timeout
then this procedure is not necessary.
Oracle will display the no_target_program
exception if there is no target program or if the target session is not currently waiting for input from the debug session.
Timeout options for the target session are registered with the target session by calling set_timeout_behaviour:
retry_on_timeout
- Retry. Timeout has no effect. This is like setting the timeout to an infinitely large value.
continue_on_timeout
- Continue execution, using same event flags.
nodebug_on_timeout
- Turn debug-mode OFF (in other words, call debug_off) and then continue execution. No more events will be generated by this target session unless it is re-initialized by calling debug_on.
abort_on_timeout
- Continue execution, using the abort_execution flag, which should cause the program to terminate immediately. The session remains in debug-mode.
retry_on_timeout CONSTANT BINARY_INTEGER:= 0;
continue_on_timeout CONSTANT BINARY_INTEGER:= 1;
nodebug_on_timeout CONSTANT BINARY_INTEGER:= 2;
abort_on_timeout CONSTANT BINARY_INTEGER:= 3;
This procedure prints a backtrace listing of the current execution stack. This should only be called if a program is currently running.
There are two overloaded PRINT_BACKTRACE
procedures.
DBMS_DEBUG.PRINT_BACKTRACE ( listing IN OUT VARCHAR2); DBMS_DEBUG.PRINT_BACKTRACE ( backtrace OUT backtrace_table);
Table 53-31 PRINT_BACKTRACE Procedure Parameters
Parameter | Description |
---|---|
|
A formatted character buffer with embedded newlines |
|
1-based indexed table of backtrace entries. The currently-running procedure is the last entry in the table (that is, the frame numbering is the same as that used by |
This procedure returns a list of the packages that have been instantiated in the current session.
DBMS_DEBUG.PRINT_INSTANTIATIONS ( pkgs IN OUT NOCOPY backtrace_table, flags IN BINARY_INTEGER);
Table 53-32 PRINT_INSTANTIATIONS Procedure Parameters
Parameter | Description |
---|---|
|
The instantiated packages |
|
Bitmask of options:
|
This procedure performs an internal consistency check. SELF_CHECK
also runs a communications test to ensure that the Probe processes are able to communicate.
If SELF_CHECK
does not return successfully, then an incorrect version of DBMS_DEBUG
was probably installed on this server. The solution is to install the correct version (pbload
.sql
loads DBMS_DEBUG
and the other relevant packages).
Table 53-35 SELF_CHECK Procedure Exceptions
Exception | Description |
---|---|
|
Probe version is inconsistent |
|
Could not create a pipe |
|
Could not write data to the pipe |
|
Could not read data from the pipe |
|
Datatype in the pipe was wrong |
|
Data got garbled in the pipe |
All of these exceptions are fatal. They indicate a serious problem with Probe that prevents it from working correctly.
This function sets a breakpoint in a program unit, which persists for the current session. Execution pauses if the target program reaches the breakpoint.
DBMS_DEBUG.SET_BREAKPOINT ( program IN program_info, line# IN BINARY_INTEGER, breakpoint# OUT BINARY_INTEGER, fuzzy IN BINARY_INTEGER := 0, iterations IN BINARY_INTEGER := 0) RETURN BINARY_INTEGER;
Table 53-36 SET_BREAKPOINT Function Parameters
Parameter | Description |
---|---|
|
Information about the program unit in which the breakpoint is to be set. (In version 2.1 and later, the namespace, name, owner, and dblink may be set to |
|
Line at which the breakpoint is to be set |
|
On successful completion, contains the unique breakpoint number by which to refer to the breakpoint |
|
Only applicable if there is no executable code at the specified line: 0 means return 1 means search forward for an adjacent line at which to place the breakpoint -1 means search backward for an adjacent line at which to place the breakpoint |
|
Number of times to wait before signalling this breakpoint |
This procedure tells Probe what to do with the target session when a timeout occurs. This call is made in the target session.
Table 53-41 SET_TIMEOUT_BEHAVIOUR Procedure Parameters
Parameter | Description |
---|---|
|
|
|
Retry. Timeout has no effect. This is like setting the timeout to an infinitely large value. |
|
Continue execution, using same event flags |
|
Turn debug-mode OFF (in other words, call |
|
Continue execution, using the |
This function sets a value in the currently-running program. There are two overloaded SET_VALUE
functions.
DBMS_DEBUG.SET_VALUE ( frame# IN binary_integer, assignment_statement IN varchar2) RETURN BINARY_INTEGER; DBMS_DEBUG.SET_VALUE ( handle IN program_info, assignment_statement IN VARCHAR2) RETURN BINARY_INTEGER;
Table 53-42 SET_VALUE Function Parameters
Parameter | Description |
---|---|
|
Frame in which the value is to be set; 0 means the currently executing frame. |
|
Description of the package containing the variable |
|
An assignment statement (which must be legal PL/SQL) to run in order to set the value. For example, 'x := 3;'. Only scalar values are supported in this release. The right side of the assignment statement must be a scalar. |
Table 53-43 SET_VALUE Function Return Values
Return | Description |
---|---|
|
- |
|
Not possible to set it to that value |
|
Cannot set to |
|
Value is not a scalar |
|
The assignment statement does not resolve to a scalar. For example, 'x := 3;', if x is a record. |
|
One of the following: - Package does not exist - Package is not instantiated - User does not have privileges to debug the package - Object does not exist in the package |
In some cases, the PL/SQL compiler uses temporaries to access package variables, and does not guarantee to update such temporaries. It is possible, although unlikely, that modification to a package variable using SET_VALUE
might not take effect for a line or two.
There are two overloaded procedures that return a listing of the current breakpoints. There are three overloaded SHOW_BREAKPOINTS
procedures.
DBMS_DEBUG.SHOW_BREAKPOINTS ( listing IN OUT VARCHAR2); DBMS_DEBUG.SHOW_BREAKPOINTS ( listing OUT breakpoint_table); DBMS_DEBUG.SHOW_BREAKPOINTS ( code_breakpoints OUT breakpoint_table, oer_breakpoints OUT oer_table);
Table 53-44 SHOW_BREAKPOINTS Procedure Parameters
Parameter | Description |
---|---|
|
A formatted buffer (including newlines) of the breakpoints. Indexed table of breakpoint entries. The breakpoint number is indicated by the index into the table. Breakpoint numbers start at 1 and are reused when deleted. |
|
The indexed table of breakpoint entries, indexed by breakpoint number |
|
The indexed table of OER breakpoints, indexed by OER |
The procedure gets the source code. There are two overloaded SHOW_SOURCE
procedures.
DBMS_DEBUG.SHOW_FRAME_SOURCE ( first_line IN BINARY_INTEGER, last_line IN BINARY_INTEGER, source IN OUT NOCOPY vc2_table, frame_num IN BINARY_INTEGER);
Table 53-45 SHOW_FRAME_SOURCE Procedure Parameters
Parameter | Description |
---|---|
|
Line number of first line to fetch (PL/SQL programs always start at line 1 and have no holes) |
|
Line number of last line to fetch. No lines are fetched past the end of the program. |
|
The resulting table, which may be indexed by line# |
|
1-based frame number |
You use this function only when backtrace shows an anonymous unit is executing at a given frame position and you need to view the source in order to set a breakpoint.
If frame number is top of the stack and it's an anonymous block then SHOW_SOURCE
can also be used.
If it's a stored PLSQL package/function/procedure then use SQL as described in the Usage Notes to SHOW_SOURCE Procedures.
The procedure gets the source code. There are two overloaded SHOW_SOURCE
procedures.
DBMS_DEBUG.SHOW_SOURCE ( first_line IN BINARY_INTEGER, last_line IN BINARY_INTEGER, source OUT vc2_table); DBMS_DEBUG.SHOW_SOURCE ( first_line IN BINARY_INTEGER, last_line IN BINARY_INTEGER, window IN BINARY_INTEGER, print_arrow IN BINARY_INTEGER, buffer IN OUT VARCHAR2, buflen IN BINARY_INTEGER, pieces OUT BINARY_INTEGER);
Table 53-46 SHOW_SOURCE Procedure Parameters
Parameter | Description |
---|---|
|
Line number of first line to fetch (PL/SQL programs always start at line 1 and have no holes) |
|
Line number of last line to fetch. No lines are fetched past the end of the program. |
|
The resulting table, which may be indexed by line# |
|
'Window' of lines (the number of lines around the current source line) |
|
Nonzero means to print an arrow before the current line |
|
Buffer in which to place the source listing |
|
Length of buffer |
|
Set to nonzero if not all the source could be placed into the given buffer |
An indexed table of source-lines. The source lines are stored starting at first_line
. If any error occurs, then the table is empty.
The best way to get the source code (for a program that is being run) is to use SQL. For example:
DECLARE info DBMS_DEBUG.runtime_info; BEGIN -- call DBMS_DEBUG.SYNCHRONIZE, CONTINUE, -- or GET_RUNTIME_INFO to fill in 'info' SELECT text INTO <buffer> FROM all_source WHERE owner = info.Program.Owner AND name = info.Program.Name AND line = info.Line#; END;
However, this does not work for nonpersistent programs (for example, anonymous blocks and trigger invocation blocks). For nonpersistent programs, call SHOW_SOURCE
. There are two flavors: one returns an indexed table of source lines, and the other returns a packed (and formatted) buffer.
The second overloading of SHOW_SOURCE
returns the source in a formatted buffer, complete with line-numbers. It is faster than the indexed table version, but it does not guarantee to fetch all the source.
If the source does not fit in bufferlength (buflen
), then additional pieces can be retrieved using the GET_MORE_SOURCE
procedure (pieces
returns the number of additional pieces that need to be retrieved).
This function waits until the target program signals an event. If info_requested
is not NULL
, then it calls GET_RUNTIME_INFO
.
DBMS_DEBUG.SYNCHRONIZE ( run_info OUT runtime_info, info_requested IN BINARY_INTEGER := NULL) RETURN BINARY_INTEGER;
Table 53-47 SYNCHRONIZE Function Parameters
Parameter | Description |
---|---|
|
Structure in which to write information about the program. By default, this includes information about what program is running and at which line execution has paused. |
|
Optional bit-field in which to request information other than the default (which is |