59 DBMS_DEBUG_JDWP
DBMS_DEBUG_JDWP
は、Java Debug Wire Protocol (JDWP)を介してPL/SQLストアド・プロシージャとJavaストアド・プロシージャのデバッグを開始および制御するためのインタフェースを提供します。
59.1 DBMS_DEBUG_JDWPの概要
Oracleでは、JDWPを介したPL/SQLストアド・プロシージャおよびJavaストアド・プロシージャのデバッグをサポートしています。DBMS_DEBUG_JDWP
パッケージを使用すると、次のことを実行できます。
-
現在のセッションのセッションIDおよびシリアル番号を取得します。
-
JDWPを介してデバッガにデータベース・セッションを接続します。
-
PL/SQLプログラムの値がJDWPを介して表示される形式を変更するようにNLSパラメータを設定します。
59.2 DBMS_DEBUG_JDWPのセキュリティ・モデル
DBMS_DEBUG_JDWP
サブプログラムを起動するデバッグ・ユーザーには、ターゲット・データベース・セッションをデバッガに接続する権限が必要です。
表59-1 システム権限
システム権限 | 説明 |
---|---|
|
ユーザーが現在のセッションをデバッガに接続することを許可します。 |
|
ユーザーがログオン・ユーザーによるセッションをデバッガに接続することを許可します。 |
また、ユーザーに、別のユーザーのセッションをデバッグするための次のユーザー権限を付与することもできます。
表59-2 ユーザー権限
ユーザー権限 | 説明 |
---|---|
|
ユーザーが別のユーザーまたは自分のセッションをデバッグするために、指定されたユーザーのログオン・セッションのいずれかをデバッガに接続することを許可します。 |
59.3 DBMS_DEBUG_JDWPサブプログラムの要約
この表は、DBMS_DEBUG_JDWP
サブプログラムを示し、簡単に説明しています。
表59-3 DBMS_DEBUG_JDWPパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
指定されたセッションを、 |
|
現在のセッションのセッションIDを取得します。 |
|
現在のセッションのセッション・シリアル番号を取得します。 |
|
指定されたセッションが接続されているデバッガからこれを切断します。 |
|
PL/SQLプログラムの |
|
直接アプリケーション・コードを変更せずに、セッションをデバッガに接続します。 |
|
PL/SQLプログラムの |
59.3.1 CONNECT_TCPプロシージャ
このプロシージャは、指定されたセッションを、host:port
で待機しているデバッガに接続します。
構文
DBMS_DEBUG_JDWP.CONNECT_TCP( host IN VARCHAR2, port IN VARCHAR2, session_id IN PLS_INTEGER := NULL, session_serial IN PLS_INTEGER := NULL, debug_role IN VARCHAR2 := NULL, debug_role_pwd IN VARCHAR2 := NULL, option_flags IN PLS_INTEGER := 0, extensions_cmd_set IN PLS_INTEGER := 128);
パラメータ
表59-4 CONNECT_TCPのパラメータ
パラメータ | 説明 |
---|---|
|
デバッガが待機しているホスト名 |
|
デバッガが待機しているポート番号 |
|
セッションID |
|
セッション番号 |
|
デバッグ・ロール |
|
デバッグ・パスワード |
|
値:
これらは、複数のオプションを選択できるように一緒に追加できます。 |
|
Oracle JDWP拡張コマンド・セットのID |
例外
表59-5 CONNECT_TCPの例外
例外 | 説明 |
---|---|
|
セッションIDが無効です。 |
|
権限が不十分です。 |
|
セッションはすでにデバッガに接続されています。 |
|
引数 |
|
引数 |
|
デバッガへの接続の確立で障害が発生しました。 |
使用上のノート
-
現在のセッションをデバッガに接続するには、
session_id
パラメータとsession_serial
パラメータの両方にNULL
を渡します。 -
別のセッションを接続するには、そのIDとシリアルを確認する必要があります。これらは、
v$plsql_debuggable_sessions
ビューで入手できます。これらの値をユーザーが確認できるユーザー・インタフェースの例として、Oracle Enterprise Managerのインスタンス・マネージャ・オプションがあります。また、自分自身のセッションのこれらの値を確認するには、CURRENT_SESSION_IDファンクションおよびCURRENT_SESSION_SERIALファンクションを使用することもできます。 -
debug_role
引数およびdebug_role_pwd
引数を使用すると、ロールに「debug role」という名前を付けることができます。これにより、セッションに接続するための権限のチェック、およびデバッグ対象のセッション内のオブジェクトで使用可能な権限のチェックを行う場合に、チェックするための権限を入手できます。ロールとそのパスワードはここでは識別子ではなく、文字列として渡されるため、二重引用符は使用できませんが、大/小文字は区別されます。元のロール名が二重引用符で囲まれていなかった場合は、ここでは大文字で指定する必要があります。 -
ORA-30677
は、要求されたセッションがすでにデバッグされていることを示します。この場合、ユーザーに既存の接続からセッションをスティールすることを確認するよう求めることをお薦めします。明示的な切断コールまたはconnect_force_connect
オプション・ビットを使用すると、接続が2番目の試行を実行することが可能になります。connect_force_connect
ビットを使用すると、セッションがデバッガを介して現在停止されている場合に自由に実行されなくなります。つまり、このビットを使用すると、セッションの状態に実際に影響を与えることなく、デバッガ間でセッションをスティールできます。
59.3.2 CURRENT_SESSION_IDファンクション
このファンクションは、現在のセッションのセッションIDを取得します。
構文
DBMS_DEBUG_JDWP.CURRENT_SESSION_ID RETURN PLS_INTEGER;
59.3.3 CURRENT_SESSION_SERIALファンクション
このファンクションは、現在のセッションのセッション番号を取得します。
構文
DBMS_DEBUG_JDWP.CURRENT_SESSION_SERIAL RETURN PLS_INTEGER;
59.3.4 DISCONNECTプロシージャ
このプロシージャは、指定されたセッションが接続されているデバッガからこれを切断します。
構文
DBMS_DEBUG_JDWP.DISCONNECT( session_id IN PLS_INTEGER := NULL, session_serial IN PLS_INTEGER := NULL);
パラメータ
表59-6 DISCONNECTプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
セッションID |
|
セッション番号 |
使用上のノート
-
切断するセッションが現在のセッションの場合は、デバッガの切断後にセッションを自由に実行できます。それ以外の場合、セッションは終了します。
-
現在のセッションを切断する場合、およびコール時の有効なユーザーが権限が必要ないセッションのログイン・ユーザーと同じ場合を除いて、接続に関してはこのコールに同じ権限が必要です。
59.3.5 GET_NLS_PARAMETERファンクション
このファンクションは、PL/SQLプログラムのNUMBER
、DATE
、TIME (WITH TIME ZONE)
およびTIMESTAMP (WITH TIME ZONE)
の実行時の値がJDWPを介して表示される文字列に変換される形式に影響を与える、指定されたNLSパラメータの値を取得します。
これらの値は、現在のセッション専用ですが、デバッガ・メカニズム専用でもあります。デバッグ対象のプログラム内の値の変換に使用される値とは異なります。
構文
DBMS_DEBUG_JDWP.GET_NLS_PARAMETER( name IN VARCHAR2) RETURN VARCHAR2;
パラメータ
表59-7 GET_NLS_PARAMETERファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
指定されたNLSパラメータ |
使用上のノート
-
変数値がJDWPを介して読み込まれるまたは割り当てられる場合、または
GET_NLS_PARAMETERファンクション
またはSET_NLS_PARAMETERプロシージャ
がセッションで最初に起動される場合は、デバッガ・メカニズムはNLS_LANGUAGE
、NLS_TERRITORY
、NLS_CALENDAR
、NLS_DATE_LANGUAGE
、NLS_NUMERIC_CHARACTERS
、NLS_TIMESTAMP_FORMAT
、NLS_TIMESTAMP_TZ_FORMAT
、NLS_TIME_FOMAT
およびNLS_TIME_TZ_FORMAT
のその時点で最新の値のプライベート・コピーを作成します。これらのプライベート・コピーは、このGET_NLS_PARAMETERファンクション
コールを使用して読み取り、SET_NLS_PARAMETERプロシージャに対する次のコールを使用して変更できます。 -
デバッガのNLSパラメータのプライベート・コピーが作成されると、
ALTER SESSION
文を使用して現在のセッションのNLSパラメータに加えた変更は、JDWPを介して表示される値の形式に影響を与えません。JDWPで使用されるNLSパラメータを変更するには、SET_NLS_PARAMETERプロシージャ
を使用する必要があります。同じトークンによって、SET_NLS_PARAMETERプロシージャ
を使用してデバッガのNLSパラメータのプライベート・コピーに加えた変更は、デバッグ対象のプログラム自体には影響を与えません。 -
日付値は常に
NLS_TIMESTAMP_FORMAT
を使用してJDWPに対して書式設定されます。セッションで使用されるDATE (NLS_DATE_FORMAT)
のデフォルトの書式は、ほとんどの場合、実際には値で表示される時間情報を示しません。デバッグ目的では、その情報を常に表示すると役立ちます。
59.3.6 PROCESS_CONNECT_STRINGプロシージャ
このプロシージャは、2つの方法でセッションをデバッガに接続するため、直接アプリケーション・コードを変更する必要はありません。
この2つの方法は、次のとおりです。
-
OCIプログラムの実行時に
ORA_DEBUG_JDWP
環境変数を使用します。 -
PL/SQL Webゲートウェイを介してアプリケーションを実行するときに、
OWA_DEBUG_<dad>
というWebブラウザのCookieを設定します。
構文
DBMS_DEBUG_JDWP.PROCESS_CONNECT_STRING ( connect_string IN VARCHAR2, connect_string_type IN PLS_INTEGER);
パラメータ
表59-8 PROCESS_CONNECT_STRINGプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
接続するデバッガのホストおよびポート番号などのJDWP接続情報を含む、 |
|
次の2つの値を使用できます。
|
例外
表59-9 PROCESS_CONNECT_STRINGプロシージャの例外
例外 | 説明 |
---|---|
|
セッションIDが無効です。 |
|
権限が不十分です。 |
|
セッションはすでにデバッガに接続されています。 |
|
引数 |
|
引数 |
|
デバッガへの接続の確立で障害が発生しました。 |
|
環境変数 |
59.3.7 SET_NLS_PARAMETERプロシージャ
このファンクションは、PL/SQLプログラムのNUMBER
、DATE
、TIME (WITH TIME ZONE)
およびTIMESTAMP (WITH TIME ZONE)
の実行時の値がJDWPを介して表示される文字列に変換される形式に影響を与える、指定されたNLSパラメータの値を設定します。
これらの値は、現在のセッション専用ですが、デバッガ・メカニズム専用でもあります。デバッグ対象のプログラム内の値の変換に使用される値とは異なります。
構文
DBMS_DEBUG_JDWP.SET_NLS_PARAMETER( name IN VARCHAR2, value IN VARCHAR2);
パラメータ
表59-10 SET_NLS_PARAMETERプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
指定されたNLSパラメータ |
|
指定されたNLSパラメータの値 |
使用上のノート
-
変数値がJDWPを介して読み込まれるまたは割り当てられる場合、または
GET_NLS_PARAMETERファンクション
またはSET_NLS_PARAMETERプロシージャ
がセッションで最初に起動される場合は、デバッガ・メカニズムはNLS_LANGUAGE
、NLS_TERRITORY
、NLS_CALENDAR
、NLS_DATE_LANGUAGE
、NLS_NUMERIC_CHARACTERS
、NLS_TIMESTAMP_FORMAT
、NLS_TIMESTAMP_TZ_FORMAT
、NLS_TIME_FOMAT
およびNLS_TIME_TZ_FORMAT
のその時点で最新の値のプライベート・コピーを作成します。これらのプライベート・コピーは、GET_NLS_PARAMETERファンクションをコールして読み取り、SET_NLS_PARAMETERプロシージャ
に対する次のコールを使用して変更できます。 -
デバッガのNLSパラメータのプライベート・コピーが作成されると、
ALTER SESSION
文を使用して現在のセッションのNLSパラメータに加えた変更は、JDWPを介して表示される値の形式に影響を与えません。JDWPで使用されるNLSパラメータを変更するには、SET_NLS_PARAMETERプロシージャ
を使用する必要があります。同じトークンによって、SET_NLS_PARAMETERプロシージャ
を使用してデバッガのNLSパラメータのプライベート・コピーに加えた変更は、デバッグ対象のプログラム自体には影響を与えません。 -
日付値は常に
NLS_TIMESTAMP_FORMAT
を使用してJDWPに対して書式設定されます。セッションで使用されるDATE (NLS_DATE_FORMAT)
のデフォルトの書式は、ほとんどの場合、実際には値で表示される時間情報を示しません。デバッグ目的では、その情報を常に表示すると役立ちます。