バグ: 素材選択ビューのファイルリスト遅延読込でクラッシュ
Issue 80のコメントより継続している問題です。
32bit環境でファイルリストの遅延読込を行うと環境によって高頻度でクラッシュするとの事です。64bit版でも稀に発生する可能性があります。
エラーログは出力されません。私が確認した類似の現象では、Windowsログには0xc0000005(NULLポインタアクセス)が記録されていました。おそらくライブラリや処理系の内部で発生したものでしょう。
Dの匿名クラスの処理に問題がある可能性があるので、匿名クラスを使わないようにしたテスト版を作ってみました。これで問題が再現しないか試していただけるとありがたいです。
Comments (37)
-
-
テスト版でもやはりクラッシュしたので、 「もしかしてシナリオデータそのものが悪いんじゃないか?」と思い、 試しに交易都市リューンのデータを開いてみると問題なく覗くことができました。
違いは何かと考えてみたところ、
ImageRef.wex
でした。 「イメージ格納」に変わった間だけクラッシュしなくなったので、素人考えですが、どうにもファイル参照周りが怪しく思えます。 -
reporter ありがとうございます。たしかにそのようです。
おそらくですが、具体的には、(1)ダイアログを開く (2)ファイルリストを表示 (3)指定ファイルを選択状態にする、のプロセスのうち、(3)で問題が起きているのだと思います。データ自体の問題ではないはずです。
私の方でも再現するようになりましたので、もう少し詳細に調べてみます。次のテスト版までしばらくお待ちください。
-
reporter https://bitbucket.org/k4nagatsuki/cwxeditor/downloads/cwxeditor_test_20151229b.zip
ファイルを選択状態にする処理をコメントアウトしてみたバージョンです。これが正常に動くようであれば、(3)が本当の問題箇所であることがはっきりするはずです。お手数をおかけしますが試していただけないでしょうか。
-
reporter https://bitbucket.org/k4nagatsuki/cwxeditor/downloads/cwxeditor_test_20151229c.zip
ごめんなさい、バージョンを間違えました。上記が正しいリンクです。
-
cwxeditor_test_20151229c Build: 2015-12-29 19:27:05 Debug / Console (32-bit) Compiled by Digital Mars D 2069
残念ながらクラッシュしてしまいました。
-
reporter うーん、手強いです……。
もうちょっと原因箇所を絞り込んでみます。お待ちください。
-
reporter https://bitbucket.org/k4nagatsuki/cwxeditor/downloads/cwxeditor_test_20151229d.zip
どうも手許では画像がカードサイズか判定する処理(ファイルからと格納イメージからでは別処理になる)で落ちているようだったので、そこのところに手を入れてみました。何度もお手数をお掛けして申し訳ありませんが、お試しください。
-
cwxeditor_test_20151229d Build: 2015-12-29 22:44:01 Debug / Console (32-bit) Compiled by Digital Mars D 2069
こちらでもクラッシュしなくなりました!
思えば、キャストカードは規格外の画像サイズが使われることがあっても アイテムカード等では見た事がありませんね……。 74*94以外の画像サイズは使用していないため、盲点でした。
-
reporter ありがとうございます。これで解決!と言いたいところですが、なんてこった、これはD言語の標準ライブラリ(具体的には
std.stdio.File
)のバグですね。それはそのうち修正されるのを期待するとして、今は他の使用箇所も回避策を取らないといけないです。ともあれありがとうございました。助かりました。修正をコミットしてテスト版を作るまで今しばらくお待ちください。
-
reporter 最新のテスト版を上げました。
昨晩のテスト版で取った方法(ファイルの先頭だけちょっと読み込んでファイルサイズの判断に使う)ではどうしても上手く行かないファイル形式があるので、
std.stdio.File
の代替品を作ってそれを全面的に使う方法を採用したのですが、これでまた問題が再発しては意味が無いので、最後までお手数をおかけしますがお試しください(私の手許では発生しないようです)。 -
cwxeditor_fnine_20151230 Build: 2015-12-30 14:15:31 Debug (32-bit) Compiled by Digital Mars D 2069
念のため、64bit版も含めた4つの
.exe
全てにテストを行いましたが問題なく動作しました。確認方法として、各種カード(アイテムカードなど)を素早く開いて閉じるを何度か繰り返しましたが、 クラッシュする気配はありませんでした。
-
すみません、早速ですが訂正します。
情報カードに
.png
形式の画像ファイルを割り当て保存した直後に 「cwxeditor_fnine.exeは動作を停止してました」とWindows側のエラーが出ました。 -
reporter とりあえず問題無さそうですね。では、これで完了としてクローズさせていただきます。
何度もテストにお付き合いいただき本当にありがとうございました。
-
reporter ああなんてこった。入れ違いです。再調査します。
-
reporter エラーが発生したのは32bit版でよろしいでしょうか。再現性はどうでしょうか。
また、圧縮された状態のシナリオか、あるいは展開済みのシナリオかも教えていただけないでしょうか。
-
すみません、動作確認が甘かったようです。まさか保存の方で出るなんて。
はい、32bit版で発生を確認しました。
- 展開しているクラシック形式のシナリオ。
ImageRef.wex
を削除してもしなくても発生。
.png
ではない可能性も考えて、画像なし本文なしの「あああ」や「242」などの名前だけの 情報カードを作って上書き保存を行ってみたところ、保存直後にそれなりに高い確率で発生しました。 まだ簡単に調査を行っただけですので、他の種類のカードでも発生するかもしれません。- 作成→上書き保存を数回繰り返して停止の通知が表れる。
エラーログは出力されませんでした。
-
reporter https://bitbucket.org/k4nagatsuki/cwxeditor/downloads/cwxeditor_test_20151230a.zip
上のテスト版では標準ライブラリの問題箇所を使う部分を全て書き換えたのですが、一部保存に絡む所があります。それを元に戻してみました。お試しください。
私のところでは今のところ再現しません。保存処理が問題だとすると、カードの作成も関係ないかもしれません。
-
そういえば以前、システム音声の再生方式と拡張子の噛み合わせが悪い、という事がありましたので 試しにシステム音声のパスを削除して鳴らないようにしたら、ピタリと動作停止の通知が止みました……。
原因はこれかもしれません……。
- 指定していたファイルは
.ogg
形式。 - 再生方式はBGM効果音ともに「自動選択」、音量100%.
- 指定していたファイルは
-
cwxeditor_test_20151230a Build: 2015-12-30 15:19:33 Debug / Console (32-bit) Compiled by Digital Mars D 2069
あまりの衝撃にバージョン表記を忘れてしまいました。
-
reporter そうなると音声再生のDLLでエラーが起きているのが確認できるかもしれません。次の手順でWindowsのアプリケーションログを確認していただけないでしょうか。
- スタートメニューなどの「コンピューター」を右クリックしてコンテキストメニューを出し、「管理」を選択
- システムツール→イベントビューアー→Windowsログ→アプリケーション を選択
- エラーのアイコンがついている行を選択し、「障害が発生しているアプリケーション名」が
cwxeditor.exe
になっているか確認 - 「障害が発生しているモジュール名」が
bass.dll
やSDL_mixer.dll
になっている場合は、音声DLLが原因
-
障害が発生しているモジュール名: cwxeditor.exe
-
reporter ログからは分からないっぽいですね。
コンソールが出るバージョンの場合は、保存時に音が鳴る時、
Initialize *** Start
やInitialize *** End
というメッセージが出ていると思うのですが、その***
の部分が何になっているか押していただけないでしょうか。 -
再度
.ogg
形式のシステム音声を指定して、 「自動選択」以外の「WinMM」や「SDL」に変更してみたところ、 動作停止する気配が収まりました。問題は
.dll
ではなくこの「自動選択」にある気がしてきましたが、どうでしょうか? -
Initialize BASS Audio Start Initialize BASS Audio End
コンソールに表示されたログは上記のとおりです。
-
reporter 自動選択では最終的にどれかの形式が選ばれるのですが、一つ手動で強制的に使うようにできない再生形式があります。1.50やCWPyで使われているBASS Audioです。この方式は、CWPyのスキンを使用している時や、クラシックエンジンの1.50を使っている時に限り、自動選択されて有効になります。出力を見る限り実際有効になっているようです(他に
Initialize
がなければですが)。実際に試してみたところ、私の環境でも時折落ちる事が確認できました。DLLのバグでなければ、使い方が悪いのかもしれません。実際、同じファイルを音声再生コンテントの編集ダイアログなどで流してみてもなぜか落ちません。何が悪いのか調べてみます。
-
reporter https://bitbucket.org/k4nagatsuki/cwxeditor/downloads/cwxeditor_test_20151230b.zip
音を鳴らすタイミングを内部的にずらしてみました。私の環境ではこれで落ちなくなるようです。試していただけないでしょうか。
-
cwxeditor_test_20151230b Build: 2015-12-30 16:20:48 Debug / Console (32-bit) Compiled by Digital Mars D 2069
こちらの環境では、何度か保存して鳴らした後に落ちてしまいました。
-
reporter -
cwxeditor_test_20151230c Build: 2015-12-30 16:38:17 Debug / Console (32-bit) Compiled by Digital Mars D 2069
最低でも50回は保存時に鳴らしたと思いますが、 落ちなくなりました!
-
reporter ありがとうございます。となると、どうやらD言語処理系のガーベジコレクション(GC)とBASSの相性が悪そうです(GCのある言語からC言語のライブラリを使うときはいつも鬼門になるものではあるのですが)。理論上は完全には直っていないはずですが、おそらくほとんど発生しなくはなったはずです。完全に発生しなくなるように調査は続けます(でもDのGCはバグ多いからなぁ……)。
最新のテスト版をアップロードしました。これで問題が起きないようなら、今度こそ完了にさせていただきます。
-
cwxeditor_fnine_20151230b Build: 2015-12-30 16:53:39 Debug / Console (32-bit) Compiled by Digital Mars D 2069
特に問題なく動作しました。
今度も少々乱暴に保存して鳴らしてみましたが、 これでこちらの環境ではそう簡単に落ちることは無くなったようです。 (とはいえ仮に0.01%の確率でも当たって急に落ちても困るので再生方式を変更することにします。)
std.stdio.File
(リストの遅延読込)の問題の特定・解決に早々に至ったと思いきや、 今度はGCとBASSの相性問題でバタバタとさせてしまいましたが、 こちらも一応の解決に至ってよかったです。ひとまずお疲れ様でした。
-
reporter 本当に長々とありがとうございました。
現在、原因となっていた処理(GCの起動とBASS再生)を並べる事で高頻度で問題を再現する事に成功していますので、もしかすると完全に直す事も可能かもしれません。もし直せたら、ここでお知らせします。
-
reporter - changed status to resolved
表題の問題の解決。
-
reporter GCが動いても問題を引き起こさないパターンを見つけて最新のテスト版に入れました。
問題は完全に解消しているはずです。よろしければお試しください(ってこれで再発したら洒落にならんな)。
-
cwxeditor_fnine_20151230c / cwxeditor_fnine.exe Build: 2015-12-30 18:36:44 Debug / Console (32-bit) Compiled by Digital Mars D 2069
一通り動かしてみた感じ、特に問題なく動作しました。 (BASSが選ばれているか確認するためにコンソール付きの
.exe
ファイルで確認しました。)さすが、速い。
-
reporter ご確認ありがとうございます。
この手のバグは発見するのも原因を特定するのも修正するのも非常に困難なので、これを直せた(らしい)のは本当にラッキーでした。@Liar_cwさんのおかげです。ありがとうございました。
- Log in to comment
Build: 2015-12-29 17:04:11 Debug / Console (32-bit) Compiled by Digital Mars D 2069
.wex
の作成を許可。ImageRef.wex
を削除して全て「イメージ格納」に変えてみたところ、クラッシュしなくなりました。 ですが、再度カードのイメージパスを指定してやるとまたクラッシュするようになりました。 (シナリオ未保存、ImageRef.wex
未再作成)