VSCode:RESTサービス実行中プロセスにアタッチしてデバッグする方法
開発者の皆さん、こんにちは!
1つ前の記事では、VSCodeのObjectScriptエクステンションに追加されたRESTサービスのデバッグツールについてご紹介しましたが、この記事では、RESTクライアントなどからHTTP要求を実行し、処理中のIRIS内プロセスにアタッチしながらデバッグを行う方法についてご紹介します。
事前準備などは、前回の記事と一緒になりますのでこの記事では割愛します。
図解のクラスでお試しいただく場合は、こちら👉https://github.com/Intersystems-jp/RESTDebug-VSCode をご利用ください。
この方法では、HTTP要求時に実行しているIRIS内プロセスを特定する必要があります。
そのため、デバッグ対象のメソッドで処理を待機させるため、hang 20のようにhangコマンドをコード中に追加して試します。
手順は以下の通りです。
1) プロセスにアタッチしてデバッグを行うため、launch.jsonを作成する。
VSCodeのデバッグ用ファイル:launch.jsonファイルを作成し、アタッチ用の設定を行います。
作成方法詳細は、VSCode:プロセスにアタッチしてデバッグする方法の「手順1:launch.json の用意」をご参照ください。
例)
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0",
"configurations": [
{
"type": "objectscript",
"request": "attach",
"name": "アタッチデバッグ練習",
"system": true,
"processId": "${command:PickProcess}"
}
]
}
2) デバッグ対象メソッドにHangコマンド追加します。
Hangを利用して処理を数秒待機させ、その間に実行中プロセスを特定します。ブレークポイントを置きたい行の前あたりにhangコマンドを追加してください(20~30秒待機するように記述します)。
hang20VSCodeでコードを編集するためには、ワークスペース内にクラス定義用ファイル(*.cls)を配置する必要があります。
サーバ側にあるコードに追記したい場合は、ワークスペースにエクスポートしてから追記します。
エクスポートは、サーバ側の対象コードを右クリックし「Export」を選択します。(下図参照)
Export実行後、ワークスペースに移動します。エクスポートファイルは、/src/パッケージ名/クラス名.clsの形式でワークスペースにエクスポートされます。
対象クラスを開き、コードを追記します。
コードの追記が終わったら、Ctrl+Sで保存します(保存+コンパイルが実施されます)。
3) 外部クライアントからHTTP要求を実行します。
例は、PostmanからPOST要求でクエリパラメータとBodyに文字列を指定しています。
Sendボタンを実行すると、2) で指定したHangコマンドが実行されるため、指定秒数待機します。
この間に、アタッチ対象プロセスを探します。
4) アタッチ対象プロセスにアタッチする。
3) の実行後すぐ、VSCodeのデバッグウィンドウを開き、launch.jsonで指定したデバッグ名(例では、「アタッチデバッグ練習」)をクリックし、プロセスリストを表示させます。
プロセスリストには「RESTディスパッチクラス名.*」(*には数字が入ります)の形式で処理中ルーチン名が表示されます。
対象プロセスを見つけたら行をクリックしプロセスにアタッチします。
注意:指定したhangの秒数の間にプロセスを見つけてアタッチしてください。
5) デバッグを実行する。
Hangコマンドの実行が終わると、ブレークマークのところでデバッグが一時停止します。
後は、デバッグ用アイコンを利用してデバッグを進めるだけです。
6) デバッグを終了する。
最後に、デバッグ停止のボタンを押して終了します。
メモ:
- アタッチ用プロセス一覧に対象プロセスが表示されない場合は、一旦VSCodeを再起動して再度お試しください。
- アタッチのデバッグを実行するために追加した
hangコマンドはデバッグ終了時必ず削除/コメント化してください。
Comments
いつも記事をいろいろと参考にさせていただいております!
本記事の内容において、RESTのデバッグを実行してみたところ
ブレイクポイントでは止まっているように見えるのですが、ソースがコンパイルされたルーチンに
切り替わり先頭のところから動かない状態となっております。
(ステップオーバーやステップインをしてもクラスファイル上のソースで動かない)
設定等でなにか不足なものや確認するべき点はありますでしょうか?
環境
OS:Windows 11
IRIS:IRIS for Windows (x86-64) 2023.1.5 (Build 697U) Thu Oct 3 2024 13:47:51 EDT [Health:5.1.0-4.m2023.1.5]
VSCode:バージョン: 1.101.2 (system setup)
Extension類:InterSystems ObjectScript - 3.0.4
@Kazuma Watanabe さん、ご報告ありがとうございます。
接続したIRISのバージョンは異なりますが(2025.1 (Build 230.2U))同じようにクラスファイル上でステップインなどのデバッグボタンが動かない事を確認しました。
解決方法の確認も含め、一旦 ObjectScript extentionリポジトリの issues に登録してみました。
https://github.com/intersystems-community/vscode-objectscript/issues/1607
@Mihoko Iijima 様
ご確認、ご対応ありがとうございます!
ObjectScript extention の Issues の対応状況もWatchしておきたいと思います。
@Kazuma Watanabe さん、Web アプリケーションパスの設定によって、正しくデバッグできるときとできないときがあるようです(バグではないようです)。
https://github.com/intersystems-community/vscode-objectscript/issues/1607#issuecomment-3058191233
私が試したときの設定は以下の通りです(正しくデバッグ行が表示されないときの設定)。
- UnknownUserにロールを付与していない
- RESTで使用するウェブアプリケーションパスの認証が「認証なし」
- ウェブアプリケーションパスの「アプリケーションロール」に%Allを付与している
.png)
.png)
以下のどちらかの設定を変えると正しくデバッグ行が表示されるようになりました。
A) ウェブアプリケーションパスの「認証なし」のチェックを外し「パスワード」に変更(アプリケーションロールは%Allがあってもなくてもどちらでも動作しました)
B) ウェブアプリケーションパスは「認証なし」を設定
+「アプリケーションロール」から %Allロールを外す
+ UnknownUser に %All ロールを付与する
上記AかBの設定で一度お試しいただけないでしょうか。
ご確認よろしくお願いします!
@Mihoko Iijima
詳細なご説明ありがとうございます。
Aのパターンにて実施したところ、正常にブレイクポイント行で止まりソースも追うことができました。
Bパターンにつきましてはまた時間のあるときに試してみたいと思います。




