記事
· 6 hr 前 12m read

VSCode を使った ObjectScript コードのデバッグ

Visual Studio Code(VSCode)は、市場で最も一般的なコードエディターです。 Microsoft によって制作され、無料 IDE として配布されています。 VSCode は ObjectScript などの多数のプログラミング言語をサポートしており、2018 年までは Atelier(Eclipse ベース)もサポートしていました。 InterSystems 製品開発の主なオプションの 1 つとして考えられていましたが、 2018 年、InterSystems 開発者コミュニティが VSCode のサポートを発表した際に、関連する InterSystems のプロユーザーらが実際にこのエディターを使用し始め、以来、特に新しいテクノロジー(Docker、Kubernetes、NodeJS、Angular、React、DevOps、GitLab など)を使用する開発者の間でその使用が続いています。 VSCode の一番の機能の中にはデバッグ機能が挙げられます。 そこで、この記事では、クラスコードや %CSP.REST コードなどの ObjectScript コードをデバッグする方法を詳しく紹介します。

 

デバッグとは?

デバッグとは、ObjectScript コードに含まれる「バグ」と呼ばれるエラーを検出して解決するプロセスを指します。一部のエラーはコンパイルエラーではなく論理エラーです。 そのため、ソースコード実行ロジックのエラーを理解するには、プログラムを行ごとに実行して確認する必要があります。 条件またはプログラミングのロジックを特定して論理的なミスを見つけるには、これが最善の方法です。 その他のエラーには実行時エラーがあります。 この種の問題をデバッグできるには、まず、割り当てられた変数の値を確認することが不可欠です。

VSCode 用 InterSystems IRIS 拡張機能のインストール

まず、VSCode IDE に InterSystems IRIS 拡張機能をインストールする必要があります。 これを行うには、拡張機能に移動し、InterSystems を見つけてこれらの InsterSystems 拡張機能をインストールします。

最後の拡張機能(InterSystems ObjectScript Extension Pack)を最初にインストールする必要があります。この拡張機能パックは、ObjectScript の接続、編集、開発、およびデバッグに不可欠なものであるためです。 リストに含まれる他の拡張機能はオプションです。

サンプルアプリケーション

この記事のデバッグ例には、GitHub リポジトリ(https://github.com/yurimarx/debug-objectscript.git)のアプリケーションを使用します。 以下の手順に従って、VSCode でアプリケーションを取得、実行、およびデバッグしてください。
1.    ローカルディレクトリを作成し、プロジェクトソースコードをこのディレクトリに取得します。

$ git clone https://github.com/yurimarx/debug-objectscript.git

2.    このディレクトリ(iris-rest-api-template ディレクトリ)でターミナルを開いて実行します。

$ docker-compose up -d --build

3.    iris-rest-api-template ディレクトリ内で $code . を使うか、 フォルダを右クリックして「Open with Code」を選択し、VSCode を開きます。
4.    フッターで ObjectScript をクリックし、.vscode/launch.json で構成されたオプションを開きます。

5.    「Toggle Connection」を選択して同時接続を有効にします。

6.    この接続を有効にしたら、以下に示す接続が得られます。

7.    VSCode で IRIS に接続されていない場合は ObjectScript コードをデバッグできないため、 ObjectScript VSCode 拡張機能をクリックして接続を確認します。

8.    Person.cls を開き、行番号 25 に移動し、左側の数字 25 にマウスポインターを合わせます。

9.    次に、上部の ClassMethod にマウスポインターを合わせ、「Debug this method」をクリックします。

10.    VSCode に、パラメーターに値を設定するためのダイアログが開くため、下の例の通りに値を設定し、Enter をクリックします。

11.    VSCode は行 25 でコードの実行を停止します。

12.    左上で現在の変数値を確認できます。  

13.    左下でブレークポイントのリストと現在のブレークポイントのコールスタックを確認できます。  

14.    右上にはブレークポイントのあるソースコードとデバッグの実行を制御するための一連のボタンがあります。  

15.    デバッグコンソールを使ってそこに何かを入力する必要がある場合は、「Name_”,”_Title」と入力すると、デバッグコンソールで変数の連結を確認できます。

16.    結果の変数を選択し、右クリックして「Add to Watch」を選択します。

17.    これで、WATCH セッションで結果の変数の現在の値を監視し、変更できるようになりました。

18.    最後に、フッターバーはオレンジになっており、デバッグ中であることを示しています。

デバッグコンソールの使用

デバッグコンソールでは、デバッグ中に式を記述して、様々な変数(単純な方またはオブジェクト型)の値を確認したり、現在の値や他の条件を検証したりすることができます。 当たりを返すものであれば何でも実行できるため、$zv も機能します。 以下の手順に従って、いくつかのオプションを確認してください。

1.    デバッグターミナルプロンプトに「Name_", "_Title_" From "_Company」と入力すると、名前、タイトル、会社が連結された値を出力として確認できます。

デバッグツールバーの使用

デバッグツールバーではデバッグの実行を制御できるため、ここではボタンの機能を確認します。

1.    「Continue」ボタン(F9): 実行を次のブレークポイントまで続けます。 次のブレークポイントがない場合は、最後まで実行されます。
2.    Step Over(F8): 内部メソッドのソースコードに入らずに次の行に移動します(Populate メソッドに入りません)。
3.    Step Into(F7): 内部メソッドのソースコード内の次の行に移動します(Populate メソッドの最初の行に移動します)。
4.    Step Out(Shift + F8): メソッドの呼び出し元ソースコードの現在の行に移動します。
5.    Restart(Crtl + Shift + F5): デバッグをリプレイします。
6.    Stop: デバッグセッションを停止します。  

%CSP.REST クラスメソッドのデバッグ

REST クラスメソッドをデバッグするには、Fábio Gonçalves が見つけた簡単なトリック(こちらで記事をご覧ください: https://community.intersystems.com/post/atelier-debugging-attach-process)を適用する必要があります。 HANG を追加する必要があります(20~30 秒が推奨です)。 以下の手順に従ってください。

1.    ファイル src\dc\Sample\PersonREST.cls を開き、GetInfo() メソッドに移動して HANG 30 を追加します(このメソッドのデバッグの開始までに30 秒の時間を得えるには必要です)。

2.    HANG と SET の行にブレークポイントを設定します(赤い丸)。

3.    HTTP クライアントを開いて REST メソッドを呼び出します(ここではクラス PersonREST から GetInfo を呼び出します):

4.    Basic Auth を Authorization に設定します(ユーザー名: _SYSTEM、パスワード: SYS)。

5.    GET http://localhost:52773/crud/ を送信します。
6.    フッターバーの「ObjectScript Attach」をクリックします。

7.    ObjectScript Attach を選択します。

8.    PersonREST プロセスを選択します。

9.    VSCode がブレークポイントで現在の実行を停止するまでしばらく待ちます(約 30 秒)。

注意 1: HANG は実行を停止するため、デバッグを終了したら、HANG 30 を削除してください。

注意 2: PersonREST プロセスが表示されない場合は、VSCode を再起動してもう一度お試しください。

10.    これでデバッグプロセスを実行できるようになりました。

ブレークポイントの編集

ブレークポイントを右クリックすると、削除するか条件ブレークポイント(条件が true の場合にブレークポイントで停止)を構成できます。 コードに埋め込まれたブレークコマンドも、デバッガーによってキャッチされます。 これも試してみてください。

1.    ブレークポイントを右クリックし、「Edfit Breakpoint」を選択します。

2.    下に示す式を入力し、Enter を押します。

注意: version = 1.0.5 でブレークポイントが false になるのと、1.0.6 で true になるのを試してみてください。

 

.vscode/launch.json ファイルでデバッグオプションを構成する

Launch.json ファイルは、プロジェクトのデバッグオプションの構成に使用します。 他のオプションを見るには、こちらのファイルに移動してください。

このサンプルの場合、選択できるデバッグオプションは 2 つあります。

1.    直接プログラムで、プログラム属性に構成されたクラスでデバッグを起動します(この例では、デバッガーは PackageSample.ObjectScript クラスのメソッド Test() で開始します)。
2.    デバッグするために選択したプログラムプロセスに PickProcess をアタッチできます。 この例では、デバッガーはプロセスのリストの最上位で開くため、デバッグするプロセス(各プログラムにはそのプロセスがあります)を選択します。 2 つ目のオプションの方が一般的です。

一般的な方法では、任意のデバッグ構成においてこれらの属性は必須です(出典: https://intersystems-community.github.io/vscode-objectscript/rundebug/)。

  • type - 使用するデバッグのタイプを識別します。 この場合、objectscript は InterSystems ObjectScript 拡張機能によって提供されています。
  • request - この起動構成の操作タイプを識別します。 可能な値は launch と attach です。
  • name - 構成を識別するための任意の名前。 この名前は「Start Debugging」ドロップダウンリストに表示されます。

また、ObjectScript 起動構成では、属性 program を指定する必要があります。この属性は、次の例に示すように、デバッガーの起動時に実行するルーチンまたは ClassMethod を指定します。

"launch": {
    "version": "0.2.0",
    "configurations": [
       {
        "type": "objectscript",
        "request": "launch",
        "name": "ObjectScript Debug HelloWorld",
        "program": "##class(Test.MyClass).HelloWorld()",
      },
      {
        "type": "objectscript",
        "request": "launch",
        "name": "ObjectScript Debug GoodbyeWorld",
        "program": "##class(Test.MyOtherClass).GoodbyeWorld()",
      },
   ]
}

ObjectScript の attach 構成の場合、以下の属性を指定する必要がある場合があります。

  • processId - 文字列または数値にアタッチするプロセスの ID を指定します。 デフォルトは "${command:PickProcess}" で、実行時にアタッチするプロセス ID のドロップダウンリストを提供します。
  • system - システムプロセスへのアタッチを許可するかどうかを指定します。 デフォルトは false です。

次の例は、複数の有効な ObjectScript アタッチ構成を示しています。

"launch": {
    "version": "0.2.0",
    "configurations": [
        {
            "type": "objectscript",
            "request": "attach",
            "name": "Attach 1",
            "processId": 5678
        },
        {
            "type": "objectscript",
            "request": "attach",
            "name": "Attach 2",
            "system": true
        },
    ]
}

これで、デバッグサイドバーの上部にある Run and Debug フィールドに VS Code が提供するリストからデバッグ構成を選択することができます(出典: https://intersystems-community.github.io/vscode-objectscript/rundebug/)。

緑色の矢印をクリックすると、現在選択されているデバッグ構成が実行します。
ObjectScript 起動デバッグセッションを開始する際は、エディターとアクティブなタブでデバッグするプログラムを含むファイルが開いていることを確認してください。 VS Code はアクティブなエディター(フォーカスのあるタブ)でファイルのサーバーを使ってセッションのデバッグを開始します。 これは、アタッチされた ObjectScript デバッグセッションにも適用されます。
この拡張機能はセッション中、WebSocket を使用して InterSystems サーバーと通信します。 デバッグセッションを開始しようとする際に問題が発生する場合は、InterSystems サーバーの Web サーバーが WebSocket 通信を許可しているかを確認してください。
デバッグコマンドと Run メニューの項目は VS Code がサポートする他の言語でも同じように機能します。 VS Code のデバッグに関するその他の情報については、このセクションの最初にリストされているドキュメントリソースをご覧ください。

ローカルソースコードとサーバーソースコード(IRIS サーバー)の同期を設定する

ソースコードにフォルダ構造を用意しておくことも非常に重要です。これは "objectscript.export" 設定で行われます。 この情報はサーバーの食らう名をローカルファイルに変換するために使用されます。 これに誤りがある場合、ローカルにのみ存在する場合でも、読み取り専用モードでクラスが開く場合があります。
1.    .vscode\settings.json ファイルを開き、objectscript.export を構成します。

2.    フォルダにマウスポインターを合わせ、カテゴリとその他のパラメーターを追加してそれに関するドキュメントを表示します。

デバッグプロセスを補完するその他のテクニック

プログラムをデバッグするほかに、ソースコードを十分にドキュメント化し、重要なコードが実行した操作をログに記録し、ユニットテストとソースコード静的解析ツールを実行することも覚えておきましょう。 こうすることで、プログラムの品質ははるかに改善され、メンテナンスと調整時間、および費用を削減できます。

さらに学習する

以下のリソースを確認すると、VSCode での ObjectScript のデバッグに関してさらに読むことができます。
1.    https://www.youtube.com/watch?v=diLHwA0rlGM
2.    https://intersystems-community.github.io/vscode-objectscript/rundebug/
3.    https://code.visualstudio.com/docs/introvideos/debugging
4.    https://code.visualstudio.com/docs/editor/debugging
5.    https://docs.intersystems.com/iris20221/csp/docbook/Doc.View.cls?KEY=TOS_VSCode

@Yuri Marxさんが書いた元の記事へ
ディスカッション (0)1
続けるにはログインするか新規登録を行ってください