DBMS_DEBUG 系统包主要用于实现服务器端调试器,它提供了一种调试服务器端 PL 程序的方法。

通过 DBMS_DEBUG 系统包调试 PL 程序,需要至少两个数据库 session:一个是用于执行目标程序的 target session,另外一个是用于调试目标程序的 debug session。

Target session 用于调试初始化会话,对会话进行标记,以便 PL interpreter 运行在调试模式下并生成调试事件。调试事件生成后,将从会话中发布。在大多数情况下,调试事件需要返回通知:interpreter 暂停并等待答复。

同时,调试会话还必须使用 DBMS_DEBUG 进行自身初始化,用来了解它要监视哪个目标会话。之后,调试会话可以调用 DBMS_DEBUG 的入口点来读取从目标会话发布的事件并与目标会话进行通信。

DBMS_DEBUG 不提供到 PL 编译器的接口,但是它依赖于编译器生成的调试信息。如果没有调试信息,就无法检查或修改参数或变量的值。

DBMS_DEBUG 使用说明

使用以下语句之一(第二个语句为重新编译包或类型正文)可以为现有 PL 代码生成调试信息:

  1. ALTER [PROCEDURE | FUNCTION | PACKAGE | TRIGGER | TYPE] <name> COMPILE DEBUG;
  2. ALTER [PACKAGE | TYPE] <name> COMPILE DEBUG BODY;

Breakflags

以下为 CONTINUE 的 breakflags 参数值,这些标志可以组合在一起。

描述

break_next_line

在下一个源行中断(跨过调用)。

break_any_call

在下一个源行中断(分步调用)。

break_any_return

从当前入口点返回后中断(跳过从当前例程调用的任何入口点)。

break_return

下一次入口点准备返回时中断,包括从当前入口调用的入口点。如果解释器正在运行调用 Proc2 的 Proc1,那么 break_return 将在 Proc2 的末尾停止。

abort_execution

一旦 DBMS_DEBUG.CONTINUE 被调用则停止执行并强制“退出”事件 。

Information Flags

以下标识可以作为 info requested 参数传递给 YNCHRONIZECONTINUEGET_RUNTIME_INFO

标识

描述

info_getStackDepth

获取堆栈的当前深度。

info_getBreakpoint

获取断点编号。

info_getLineinfo

获取程序单元信息。

DBMS_DEBUG 子程序概览

下表列出了 OceanBase 数据库当前版本所支持的 DBMS_DEBUG 子程序以及简要描述。

子程序

描述

ATTACH_SESSION

将目标 DebugID 通知给调试会话。

CONTINUE

继续执行目标程序。

DEBUG_ON

打开调试模式。

DEBUG_OFF

关闭调试模式。

DETACH_SESSION

停止调试目标程序。

DELETE_BREAKPOINT

删除断点。

DISABLE_BREAKPOINT

禁用断点。

ENABLE_BREAKPOINT

激活现有断点。

GET_VALUE

从当前运行的程序中获取值。

GET_VALUES

返回当前栈帧的所有变量信息。

GET_RUNTIME_INFO

返回当前程序的有关信息。

GET_TIMEOUT_BEHAVIOUR

返回当前超时行为。

INITIALIZE

在目标会话中设置 DebugID。

PROBE_VERSION

返回服务器上 DBMS_DEBUG 的版本号。

PRINT_BACKTRACE

打印堆栈回溯。

SET_TIMEOUT

设置超时值。

SET_TIMEOUT_BEHAVIOUR

告诉监视线程发生超时时如何处理目标会话。

SET_BREAKPOINT

在程序单元中设置断点。

SHOW_BREAKPOINTS

返回当前断点的列表。