デバッグ出力の分析

デバッグポイントからの出力は、Javaプロファイラ・ヒープ・ダンプ・バージョン1.0.2形式で格納されます。

実行中にデバッグポイントがヒットするたびに、デバッグ情報はヒープ・ダンプ・セグメントとして保存されます。実行が終了した後に、デバッグ出力を分析するためのオプションとしては、次の2つがあります:
  • dbms_mle.parse_debug_outputファンクションによって取得したデバッグ情報のテキスト表現を使用します。

  • デバッグ出力を含むBLOB sinkhprofファイルにエクスポートし、既存のいくつかの開発者ツールを使用して情報を分析します。

トピック

デバッグ出力のテキスト表現

ファンクションdbms_mle.parse_debug_outputは、ヒープ・ダンプ形式のデバッグ情報を含むBLOBを入力として使用し、デバッグ情報のJSON表現を戻します。

dbms_mle.parse_debug_outputの出力は、DebugPointDataオブジェクトの配列です。DebugPointDataは、デバッグポイントがヒットするたびに記録されるデバッグ情報を表し、Frameオブジェクトの配列で構成されます。各Frameには、情報が収集されたソース・コードの場所(atフィールド)と、その場所で記録されたローカル変数の名前および値(valuesフィールド)が含まれます。Frame.valuesのキーは記録された変数の名前であり、値はそれらの変数の値であることに注意してください。

例9-6に、サンプルのJavaScriptプログラムでデバッグポイントを指定した後、ファンクションdbms_mle.parse_debug_outputを使用してデバッグ出力のテキスト表現を生成する方法を示します。

例9-6 デバッグ出力のテキスト表現の取得

この例の後半で示すデバッグは、モジュールfibunacci_moduleで定義されたJavaScriptファンクションfibに対して実行されます:

CREATE OR REPLACE MLE MODULE fibunacci_module 
LANGUAGE JAVASCRIPT AS
export function fib( n ) {

    if (n < 0) {
        throw Error("must provide a positive number to fib()");
    }
    if (n < 2) {
        return n;
    } else {
        return fib(n-1) + fib(n-2);
    }
}
/

CREATE OR REPLACE FUNCTION fib( p_value number)
RETURN NUMBER
AS MLE MODULE fibunacci_module
SIGNATURE 'fib(number)';
/

デバッグポイントは行9に配置され、DBMS_MLE.PARSE_DEBUG_OUTPUTファンクションを使用してデバッグ情報を表示します:

SET SERVEROUTPUT ON;
DECLARE
    l_debugspec JSON;
    l_debugsink BLOB;
    l_debuginfo JSON;
    l_value     NUMBER;
BEGIN
    l_debugspec := JSON ('
    {
        version : "1.0",
        debugpoints : [
            {
                "at" : {
                    "name" : "FIBUNACCI_MODULE",
                    "line" : 9
                },
                "actions" : [
                    { "type" : "watch", "id" : "n" }
                ],
            },
        ]
    }
    ');
    -- create a temporary lob to store the raw 
    -- debug output
    DBMS_LOB.CREATETEMPORARY( l_debugsink, false );

    DBMS_MLE.ENABLE_DEBUGGING( l_debugspec, l_debugsink );

    -- run the application code    
    l_value := fib(4);

    DBMS_MLE.DISABLE_DEBUGGING;

    -- retrieve a textual representation of the debug
    -- output
    l_debuginfo := DBMS_MLE.PARSE_DEBUG_OUTPUT( l_debugsink );
    DBMS_OUTPUT.PUT_LINE(
        json_serialize(l_debuginfo pretty)
    );
END;
/

結果:

[
  [
    {
      "at": {
        "name": "USER1.FIBUNACCI_MODULE",
        "line": 9
      },
      "values": {
        "n": 4
      }
    }
  ],
  [
    {
      "at": {
        "name": "USER1.FIBUNACCI_MODULE",
        "line": 9
      },
      "values": {
        "n": 3
      }
    }
  ],
  [
    {
      "at": {
        "name": "USER1.FIBUNACCI_MODULE",
        "line": 9
      },
      "values": {
        "n": 2
      }
    }
  ],
  [
    {
      "at": {
        "name": "USER1.FIBUNACCI_MODULE",
        "line": 9
      },
      "values": {
        "n": 2
      }
    }
  ]
]

開発者ツールを使用したデバッグ出力の分析

デバッグ出力のテキスト表現を分析するかわりに、JDeveloper、NetBeans、Oracle Database Actionsなどのツールを利用することもできます。

実行が終了したら、選択したツールを使用してローカル変数の値を検査したり、各時点での変数のグラフを検査できます。

必要に応じて、新しいツールとの統合(Chrome開発ツールなど)を開発し、MLEのユース・ケースに特化したUIを設計できます。

ノート:

Oracle Database Actionsでは、Oracle Database 23ai、リリース更新23.1.2以降、MLE実行後のデバッグがサポートされています。

関連項目:

MLEでのデータベース・アクションの使用の詳細は、Oracle SQL Developer Webの使用を参照してください