HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0221
MZKザブルーチン内でのエラー時のデバッグ7未解決


MZK

リンク

2021/2/21(Sun) 13:44:04|NO.92303

いつもお世話になっています。
メインループからgosubやdeffuncで作成した自作命令に飛んで処理をしている際に、
ザブルーチン内でエラーが起きた場合、エラーログの行数でザブルーチンや命令内のエラー箇所は分かるのですが、
多くの場合引数として渡した情報に問題が有るので、メインループのどこからそのザブルーチンや命令に飛んだかを知りたいです。
デバッグウィンドウ等にそういった情報はありますでしょつか?



この記事に返信する


ふにくら

リンク

2021/2/23(Tue) 23:26:25|NO.92334

ザブではなくサブ(sub)です……という重箱のなんとやらは置いておきまして。

デバッグウィンドウにはそういった情報はなさそうですね・・・。
HSPSDK(http://www.onionsoft.net/hsp/v36/hspsdk/hspdll.txt)には以下のような記述があります。
------------------------------------------------
void *prmstack; // Current parameter stack area

サブルーチンやユーザー定義命令内で参照されるスタックパラメーターを格納します。
スタックパラメーターには、複数の情報が多重に保存されています。
------------------------------------------------

このスタック内には恐らくサブルーチンに渡された引数や返り値、return先の情報もあり、return先の情報とそれ以外をより分ける事ができれば可能性はありそうです。
ただそのreturn先も行数という形ではなくポインタだったりするとお手上げですね…。
Cには明るくないので推測で申し訳ないですが。
私も興味があるので、詳しい方の知見を期待します。

一応、マクロでごりごり書く力技もあります。以下サンプル。

#uselib "msvcrt" #func memmove "memmove" var,var,int #define SUB_ROUTINE_DEBUG #ifdef SUB_ROUTINE_DEBUG #undef gosub #define gosub(%1) saveCalledLine __line__ : gosub@HSP %1 ;監視したい命令は個別に追記 #define func1 saveCalledLine __line__:_func1 #endif dim line_buf, 8 func1 gosub *label_2 stop //呼び出し元行を8つまで記録 ;最新の呼び出し元は常に要素0に書き込まれる #deffunc saveCalledLine int prm_line_no memmove line_buf(1), line_buf(0), 28 line_buf(0) = prm_line_no return #deffunc _func1 gosub *label_1 return *label_1 return *label_2 return



ふにくら

リンク

2021/2/23(Tue) 23:35:55|NO.92335

1個書き忘れましたが、上のスクリプトだとモジュール使用時に行数がズレるはずです。
(include/additionした箇所にモジュールが展開されるため)
モジュールによって膨らむ行数を何らかの手段で把握するか、シングルファイルのスクリプトで使うのが精々といった代物です。



TOMATO

リンク

2021/2/23(Tue) 23:47:02|NO.92336

HSP3 拡張版デバッグウィンドウ knowbug ではコールスタック表示機能があります。
この機能を使えば、ユーザー定義関数などの呼び出し情報が残ります。
https://github.com/vain0x/knowbug/releases/tag/v2.0.3


#addition "WrapCall.as" #module #deffunc f1 int a f2 2 return #deffunc f2 int b f3 3 return #deffunc f3 int c dialog str(c) return #global f1 1



MZK

リンク

2021/2/26(Fri) 08:37:30|NO.92349

ふにくらさん

ありがとうございます。何故かザブになってますね。。。
マクロであらかじめ監視できるようにしておく方法があるんですね。
大変そうですがプログラムの書き方を考えておくという意味で参考になります。

TOMATOさん

ありがとうございます。
knowbugとwrapCall、是非試してみたいと思います。
HSP3dishでも問題なく使用できますでしょうか?



TOMATO

リンク

2021/2/26(Fri) 23:10:09|NO.92361

>HSP3dishでも問題なく使用できますでしょうか?
HSP3dishのサンプルソースなどで試した限りでは大丈夫そうでした。



ウンチョコレートカカオ

リンク

2021/3/1(Mon) 17:39:59|NO.92374

引数をモジュール内の変数(hoge@m0など)に入れて、デバッグウィンドウで見ればいいのでは?



MZK

リンク

2021/3/3(Wed) 22:32:35|NO.92400

TOMATOさん

試してみました。とても使いやすいです。
デバッグウィンドウの「呼び出し」欄にエラーが起きた自作関数が表示され、
引数などの内容も確認できました。
では、その関数が何行目から呼び出されたのか?という点は把握出来ないでしょうか?

ウンチョコレートカカオさん

はい、引数の内容は変数に入れて確認などしているのですが、
メインスクリプトの何行目から呼び出された際にその様な異常な引数が与えられてしまったのか、
をデバッグウィンドウから確認できると便利だなと思いました。



ONION software Copyright 1997-2023(c) All rights reserved.