5.4 Javaストアド・プロシージャのデバッグ

Oracle Databaseには、Javaストアド・プロシージャをデバッグするためのJava Debug Wire Protocol (JDWP)インタフェースが用意されています。JDWPは、Java Development Kit (JDK) 1.3以上のバージョンでサポートされています。

JDWPインタフェースでサポートされているいくつかの機能を次に示します。

  • 接続のリスニング

  • デバッグ中の変数値の変更

  • 任意のJava式の評価(メソッド評価など)

  • 行上またはメソッド内でのブレークポイントの設定またはクリア

  • コードのステップ実行

  • フィールド・アクセスまたは変更ウォッチポイントの設定またはクリア

ノート:

Oracle JDeveloperは、ユーザーが使いやすいようにこれらのデバッグ機能と統合されています。その他の独立系統合開発環境(IDE)ベンダーも、自社のデバッガをOracle Databaseと統合できます。

このセクションのトピックは次のとおりです:

5.4.1 Javaストアド・プロシージャのデバッグの前提条件

Javaストアド・プロシージャをデバッグする前に、次の前提条件が満たされていることを確認してください。

  • Javaコードをデータベースにデプロイする必要があり、オプションでデバッグ情報を使用してコンパイルできます。

  • データベース・ユーザー・アカウントが次の権限を持っている必要があります。

    • DEBUG CONNECT SESSION権限

    • DEBUG CONNECT ANY権限

    • DEBUG CONNECT ON USER <user>権限

    • デバッグ対象のストアド・プロシージャに対するDEBUGオブジェクト権限

  • 次のようにして、jdwp権限をアクセス制御リスト(ACL)に追加する必要があります。

          SQL> begin
          2    DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
          3      host => <host_name>,
          4      ace  => xs$ace_type(privilege_list => xs$name_list('jdwp'),
          5                          principal_name => <user_name>,
          6                          principal_type => xs_acl.ptype_db));
          7  end;
          8  /
    

関連項目:

アクセス制御リストへの権限の追加の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。

5.4.2 jdbデバッガを使用したJavaストアド・プロシージャのデバッグ

jdbセッションは、-listen <port>コマンドを使用して開始できます。この方法でセッションを開始した場合、jdbは実行中の仮想マシン(VM)が標準のコネクタを使用して指定のアドレスに接続するのを待機します。

ノート:

Javaストアド・プロシージャのデバッグ中、jdbはJVMセッションを開始できず、VMによる接続を待機するのみです。

Oracle JVMで実行されているJavaプログラムのデバッグをするには、次のステップを実行します。

  1. 次のコマンドをデバッグ端末で実行します。

    jdb -listen 4000

    次のイメージは、jdbセッションを開始するデバッグ端末を示しています。

    start_jdb.pngの説明が続きます
    図start_jdb.pngの説明
  2. SQL*PlusなどのOracleクライアントを使用して、デバッガに接続するためのコマンドを発行します。次の2通りの方法で接続できます。

    • Javaストアド・プロシージャを実行するセッションと同じセッションからデバッガ接続コマンドを発行します。たとえば、SQL*Plusを使用している場合は、次のコマンドを発行して、JDWPセッション用に指定したマシンおよびポートへのTCP/IP接続をオープンします。

            EXEC DBMS_DEBUG_JDWP.CONNECT_TCP(<host_ip>, <port>)
      

      次のイメージは、デバッグ端末に接続するためにコマンドを実行しているクライアント端末を示しています。

      debug_1.pngの説明が続きます
      図debug_1.pngの説明

      デバッガが接続を受け入れた後、デバッガ・セッションのブレークポイントを発行し、OracleクライアントでJavaストアド・プロシージャを起動します。これで、デバッガは、指定した最初のブレークポイントで停止します。

    • 別のセッションでデバッガ接続コマンドを発行し、次の例に示すように2つのパラメータを追加で指定します。

            EXEC DBMS_DEBUG_JDWP.CONNECT_TCP(<host_ip>, <port>, <session_id>, <session_serial>)

      前のコマンドでは、session_idおよびsession_serialにより、Javaストアド・プロシージャが実行され、デバッガに接続する必要があるデータベース・セッションが識別されます。別のセッションをデバッガに接続するには、そのセッションのログオン・ユーザーに対するDEBUG CONNECTユーザー権限またはDEBUG CONNECT ANYシステム権限が必要です。

  3. 接続が正常に確立されたら、次の構文を使用してデバッグ端末でブレークポイントを追加できます。

    stop at <ClassName>:<LineNumber>

    次のイメージは、デバッグ端末にブレークポイントを追加する方法を示しています。

    addbreakpoint.pngの説明が続きます
    図addbreakpoint.pngの説明
  4. ステップ2で使用したOracleクライアントで、JavaプログラムのSQLラッパーを次の方法でコールします。

    call <SQLWrapperName>.<MethodName>
  5. 次に、デバッグ端末でコードのデバッグに使用できるjdbコマンドをいくつか示します。

    • 一度に1ステップ進む場合: step

    • 変数値の値をチェックするには:print<ClassName>:<VariableName>

    • 続行するには:cont

    • ブレークポイントをクリアするには:clear

5.4.3 JDeveloperを使用したJavaストアド・プロシージャのデバッグ

JDeveloperを使用して、Javaストアド・プロシージャおよびPL/SQLプログラムをシームレスにデバッグできます。PL/SQLプログラムおよびJavaストアド・プロシージャをローカルにデバッグする場合、デバッグを開始するためのコールはJDeveloperから直接行います。JDeveloperによって次のアクティビティが実行されます。

  1. デバッグ対象のプログラム(デバッグ対象)が自動的に起動されます
  2. そのプログラムにデバッガがアタッチされます。

PL/SQLプログラムのリモート・デバッグおよびローカル・デバッグとJavaストアド・プロシージャの主な違いは、デバッグ・セッションの開始方法です。リモート・デバッグの場合は、SQL*PlusなどのOracleクライアント、DBMS_SCHEDULERパッケージを使用して作成されたジョブ、OCIプログラムまたはトリガー起動を使用して、デバッグ対象のプログラムを手動で起動する必要があります。その後、デバッグ対象のデータベース・プログラム(デバッグ対象)からJDeveloperデバッガへの接続を確立する必要があります。デバッグ対象プロセスが開始し、JDeveloperのデバッガがプロセスにアタッチされた後は、リモート・デバッグとローカル・デバッグの動作はよく似ています。

ノート:

オプションで、デバッグの操作性を向上させるためにJITをオフにすることもできます。

関連項目:

JDeveloperを使用したJavaストアド・プロシージャのデバッグの詳細は、次のページを参照してください。

http://docs.oracle.com/cd/E16162_01/user.1112/e17455/dev_stored_proc.htm#BEJEJIHD