MPS 2019.2ヘルプ

デバッガAPI

MPSは、MPSで動作するデバッガエンジンを作成するためのjava APIを提供します。

どこから始めれば

カスタムデバッガエンジンを書き始める良い方法は、MPSでJava デバッガープラグイン実装を研究することです。ソースコードはソリューションjetbrains.mps.debugger.java.apijetbrains.mps.debugger.java.runtimeにあります。Debugger API自体はjetbrains.mps.debugger.api.apiにあります。ソリューションjetbrains.mps.debugger.api.runtimeはMPSでAPIクラスがどのように使用されるかを理解するために研究することができますが、このソリューションからのクラスはカスタムデバッガコードから参照されるべきではありません。Debugger APIとJava デバッガーはどちらもMPS用のIDEAプラグインとしてパッケージ化されているため、Debugger APIのすべてのカスタム実装にする必要があります。MPS用のデバッガを実装するには、Intellij IDEAに関するある程度の知識が必要です。そのためIntellij IDEAプラグイン開発ページ(英語)についても検討する必要があります。そしてもちろん、プラグインのパッケージングを手助けする言語ガイドを構築するもあります。

キークラス

インターフェースjetbrains.mps.debug.api.IDebuggerは全体としてデバッガを表します。jetbrains.mps.debug.api.Debuggersアプリケーションコンポーネントに登録する必要があります。デフォルトの実装AbstractDebuggerがあります。IDebugger実装は2つのことを提供するために必要とされます:デバッガでアプリケーションを開始する方法とブレークポイントを作成する方法。MPS Debugger APIには2つのインターフェースがあります。

  1. jetbrains.mps.debug.api.AbstractDebugSessionCreator - 主な作業は、デバッグ中のアプリケーションを起動し、デバッグ中に実行される単一のアプリケーションに対応するAbstractDebugSessionのインスタンスを作成することです。デバッガの状態(実行中またはブレークポイントで一時停止中など)はjetbrains.mps.debug.api.AbstractUiStateで表されます。デバッグセッションがある状態から別の状態に移行すると、AbstractUiStateの新しいインスタンスが作成され、AbstractDebugSessionに設定されます。AbstractUiStateは現在のスレッドとスタックフレーム、可視変数などに関する情報を保持します。

  2. jetbrains.mps.debug.api.breakpoints.IBreakpointsProviderは、ブレークポイントの作成、UIの編集、およびXMLとの間のブレークポイント状態の永続化を行います。ブレークポイントクラスはIBreakpointを実装する必要があります。AbstractBreakpointは拡張する基本クラスです。ある場所に設定できるブレークポイント(コード行のブレークポイントのように、基本的に「ノード上」を意味します)には、インターフェースILocationBreakpointがあります。各ブレークポイントは何らかの種類(IBreakpointKind)です。たとえば、行ブレークポイント、フィールドブレークポイント、または例外ブレークポイントには種類があります。

価値観とウォッチ

jetbrains.mps.debug.api.programStateパッケージには、プログラムの状態を反映するための多数のインターフェースが含まれています。ブレークポイントで一時停止すると、AbstractUiStateはアプリケーション(インターフェースIThread)で実行されているスレッドのリストを持ちます。各スレッドはスタックフレームのリスト(IStackFrame)を持ち、各スタックフレームはそこに見えるウォッチ可能なもののリスト( IWatchable )を持ちます。監視可能項目は、ローカル変数、"this" オブジェクト、または「静的コンテキスト」のいずれかです。各ウォッチャーブルには1つの値(〜を重視する)があります。言い換えると、それぞれの値はいくつかのウォッチ可能値を持つことができます。例:javaローカル変数はウォッチ可能、この変数に割り当てられたオブジェクトは値、このオブジェクトが持つフィールドはウォッチ可能などです。このツリー状の構造は、デバッグツールウィンドウの変数セクションに表示されるものです。

SourcePositionとIPositionProvider

jetbrains.mps.debug.api.source.IPositionProviderは、ソースコード(テキスト)がMPSの内側の場所(テキストファイルまたはノード)にマッピングされる方法をカスタマイズするためのインターフェースです。ILocationインターフェースのインスタンス、またはユニット名、ファイル名、行番号のいずれかで指定された場所のjetbrains.mps.debug.api.source.SourcePositionのインスタンスを計算します。jetbrains.mps.debug.api.source.NodePositionProviderjetbrains.mps.debug.api.source.TextPositionProviderの2つの定義済みプロバイダがあります。それらは、場所のノードまたはテキスト位置を見つける責任があります。

SourcePositionはMPS内の位置を含むクラスです。このクラスには2つの実装があります。jetbrains.mps.debug.api.source.NodeSourcePosition(ノードへのポインタを含む)とjetbrains.mps.debug.api.source.TextSourcePosition(テキストファイルを含む)です。MPSのデフォルトのライン強調表示は、これら2種類の位置のみをサポートしています。

プロバイダはjetbrains.mps.debug.api.source.PositionProviderクラスに登録されています。各プロバイダには、このプロバイダがNodeSourcePositionTextSourcePositionのどちらを返すかを示すキーが関連付けられています。また、プロバイダは特定のDebugSessionを受け入れ、デフォルトでMPSデバッガに同梱されているプロバイダだけがすべてのセッションを受け入れることができます。

ポジションプロバイダーの例は次のとおりです。

/* NodePositionProvider is extended here in order to provide NodeSourcePosition. It is not necessary to extend one of the default providers. */ public class MyCustomNodePositionProvider extends NodePositionProvider { private final Project myProject; public MyCustomNodePositionProvider(Project project) { myProject = project; } @Nullable() @Override public node<> getNode(@NonNls string unitName, @NonNls string fileName, int position) { node<> node = ... (some code that calculates a node); return node; } public void init() { // call this method on your debugger initialization PositionProvider.getInstance(myProject).addProvider(this, NodeSourcePosition.class.getName()); } public void dispose() { // call this method on your debugger disposal PositionProvider.getInstance(myProject).removeProvider(this); } @Override public boolean accepts(AbstractDebugSession session) { // it is necessary to override this method and to accept only AbstractDebugSession instances that are created by your debugger return session instanceof MyCustomDebugSession; } }

TraceInfoResourceProvider

jetbrains.mps.generator.traceInfo.TraceInfoCache.TraceInfoResourceProviderは、trace.infoファイルへのパスがモジュールに対してどのように計算されるかをカスタマイズできるインターフェースです。例として、BaseLanguageで書かれているモジュールはクラスパスにtrace.infoファイルがあります。インターフェースのインスタンスには、検索するモジュールとリソースの名前(たとえば、呼び出し側がモデルjetbrains.mps.core.utiltrace.infoファイルの場所を必要とする場合は "jetbrains / mps / core / util / trace.info")が与えられ、java.net.URLのインスタンスが返されます。TraceInfoResourceProvidersは、addResourceProvider / removeResourceProviderメソッドを使用してTraceInfoCacheインスタンスに登録/未登録です。

最後

  1. デバッガツールウィンドウの変数ツリーは、アップデートにバックグラウンドスレッドを使用するようになりました。APIのいくつかのメソッドはそれをサポートしています。
    • バックグラウンドスレッドで呼び出され、この値のサブ値を取得するために必要なすべての計算を実行する必要があるIValue.initSubvalues()メソッド。IValue.getSubvalues()メソッドは、以前にinitSubvalues()メソッドで計算されたデータのみを返すことになっています。

    • すべての評価コードを呼び出すためにデバッガapiによって使用される AbstractUiState.invokeEvaluation()メソッド(つまり、デバッグされたプログラム内でいくつかの計算を実行するコード。特にこのメソッドはIValue.initSubvalues()を呼び出すために使用されます)。デフォルトでは、このメソッドはスレッドプール内のいずれかのスレッドにコマンドをスケジュールするだけですが、カスタム動作によってはコマンドをオーバーライドすることもできます。

最終更新日: 2019年8月30日