Wineの開発版(1.7系のバージョン)でWOLF RPGエディター(ウディタ)のバージョン2.10で作成された作品を動かそうとしたところ、開始時に落ちる(プログラムが異常終了する)現象が発生した。これについて本記事で扱う。
影響を受けるバージョンの範囲
バージョン1.7.48までのバージョン(1.6系含む)では正常に動作するが、1.7.49から1.7.53のバージョンで不具合が発生する。[1]
Gitの “bisect” と呼ばれる機能を用いた “Regression Testing” を行って原因となる修正の特定を試みたところ、順調にはいかなかった(後述)ものの、最終的にはWine版のxaudio2_8.dll
の実装が新しく追加されたタイミングで問題が発生していることが分かった。
ここでバグ報告を考えたのだが、その後のGit版の中でこの問題が解決されていることが分かり、2015年10月末に公開されたバージョン1.7.54時点では正常に動作する。
該当バージョンのWineにおける対処
ディストリのパッケージなどの関係で該当バージョンのWineを用いている場合でも、前述のDLLが使用されないようにすれば問題は回避できる。方法は幾つか考えられるが、 “xaudio2_8” に対するDLLオーバーライド設定で同DLLを無効化する(未インストールとして扱う)方法が最も手っ取り早い。
winecfg
(WineのGUI設定ツール)を用いる場合は
- “アプリケーション” タブで “アプリケーションを追加” を押して
Game.exe
(ファイル名を変更している場合はその名前)の場所を選択し、同タブでこの項目が選択されていることを確認 - “ライブラリ” タブで “ライブラリの新規オーバーライド” から “xaudio2_8” を一覧から選択するか直接入力して “追加” を押す
- “既存のオーバーライド” の “xaudio2_8” の項目が選択されていることを確認後 “編集” を押して “無効化” を選択して “OK” を押し、一覧の中で無効化されていることを確認
- “OK” を押して設定ツールを終了
とすることで無効化が行えるが、これをする代わりに環境変数WINEDLLOVERRIDESに “xaudio2_8=” [2]を指定してGame.exe
を実行することでも(これを指定した場合のみ)無効化ができる。
$ WINEDLLOVERRIDES=xaudio2_8= wine /path/to/Game.exe
関連:原因特定の過程におけるメモ(ビルドシステム関係)
以下はWineのソースの中でどの修正が原因となったかの特定に関わる内容となり、Wine自体を使用する際には関係のないものとなる。
前述の “Regression Testing” をはじめに行った際、何故かテスト結果が常に “失敗” (正常に動作せず、落ちる)となり、実際には関係のない修正が結果として出力されてしまったが、これはテストの過程でGitが何度もソースツリーの中身を書き換える中でビルドシステム関係の操作をやり直さずにmake
コマンドを繰り返し実行していたことによるもので、実際に原因となっていた修正に “新規DLLの追加” という(ビルドシステムに影響する)内容が含まれていたのが関係していたようだ。
つまり、最初に “正常に動作する最後のバージョン” と “正常に動作しない最初のバージョン” の両方を指定した後のテストの流れとしては
configure
を実行- ビルド
- 正常に動作するかを確認
- “
make
distclean” を実行 - 結果(“good” か “bad” か)をGitに知らせる
を繰り返すようにしたほうが正確な結果が得られるということになる。ただ、 “make
distclean” は念の為に行ったものなので、実際には必要はないかもしれない(未検証)。
なお、テスト時にはccache
も使っていたので、これが何か悪さをしていたのではないかとも疑ったが、これを使わずにビルドしても結果は同じで関係はなかった。ccache
はこのようなテストではその性質上使ったほうが時間と資源の節約になるので使ったほうがよい。
- Wine 1.7.47 - 1.7.50, 1.7.52 - 1.7.54