Darkside(リンクエラー修正しました)

2015年3月10日(火) 21:18

アナログ lua

 ランナバウト1の戦車超加速は、比較的発生し易い裏技だがいざやろうとするとなかなか発生しない。こういうのは、lua スクリプトで絨毯爆撃するパターンだ。
 そこで、本当にアナログ入力が可能かどうか確認する。
 その結果、アナログ入力は可能でネジコンとして機能することが確認できた。ところが、とんでもない問題が発覚。ステートロードができないのだ。正確に言えば、ステートを作成しようとすると、PSXjin がアプリケーションエラーを起こして強制終了してしまう。

 更に恐ろしいことに、無改造の PSXjin では正常に実行できる。パッドのタイプをデジタルに設定しているかどうかは関係ない。

 とはいえ、こういう時こそ Visual C++ のデバッグ環境の出番だ。一体どこでエラーが発生しているのか?
 だが、エラーは lia51.dll で発生しているようだ。これでは、トレースできない。いや待て、lua は別途公開されていたはず。PSXjin に付属しているのは lua 5.1.4 だが、調べるとバージョンは 5.3.0 まで進んでいる。最新の lua を落として来て、コンパイル。しかし、どんなに頑張ってもリンクできない。obj の中で関数が重複している。かと言って一部のライブラリーを外すと、今度は関数が足りないと言われる。
 付属以外の lua を合体させることは、どうしても成功しない。

 しかし、試行錯誤しているうちに気付いた。本当に、lua51.dll の内部が問題なのか?
 PSXjin の内部は明らかにマルチスレッドになっていて、局所的な処理はトレースできるが大きな流れはトレースし難い。エラー発生の直接原因が savestate.create だというのは判明している。そして、savestate.create の実際の処理は、LuaEngine.cpp 内の savestate_create() 関数で行われている。これは、lua51.dll の中ではなく PSXjin のソース中である。
 こういう場合の確認方法として、savestate_create() 関数の内部をコメントアウトして空っぽにしてみる。そして PSXjin をコンパイルし、問題の lua スクリプトを走らせる。すると、全くエラーが発生せず正常に終了した。

 こうなれば、後は簡単だ。どこでエラーが発生しているか容易に調査可能。
 その結果、ステートセーブするファイル名を格納するメモリーが犯人と判明。C言語の難点は、文字列の処理が面倒なことにある。文字列を格納するメモリーの管理を、プログラマーが行わねばならない。このメモリーを動的に確保し、最後にメモリーを解放するときにエラーとなっていた。原因を調べるのは難航しそうなので、後腐れなくメモリーを静的に確保するように書き換える。
 エラーは、発生しなくなった。

 無改造の PSXjin では動的確保でも動いているのだから、完全解決ではない。だが、他人の作成したプログラムである。神経質に関わっても時間の浪費だ。

written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4