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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0102
HK2サブルーチンジャンプの戻り先14解決


HK2

リンク

2012/1/2(Mon) 07:02:02|NO.43996

サブルーチンジャンプの戻り先を取得するとこはできますか。

この方法でエラーが起きた場所を特定したいと思います。



この記事に返信する


いかろ

リンク

2012/1/2(Mon) 15:50:04|NO.44001

標準ではなかったと思いますが、マクロでgosubを使った時点の行番号を「_BeforeLine」という変数に入れるようにしてみました。

//いったん標準のgosubの定義を取り消して、カスタマイズgosubに置き換えるマクロ #undef gosub #define gosub(%1) _BeforeLine=__line__:gosub@hsp %1
これで適当なところでlogmesなり、mesなりで表示すればいいと思います。

//サンプル #undef gosub #define gosub(%1) _BeforeLine=__line__:gosub@hsp %1 gosub *hoge gosub *hoge stop *hoge mes _BeforeLine return

ただ、このようなことをするより、プログラムの流れが分かりやすいようにプログラムを書き直した方がいい気もしますが...



てれてれ

リンク

2012/1/2(Mon) 16:45:59|NO.44002

いやいや、基本的に標準命令を#undefとかしちゃ駄目でしょ。
現にbuttonとか使えなくなってるし。

//サンプル #undef gosub #define gosub(%1) _BeforeLine=__line__:gosub@hsp %1 gosub *hoge button gosub "hoge",*hoge stop *hoge mes _BeforeLine return



ザーメン

リンク

2012/1/2(Mon) 17:38:01|NO.44003

というか標準命令をundefできるhspの仕様に問題がある。



晩御飯

リンク

2012/1/2(Mon) 20:49:21|NO.44004

というか標準命令をundefしようとするやつに問題がある



HK2

リンク

2012/1/3(Tue) 00:43:28|NO.44008

私がしたいことは、
HSPの内部情報からリターン先情報することです。
リターン先の情報があれば、
その位置を参照してどこでエラーが発生したのかが特定しやすくなると思うからです。



晩御飯

リンク

2012/1/3(Tue) 01:28:25|NO.44009

>HSPの内部情報からリターン先情報することです。
これがどういう意味がよくわからないんだけども
リターン先の情報って何なの?
それと今現在あなたはどこで発生しているのかわからないエラーと戦っているの?



レノス

リンク

2012/1/3(Tue) 02:12:42|NO.44010

> HSPの内部情報からリターン先情報
……を取得すること、は基本的に出来ません。

リターン先情報は触れられないところにあるので、知るとしたら、
いかろ氏の方法のようにサブルーチンジャンプを監視するか、
デバッグウィンドウのステップ実行機能を使うしかありません。

--------
後者のステップ実行機能を使う方法について軽く解説しておくと:

assert 命令を実行すると、stop のようにそこで実行が止まります。
そのときデバッグウィンドウ(Debug Window)が表示されるのですが、
その「次行」ボタンを押すと、止まったところの次の命令を1つだけ実行できます。
これを何度か押して、return の次まで進めると、リターン先がわかります。

> 標準命令の undef
gradf の引数を boxf にあわせたり、とか



HK2

リンク

2012/1/3(Tue) 10:51:07|NO.44012

exeファイル化した後でも使えるようにしたいので、内部情報から取得したいです。

今、私がしようとしていることは、
#undef命令でgosub,goto,return,onclick,onkey,oncmd,onexit,onerror,button,wait,await,stopを取り消して、
#defineでこれらを書き換えるつもりです。

gosubを書き換えて、gosubの行番号を変数でない場所に記録、スタックへの登録、書き換え版buttonへの対応
gotoを書き換えて、書き換え版buttonへの対応
returnを書き換えて、スタックからリターン
onclick,on...,onexit,buttonを書き換えて、ジャンプ先の集中化とジャンプ前の場所の保存、
wait,await,stopを書き換えて書き換え版onclick,on...,onexit,buttonへの対応

onerrorだけは、割り込みうる場所を特定できないので、それに対応したいと思っています。



HK2

リンク

2012/1/5(Thu) 08:08:24|NO.44096

レノスさん

>リターン先情報は触れられないところにあるので
どのような理由で触れられないのでしょうか。
メモリー保護で、アクセスしようとするとエラーになるためですか。
それとも、ただ単に記録位置を取得することは全くできないためですか。



check

リンク

2012/1/5(Thu) 12:37:33|NO.44101

リターン先情報を取得する命令がHSPには無い。
これが結論だ。

HSPCTX構造体等をmref命令で取得して、いろいろやれば
欲しい情報が少しでも見つかるかもしれないが、
俺はHSPCTX構造体等には詳しくないので任せる。



てれてれ

リンク

2012/1/5(Thu) 13:04:25|NO.44102

>exeファイル化した後でも使えるようにしたいので、内部情報から取得したいです。
そもそも行なんて概念は実行ファイルになった時点で破棄されるんじゃないですか?
よって取得する方法があっても取得する対象が無いからどうしようもないんじゃ・・・

ただ、過去にhspcmpを使って、
指定したhspファイルを自動で「エラー行を表示させる」ように改変して、
実行ファイルを自動で生成するツールを作ったことがありますので、
そういった方法を用いれば不可能ではないでしょう。



レノス

リンク

2012/1/5(Thu) 14:00:33|NO.44103

> ただ単に記録位置を取得することは全くできないため
です。

ランタイム側からしか見えないところにある、ということ。



HK2

リンク

2012/1/6(Fri) 10:31:21|NO.44109

今回はあきらめることにします。


てれてれさん

行については記録させるようにする予定です。
goto *label:mes __line__:label

とすればその部分の行数が(最適化されずに)残っていることを確認できました。 checkさん 先は長そうですが、その方法を試したいと思います。 完全にあきらめるつもりはありません。 今はあきらめます。 回答を寄せてくださった皆さん、このスレッドを読んでいただいた皆さん、 ありがとうございました。 また質問をするときがあるかもしれませんが、その時もよろしくお願いします。



HK2

リンク

2012/1/6(Fri) 10:33:35|NO.44110

改行が反映されていないようです。

checkさん
先は長そうですが、その方法を試したいと思います。
完全にあきらめるつもりはありません。
今はあきらめます。


回答を寄せてくださった皆さん、このスレッドを読んでいただいた皆さん、
ありがとうございました。

また質問をするときがあるかもしれませんが、その時もよろしくお願いします。



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