hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
MakeHPI/DebugWindow - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

MakeHPI

hsp3.png

デバッグウィンドウの作成sdk31b3.png

HSP3のデバッグウィンドウは、HSP本体 (hsp3.exe など) とは切り離されており、hsp3debug.dll によって提供される拡張プラグインの一つと捕らえることができます。
このことから、hsp3debug.dllをHSP3のデバッグウィンドウ呼び出しルールに則って作成し、差し替えることによって、デバッグウィンドウを自分で作ったものにすることが出来ます。

ただしBorland製のコンパイラ( BCC )とマイクロソフト製のコンパイラ( VC )とで生成されるDLLの種類が異なるため、Borland製コンパイラでは作る際に別途defファイルが必要となります。

デバッグ情報を管理する構造体 HSP3DEBUG

+  HSP3DEBUGの定義 (hsp3debug.h より引用)

HSPから呼ばれる2つのDLL関数

次の2つの関数はHSPから呼ばれるため、名前、戻り値、引数並びを変更してはいけません。

debugini()関数
EXPORT BOOL WINAPI debugini( HSP3DEBUG *p1, int p2, int p3, int p4 )

デバッグウィンドウを使用する際に、最初の一回だけ呼び出される関数です。
通常はここでデバッグウィンドウの初期化・表示をします。
また、引数から、デバッグファンクションを利用するためのポインタ HSP3DEBUG * が与えられます。

debug_notice()関数
EXPORT BOOL WINAPI debug_notice( HSP3DEBUG *p1, int p2, int p3, int p4 )

変数の内容など、HSPからデバッグウィンドウの更新を要求されたときに呼び出される関数です。

p2 は、これが呼び出された原因を示します。

p2内容
0stop などにより、実行が停止した (assert, wait, await では送られない)
1logmes命令が実行された (文字列は ctx->stmp にある)

デバッグファンクション

実行中のスクリプトの状態を取得するための関数は、HSP3DEBUG構造体が持つ関数ポインタとして提供されています (以下、関数ポインタを関数と同様に扱います)。

dbg_curinf()関数
void	(* dbg_curinf)( void );

HSPに実行中の行番号とファイル名を問い合わせます。
結果は同構造体のメンバ line, fname に設定されます。

get_value()関数
char *	(* get_value) (int p1);

スクリプトの情報を取得します。
以下に示す列挙型の値を指定します。

p1内容
DEBUGINFO_GENERAL標準デバッグウィンドウの「全般」と同じ項目を表すリストを取得する
DEBUGINFO_VARNAME予約・未定義
DEBUGINFO_INTINFO予約・未定義
DEBUGINFO_GRINFO予約・未定義
DEBUGINFO_MMINFO予約・未定義

ここで得られる「全般」リストは、改行区切り (メモリノートパッド形式) の文字列です。偶数行目が項目、その次の行がその内容です。

これを呼び出した後は、受け取ったポインタがいらなくなった際に、dbg_close() を呼ぶ必要があります。

get_varinf()関数
char *	(* get_varinf) (char *p1,int p2);

変数の情報を取得します。
p1には、変数情報を取得する変数名へのポインタか、NULLポインタを渡します。
p2には取得する情報のタイプを組み合わせて指定できます (ビットフラグ)。取得できる情報の一覧は次の通りです。

p2p1
NULL変数名
0グローバル変数のリストを取得する変数を検索し、その変数についての概要を取得する
1リストのソートを示すが、処理はしない(無視)
2モジュールの中の変数も含める(無視)
4(無視)取得内容に配列要素を含める
8(無視)取得内容にメモリダンプを含める

変数名は、スクリプトで使われている正確な変数名を表す文字列でなければなりません。通常は先に変数名のリストを取得してから、リスト内から有効な変数名を取得し、変数の内容を取得します。

これを呼び出した後は、受け取ったポインタがいらなくなった際に、dbg_close() を呼ぶ必要があります。

dbg_close()関数
void	(* dbg_close) (char *p1);

受け取ったデバッグ情報を解放します。
get_value()とget_varinf()を呼び出した場合、必ずこの関数を呼び出してデバッグ情報の取得を終了しなければなりません。
その際、必ずget_value(), get_varinf()で得られたポインタを渡さなければなりません。

dbg_set()関数
int	(* dbg_set) (int p1);

デバッグモードを表す定数を指定して、デバッグモードを変更します。
指定できる値は以下の通りです。

p1機能詳細
HSPDEBUG_RUN実行処理が停止している場合は停止している次の行から通常モードで処理を再開します。
HSPDEBUG_STOP停止実行中の行で処理を停止します。
HSPDEBUG_STEPIN処理が停止中の場合のみ、停止している次の行を処理して停止します。

戻り値はモードが変更されると0、モードが変更されなかったときは0以外の数値が返ります。

dbg_set()関数を使うと、すぐにHSPCTX構造体のrunmodeメンバに状態が反映されます。
runmodeとデバッグモードでは使う定数が異なるのに注意が必要です。

BCCで作るには

HSPから呼ばれるエクスポート関数 debugini(), debug_notice() の二つの関数を、VC互換のエクスポート名に変換するために以下の内容のdefファイルを用意します。

EXPORTS
_debugini@16=debugini
_debug_notice@16=debug_notice

コメント

ss
  • 出来上がりが楽しみです -- Shark++ 2006-06-28 (水) 01:26:57
  • 目指せ、HSPTVプラグインリスト [kita2] -- kz3 2006-07-01 (土) 10:03:46
  • デバッグウィンドウを作りながら考えていましたが、どうやらやっぱり拡張プラグインで追加された型はデバッグ詳細の「内容」は表示しないみたいです。( longint?プラグイン参考 )
    それも当然で、HSPは拡張された型の具体的な内容は知らないし、HspVarProc?構造体にもデバッグらしきメンバは見当たりません。
    出来てせいぜいメモリダンプ止まり...。型を追加するプラグインの場合は、型提供者( プラグイン作者 )が「内容」をデバッグウィンドウに提供するような仕組みがあると、デバッグウィンドウの質がさらに向上するような?
    型拡張プラグイン側で「内容」に表示する文字列領域を確保して内容を書き込み、デバッグウィンドウにその領域へのポインタを渡して...デバッグウィンドウは処理が終わったら領域を開放するようにプラグイン側に伝える。
    get_varinf()とdbg_close()のような拡張プラグインの為のデバッグメンバを用意するとか...。 -- kz3
  • と思ったら、ライブラリに「code_getdbg()」関数があった。これで取得したHSP3DEBUG構造体の関数ポインタに、プラグイン側でデバッグ情報取得関数( へのポインタ )を切り替えられたりするかな。 -- kz3
  • 標準デバッグウィンドウのバグを見つけましたぁ;;ddwいじったかいがありました;; -- kz3 2006-07-10 (月) 11:59:36
  • そろそろ公開して...xp以外でも大丈夫かどうか... -- kz3 2006-10-27 (金) 13:50:44

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2010-05-31 (月) 19:07:04 (1286d)