MPS 2019.1ヘルプ

デバッガー

MPSは、カスタムデバッガを作成し、javaのデバッガと統合するためのAPIを提供します。MPSデバッガ機能の説明については、デバッガの使用箇所ページを参照してください。

基本

ユーザーモデルから生成されるコードをデバッグするために、MPSは以下をする必要があります:

  • デバッガでシームレスに2つの世界を一致させることができるようにするために、生成されたコードまでユーザモデルのノードを追跡します

  • どのノードにどのタイプのブレークポイントを作成できるかを理解する

  • デバッガでデバッグされたコードを起動するためのオプションを知っている

  • オプションで、デバッグされたプログラムのメモリ内のデータの現在値をユーザーに表示するためのカスタマイズされたビューアーのセットもあります。

MPSは可能な限り自動化しようとしていますが、場合によっては言語設計者がウェイトリフティングの役割を果たす必要があります。言語を持っているとしましょう、それを呼び出しましょう。high.levelは、ある言語でコードを生成します。low.levelは、直接テキストに生成されます(high.levellow.levelの間には、他にもいくつかのステップがあります)。low.levelから生成されたテキストがjavaクラスで構成されていて、high.level言語をMPS javaデバッガエンジンと統合したいとします。次の説明表を参照してください。

high.levelBaseLanguageに拡張または生成します

何もする必要はありません。

high.levelBaseLanguageに拡張も生成もしません

low.levelのどの概念が追跡可能かを指定します。
high.levelにブレークポイントを設定できるようにするには、breakpoint creators を使用します。

BaseLanguageとその拡張機能のデバッグ - javaデバッガとの統合

BaseLanguage -generated言語をMPS javaデバッガエンジンと統合するために、何かを指定する必要はほとんどありません。MPSはtrace.infoファイル内の生成トレースを追跡することができるため、期待通りにブレークポイントを設定することができ、デバッガはあなたのDSLコードを通して正しく進むことができます。

javaデバッガ下での実行設定の起動

MPSは、javaに生成された言語用の実行構成を作成するための特別な言語 - jetbrains.mps.baseLanguage.runConfigurationsを提供します。これらの実行設定はデバッガで自動的に起動することができます。詳細はjavaに生成された言語の実行設定を参照してください。

カスタムビューアー

変数ビューで変数とフィールドを表示するときに、特定の値を表示するための独自の方法を定義したい場合があります。たとえば、コレクションは、そのすべての内部構造を持つ通常のオブジェクトとしてではなく、要素のコレクションとして表示できます。

カスタムビューアーを作成するためにMPSはjetbrains.mps.debugger.java.customViewers言語を持っています。

jetbrains.mps.debugger.java.customViewers言語により、特定の形式のデータ用に自分のビューアーを書くことができます。

customViewers言語の主な概念は、カスタムデータビューアーです。生のjava値(スタック上のオブジェクト)を受け取り、いわゆるウォッチブルのリストを返します。ウォッチャーブルは、値とそのラベル(値がメソッド、フィールド、要素、サイズなどであるかどうかなど、値を分類する文字列)のペアです。ウォッチャーブルのラベルは custom watchables containerで定義されています。各ラベルにアイコンを割り当てることができます。

特定のタイプのビューアーは custom viewer ルートで定義されています。次の表に custom viewer 部品を示します。

パーツ

説明

タイプ用

このビューアーが対象としているタイプ。

包むことができます

表示オブジェクト用の追加フィルタ。

プレゼンテーションを受ける

オブジェクトの文字列表現

カスタムウォッチ可能品を入手

このオブジェクトの部分値この関数の結果は型 watchable listでなければなりません。

カスタムビューアー言語には、watchable listwatchableの2つの新しいタイプが導入されました。

これは java.util.Map.Entry クラスのカスタムビューアー仕様です。

Map entry viewer

そして、ここでマップエントリがデバッガビューでどのように表示されるかを見ます:

Map entry

カスタムデバッガの作成

言語の生成がBaseLanguageを回避するのであれば、手動でノードトレースとブレークポイント指定の面倒を見る必要があるでしょう。さらに、Java以外の言語を生成している場合は、ターゲットプラットフォームデバッガをMPSにアタッチする必要があります。MPSが提供するデバッガAPIを使用すると、このような非Javaデバッガを作成できます。必要なクラスはすべて「MPS用デバッガAPI」プラグインにあります。デバッガAPIの説明も参照してください。

まとめると、BaseLanguage以外の言語をターゲットにしている場合は、通常次のように指定する必要があります。

これらのステップのすべてが絶対に必要というわけではありません - それらのどれが実際の言語に依存するかということです。

トレーサブルノード

このセクションでは、trace .info ファイルに追加情報を保存するために必要なノード(ノードから生成された位置テキスト、表示変数、ノードが生成されたファイルの名前などの情報)を指定する方法について説明します。 trace.info ファイルには、MPS内のノードを生成されたテキストと接続するための情報が含まれています。例:ブレークポイントがヒットした場合、javaデバッガはMPSにソースファイルの行番号を伝え、この情報から実際のノードを取得するようにします。MPSは trace .info ファイルの情報を使用します。

具体的には、trace.info ファイルには次の情報が含まれています。

  • 位置情報: テキストファイルの名前とその中でノードが生成された場所。

  • スコープ情報: 「スコープ」ノードごとに(それに関連付けられ、ノードのスコープ内で可視の変数がいくつかあります) - スコープ内で可視の変数の名前とID。

  • ユニット情報:各 "ユニットノード"(言語のある単位、たとえばjavaのクラスを表すように) - ノードが生成されるユニットの名前

trace

そのために、言語 jetbrains.mps.lang.traceable の概念 TraceableConceptScopeConcept、および UnitConcept が使用されます。いくつかの情報を trace.info ファイルに保存するには、ユーザーはそれらの概念の1つから導き出し、特定の動作方法を実装する必要があります。概念は以下の表で説明されています。

概念

説明

実装する動作方法

サンプル

TraceableConcept

テキスト内のどの場所を保存し、どのブレークポイントを作成できるかについての概念。

getTraceableProperty - trace.info ファイルに保存されるいくつかのプロパティー。

Position info
ScopeConcept

スコープ内に見える、いくつかのローカル変数を持つ概念。

getScopeVariables - スコープ内の変数宣言

Scope info
UnitConcept

javaのクラスや内部クラスのように、別々の単位に生成される概念。

getUnitName - 生成されたユニットの名前

Unit info

trace.info ファイルは、テキストの生成中に、生成の最後の段階で作成されます。説明されている概念は、テキストに生成された言語でのみ使用されます。TraceableConceptScopeConcept、またはUnitConcept削減規則によって生成されているときはいつでも、エントリーは自動的に記入されます。

自動トレースが不可能な場合は、language.highからの概念の目的の入力ノードを生成コードと明示的に一致させるために$TRACE$マクロを使用できます。

Trace marco

ブレークポイントクリエーター

さまざまなノードにブレークポイントを作成する方法を指定するために、ルート breakpoint creators が使用されます。これは jetbrains.mps.debugger.api.lang 言語からの概念 BreakpointCreator の根本です。ルートは言語プラグインモデルに配置されるべきです。それは BreakpointableNodeItemのリストを含みます。それらの各々はブレークポイントを作成するための概念のリストと実際にブレークポイントを作成する方法を指定します。 jetbrains.mps.debugger.api.lang はデバッガを操作するための、特にブレークポイントを作成するためのいくつかの概念を提供します。それらについて以下に説明します。

  • DebuggerReference - javaデバッガのような特定のデバッガへの参照。

  • CreateBreakpointOperation - 特定のプロジェクトの特定のノードに特定の種類のロケーションブレークポイントを作成する操作。

  • DebuggerType - デバッガへの参照のための特別な型

次の例では、baseLanguagebreakpoint creators ノードが表示されています。

breakpoints creator

より複雑なフィルタリング動作を提供するために、単純な複雑なリストの代わりにブレークポイント作成者は isApplicable 関数を使用することができます。この機能の使用に切り替えるインテンションがあります。

最終更新日: 2019年6月7日