デバッグポイントの管理

デバッグは、デバッグ仕様を指定してプロシージャdbms_mle.enable_debuggingをコールすることで、セッション内で有効にできます。

デバッグ仕様には、debugpointsフィールドで指定したデバッグポイントの配列に加えて、versionフィールドで指定したバージョン識別子も含まれます。versionフィールドは、値"1.0"に設定する必要があります。デバッグ仕様には、複数のMLEモジュールのデバッグポイントを含めることができます。

ノート:

デバッグ仕様では、モジュール名は、ディクショナリに格納されているものと同じ大/小文字で指定する必要があります。デフォルトでは、モジュールの作成時に名前が二重引用符で囲まれていないかぎり、モジュール名は大文字で格納されます。

プロシージャdbms_mle.enable_debuggingは、デバッグ出力が書き込まれるBLOB sinkも受け入れます。

dbms_mle.enable_debuggingのコール後、デバッグ仕様に含まれるすべてのデバッグポイントがアクティブになります。いずれかのデバッグポイントがヒットするたびに、関連するデバッグ情報が記録されます。デバッグ情報は、制御がMLEからPL/SQLに最後に戻ったときにBLOB sinkに書き込まれますが、この時点より前に一部または全部を書き込むことができます:
  • 動的MLE評価の場合、dbms_mle.evalへのコールが戻されたときに、MLEからPL/SQLに制御が渡されます。

  • MLEコール仕様の場合、MLEコール仕様へのコールが戻されたときに、MLEからPL/SQLに制御が渡されます。

設定されたデバッグポイントは、MLEコードを実行するユーザーの権限に関係なく、MLEモジュールのすべての実行でアクティブになります。

同じセッションで再度dbms_mle.enable_debuggingをコールすると、既存のデバッグポイントのセットが置き換えられます。デバッグポイントは、セッションが終了するまでまたはユーザーがdbms_mle.disable_debuggingをコールして明示的にデバッグを無効にするまで、アクティブのままになります。

例9-5 MLEモジュールのデバッグの有効化

この例のデバッグ仕様では、例6-4の最初に作成されたモジュールcount_moduleおよび例6-6で作成されたモジュールin_out_example_modを参照します。

DECLARE
  debugspec json;
  sink blob;
BEGIN
  debugspec:= json('
    {
      "version": "1.0",
      "debugpoints": [
        {
          "at": {
            "name": "COUNT_MODULE",
            "line": 7 
          },
          "actions": [
            { "type": "watch", "id": "myCounter", "depth": 1 }
            ],
          "condition": "myCounter > 0"
        },
        {
          "at": {
            "name": "IN_OUT_EXAMPLE_MOD",
            "line": 16
          },
          "actions": [
            { "type": "snapshot" }
          ],
        }
      ]
    }
  ');
  dbms_lob.createtemporary(sink, false);
  dbms_mle.enable_debugging(debugspec, sink);
  --run application to debug
END;
/

デバッグのセキュリティに関する考慮事項

ユーザーは、デバッグ対象のMLEモジュールを所有しているかデバッグ権限を持っている必要があります。デバッグ機能によってMLEコードのランタイム状態を監視できるようになるため、こうしたことが必要です。

また、conditionフィールドを使用すると任意のコードを実行できるため、デバッグするコードの実行時の動作を変更するためにこれを使用できる可能性があります。具体的には、次の場合に、MLEモジュールに対して実行後のデバッグを使用できます。
  • MLEモジュールを所有している、または

  • MLEモジュールに対する COLLECT DEBUG INFOオブジェクト権限がある。

1つ以上のアクティブなデバッグポイントを含むMLEモジュールのコードが実行されるたびに、権限がチェックされます。必要な権限がない状態でデバッグポイントを設定しようとすると、ORA-04164エラーが発生します。

ORA-04164が検出された場合、次のいずれかを実行します
  • デバッグポイントを設定したユーザーに、対象のモジュールに対するCOLLECT DEBUG INFO権限を付与する必要があるか、または

  • そのセッションでモジュール内のコードの実行を続行するには、モジュールのデバッグポイントを無効にする必要があります。

MLEモジュールのCOLLECT DEBUG INFO権限

MLEモジュールのCOLLECT DEBUG INFOオブジェクト権限は、モジュールを所有していないがEXECUTE権限を持つユーザーが、そのモジュールでデバッグを実行できるかどうかを制御します。

たとえば、ユーザーWが所有するMLEモジュールModuleAについて考えてみます。ユーザーWは、ModuleAのファンクションに対する実行者権限のコール仕様を作成し、ユーザーVに対してこのコール仕様のEXECUTEを付与します。ユーザーVがこのコール仕様をコールしたときにModuleAのコードをデバッグできるようにするには、ユーザーWModuleAに対するCOLLECT DEBUG INFO権限も付与する必要があります。

ユーザーWは、次の文を使用して、VModuleAをデバッグする権限を付与できます:

GRANT COLLECT DEBUG INFO ON ModuleA TO V;

COLLECT DEBUG INFO権限は、必要に応じて後で取り消すことができます:

REVOKE COLLECT DEBUG INFO ON ModuleA FROM V;