knowbug
knowbug copied to clipboard
Debug Adapter Protocol (DAP) 対応
knowbug を DAP サーバーとして動作させることにより、Visual Studio Code (VSCode) 上でのデバッグを可能にします。
参考:
- Debug Adapter Protocol Overview
- DAP の公式サイト
- Debugger Extension | Visual Studio Code Extension API
- VSCode のデバッガー用拡張機能に関するドキュメント
- HSP3 DEBUG GINGER
- HSP 向けの DAP 実装のプロトタイプ
全体の流れ
- ユーザーが VSCode 上で F5 ボタンを押してデバッグ実行を開始しようとしたとします。
- このとき VSCode は DAP アダプターのプロセスを生成し、標準入出力により通信します。DAP アダプターは、knowbug 側で用意したコンソールアプリです。(実装言語は不問)
- 次に VSCode は DAP アダプターに "launch" リクエストを送ります。DAP アダプターは、これを受け取ったとき、HSP スクリプトのデバッグ実行を開始します。
- HSP スクリプトのデバッグ実行の開始時に、HSP ランタイムはデバッガー (hsp3debug.dll = knowbug_dll) をロードして起動します。
- 「何らかの方法」でデバッガーが DAP アダプターと接続し、通信して情報をやりとりをします。
起動順序:
- VSCode → DAPアダプター → HSPランタイム → デバッガー
通信経路:
VSCode
↕ 標準入出力
DAP アダプター
↕ 何らかの方法 (名前付きパイプや TCP 通信など)
デバッガー
↕ 関数呼び出しなど (同一プロセスなので変数を共有可能)
HSP ランタイム
備考:
- DAP アダプターからデバッガーが起動したときは、knowbug クライアント (knowbug_client.exe) はいらないため、起動しないようにします。
実装
(予定)
- DAPアダプター:
- C++で書きます。
- DAPアダプターとデバッガーの通信方法:
- 名前付きパイプ (NamedPipe) を使います。
接続の流れ
- DAPアダプターは起動後、標準入力を待機して、DAPメッセージを読んでいきます。
- VSCode から ”launch" メッセージが来たら待機は終了し、名前付きパイプ P を作成して、HSP ランタイムを起動します。
- HSP ランタイムが起動して、デバッガーが起動します。
- デバッガーは起動時に、名前付きパイプ P を探します。
- なければ従来通り、knowbug_client を起動して通信します。
- 名前付きパイプ P があれば、接続します。
- おそらく接続用のスレッドが必要です。
- 接続の証に、launch リクエストのレスポンスを流します。
- DAP アダプターは、標準入出力をパイプ P に転送するモードに移行します。
- 標準入力とパイプ P の入力を待機します。
- 標準入力から読み取ったデータは、そのままパイプ P に流します。
- パイプ P から読み取ったデータは、そのまま標準出力に流します。
- これにより、VSCode とデバッガーがパイプ P を通じて通信できます。
- (HSP3 DEBUG GINGER の middle apdater はすでにこのような動作です。)
- 後は DAP の通りに通信・終了すればよいです。