サーバーとクライアントの間の通信プロトコルのメモ。(仕様は未確定。)
- デバッギー
- スクリプトをデバッグ実行している HSP ランタイムのプロセス (hsp3.exe)
- サーバー
- HSP のランタイムにロードされているデバッガーモジュール (hsp3debug.dll)
- クライアント
- デバッグウィンドウを表示しているプロセス (knowbug_client.exe)
サーバーとクライアントは互いに以下の形式のメッセージを送ることで通信する。(mod_transfer_protocol.hsp を参照)
例:
method = initialized_event
version = v1.0.0
- メッセージは conf のような形式を使う。
- 改行区切り
- 各行は「キー = 値」の形式
- (将来的には JSON にしたい。)
- 先頭の行は method でなければいけない。
- サーバーからクライアントに送るメソッドは xxx_event という名前になっている。
- デバッギーが起こしたイベント (assert など) にデバッガーが反応するイメージ
- クライアントからサーバーに送るメソッドは xxx_notification という名前になっている。
- ユーザーの操作をデバッガーモジュールやランタイムに通知するイメージ
サーバーがクライアントを起動した後、クライアントは初期化が完了した旨をサーバーに通知する。
method = initialize_notification
client_hwnd = <hwnd>
ほかのすべてのメッセージについて、クライアントから initialize_notification を受け取った後にのみ、サーバーはクライアントにメッセージを送ってよい。
これを受信したサーバーは以下のメッセージを送る。サーバーのバージョン番号を含めてよい。
method = initialized_event
version = v1.0.0
サーバーはクライアントにデバッグの終了を通知できる。
method = terminated_event
任意のタイミングで、クライアントはサーバーにデバッグの終了を通知できる。
method = terminate_notification
クライアントは以下のメッセージを送って、サーバーにデバッギーのステップ実行を要求できる。
実行の再開:
method = continue_notification
実行の中断:
method = pause_notification
ステップイン (「次へ」):
method = step_in_notification
ステップオーバー (「次飛」):
method = step_over_notification
ステップアウト (「脱出」):
method = step_out_notification
サーバーは以下のメッセージを送って、デバッギーの実行状態をクライアントに知らせることができる。(クライアントからのメッセージとは無関係に送ってもよい。)
実行の再開:
method = continued_event
実行の中断:
method = stopped_event
クライアントはサーバーにデバッギーの実行中の位置を要求できる。
method = location_notification
このメッセージを受信したサーバーは、可能ならクライアントに実行位置を知らせる。
method = location_event
source_file_id = <実行位置のソースファイルID>
line_index = <実行位置の行番号(0から始まる)>
ソースファイルIDは、ソースファイルを区別するために割り振られた1以上の整数。クライアントは以下のメッセージでソースファイルの詳細をサーバーに要求できる。
method = source_notification
source_file_id = <ソースファイルID>
サーバーは可能なら以下の応答を返す。
method = source_event
source_file_id = <ソースファイルID>
source_path = <ソースファイルのパス(UTF-8)>
source_code = <ソースコード(UTF-8)>
クライアントはサーバーにオブジェクト (変数など) のデータを要求できる。
method = list_update_notification
サーバーはオブジェクトデータの変化に関して、以下の応答を好きな数だけ送る。
method = list_updated_event
kind = <insert または remove または update>
object_id = <オブジェクトID>
index = <リスト上のインデックス>
name = <オブジェクトの名前>
value = <オブジェクトの値>
count = <除去件数 (remove のときのみ)>
クライアントはサーバーにオブジェクトリストの詳細さの変更を要求できる。
method = list_toggle_expand_notification
object_id = <オブジェクトID>
サーバーは可能なら list_updated_event イベントで応答する。
クライアントはサーバーにオブジェクトの詳細情報を要求できる。
method = list_details_notification
object_id = <オブジェクトID>
サーバーは可能なら以下の応答を返す。
method = list_details_event
object_id = <オブジェクトID>
text = <テキスト(UTF-8)>
サーバーはデバッギーやサーバー自身が生成したログをクライアントに送信できる。
method = output_event
output = <テキスト(UTF-8)>