デバッグポイントの指定

デバッグポイントは、データベース文字セットでエンコードされたJSONドキュメントを使用して指定します。

各デバッグポイントには次の要素が含まれます:
  • 情報が収集されるソース・コード内の場所

  • 収集する情報を説明するアクション

  • デバッグ情報を収集するタイミングを制御するオプションの条件

例9-1 デバッグポイントを指定するJSONテンプレート

{
at: <location-spec>,
action: [ <action-spec>, ... ],
[ condition: <condition-spec> ]
}

デバッグポイントの場所

デバッグポイントの場所は、デバッグするアプリケーションのソース・コードの行番号で指定します。

デバッグするMLEモジュールの名前は、nameフィールドで指定し、デバッグ情報が収集されるモジュール内の場所は、lineフィールドで指定します。例9-4に、サンプル値を含むJSONドキュメントの例を示します。

デバッグポイントのアクション

MLE実行後のデバッグでは、watchsnapshotの2種類のアクションがサポートされます。

watchアクションを使用すると、idフィールドに指定された変数の値を記録できます。オプションのdepthフィールドでは、コンポジット型変数の値を記録する深さを制御できます。

snapshotアクションは、snapshotアクションが呼び出された時点のスタック・トレースと、各スタック・フレームのローカル変数の値を記録します。snapshotでは、watchと比較してより高い実行コストが必要になりますが、より深い情報が得られます。watchアクションと同様に、オプションのdepthフィールドを使用して、各変数のロギングの深さを制御できます。snapshotアクションのdepthパラメータは、アクションによって取得されるすべての変数に適用されます。

より正確には、depthパラメータは、変数の値を取得するためにオブジェクト・ツリーをどの程度深くトラバースするかを制御します。たとえば、ネストされたオブジェクトを含む次の変数を考えます。

let x = {
a: {
    val: 42
},
b: 3.14
};

depthフィールドが2として定義されている場合は、オブジェクト・ツリーがトラバースされ、ネストされたオブジェクトaの値が取得されます(この場合は42)。depth1として指定されている場合、トラバースは最初のレベルで終了し、次の結果が生成されます。

x = {
"a": {
    "<unreachable>": true
};
"b": 3.14
}

framesLimitフィールドでは、記録するスタック・フレームの数を制御できます。デフォルトでは、すべてのスタック・フレームが記録されます。framesLimitsnapshotにのみ適用されます。たとえば、a()b()をコールし、b()c()をコールするコール階層について考えてみます。c()でスナップショットを取得すると、framesLimit=1では最下部のスタック・フレーム(この場合はc())のみが取得され、framesLimit=2では下部の2つ(この場合はc()およびb())が取得されるというようになります。

例9-2 ウォッチ・アクションを指定するためのJSONテンプレート

変数をウォッチするには、typewatchに設定する必要があります。idパラメータは、ウォッチする変数を識別するために使用され、文字列または文字列の配列として指定する必要があります。depthパラメータはオプションで、数値で定義されます。

actions: [
  { type: "watch", 
    id: <string[]> | <string>,
    [depth : <number>] }
]

例9-3 スナップショット・アクションを指定するためのJSONテンプレート

snapshotアクションを使用するには、typeパラメータをsnapshotに設定する必要があります。framesLimitおよびdepthフィールドはオプションで、数値として指定します。

actions: [
  { type: "snapshot", 
    [framesLimit: <number>],
    [depth : <number>] }
]

デバッグポイントの条件

watchsnapshotの両方を、conditionフィールドに指定した条件で制御できます。

式は、アプリケーションのコンテキストの、デバッグポイントで指定した場所で評価され、式の評価がtrueである場合にのみ、関連するアクションがトリガーされます。

conditionフィールドに含めることができる式のタイプに制限はありません。式を評価しても、デバッグ対象のプログラムの動作が変更されないようにする必要があります。

例9-4 MLEモジュール内の変数のウォッチ

次のコードでは、モジュールmyModule1のデバッグポイントと2つの関連アクションを指定しています。ロギングの深度が3に制限された変数xwatchアクションと、ロギングの深度に制限のない変数ywatchアクションです。デバッグポイントには、条件(x.id>100)が満たされた場合にのみデバッグポイント・アクションがトリガーされるように、conditionも関連付けられています。

{
	"at" : {
		"name" : "myModule1",
		"line" : 314
	},
	"actions" : [
		{ "type": "watch", "id" : "x", "depth" : 3 },
		{ "type": "watch", "id" : "y" }
	],
	"condition" : "x.id > 100"
}