バグ: 素材選択ビューのファイルリスト遅延読込でクラッシュ

Issue #85 resolved
k4nagatsuki repo owner created an issue

Issue 80のコメントより継続している問題です。

32bit環境でファイルリストの遅延読込を行うと環境によって高頻度でクラッシュするとの事です。64bit版でも稀に発生する可能性があります。

エラーログは出力されません。私が確認した類似の現象では、Windowsログには0xc0000005(NULLポインタアクセス)が記録されていました。おそらくライブラリや処理系の内部で発生したものでしょう。

Dの匿名クラスの処理に問題がある可能性があるので、匿名クラスを使わないようにしたテスト版を作ってみました。これで問題が再現しないか試していただけるとありがたいです。

Comments (37)

  1. Liar_cw NA

    Build: 2015-12-29 17:04:11 Debug / Console (32-bit) Compiled by Digital Mars D 2069

    • シナリオデータは「クラシック形式」。未圧縮。
    • 各種.wexの作成を許可。

    ImageRef.wexを削除して全て「イメージ格納」に変えてみたところ、クラッシュしなくなりました。 ですが、再度カードのイメージパスを指定してやるとまたクラッシュするようになりました。 (シナリオ未保存、ImageRef.wex未再作成)

  2. Liar_cw NA

    テスト版でもやはりクラッシュしたので、 「もしかしてシナリオデータそのものが悪いんじゃないか?」と思い、 試しに交易都市リューンのデータを開いてみると問題なく覗くことができました。

    違いは何かと考えてみたところ、ImageRef.wexでした。 「イメージ格納」に変わった間だけクラッシュしなくなったので、素人考えですが、どうにもファイル参照周りが怪しく思えます。

  3. k4nagatsuki reporter

    ありがとうございます。たしかにそのようです。

    おそらくですが、具体的には、(1)ダイアログを開く (2)ファイルリストを表示 (3)指定ファイルを選択状態にする、のプロセスのうち、(3)で問題が起きているのだと思います。データ自体の問題ではないはずです。

    私の方でも再現するようになりましたので、もう少し詳細に調べてみます。次のテスト版までしばらくお待ちください。

  4. Liar_cw NA
    cwxeditor_test_20151229c
    Build: 2015-12-29 19:27:05 Debug / Console (32-bit) Compiled by Digital Mars D 2069
    

    残念ながらクラッシュしてしまいました。

  5. k4nagatsuki reporter

    うーん、手強いです……。

    もうちょっと原因箇所を絞り込んでみます。お待ちください。

  6. Liar_cw NA
    cwxeditor_test_20151229d
    Build: 2015-12-29 22:44:01 Debug / Console (32-bit)
    Compiled by Digital Mars D 2069
    

    こちらでもクラッシュしなくなりました!

    思えば、キャストカードは規格外の画像サイズが使われることがあっても アイテムカード等では見た事がありませんね……。 74*94以外の画像サイズは使用していないため、盲点でした。

  7. k4nagatsuki reporter

    ありがとうございます。これで解決!と言いたいところですが、なんてこった、これはD言語の標準ライブラリ(具体的にはstd.stdio.File)のバグですね。それはそのうち修正されるのを期待するとして、今は他の使用箇所も回避策を取らないといけないです。

    ともあれありがとうございました。助かりました。修正をコミットしてテスト版を作るまで今しばらくお待ちください。

  8. k4nagatsuki reporter

    最新のテスト版を上げました。

    昨晩のテスト版で取った方法(ファイルの先頭だけちょっと読み込んでファイルサイズの判断に使う)ではどうしても上手く行かないファイル形式があるので、std.stdio.Fileの代替品を作ってそれを全面的に使う方法を採用したのですが、これでまた問題が再発しては意味が無いので、最後までお手数をおかけしますがお試しください(私の手許では発生しないようです)。

  9. Liar_cw NA
    cwxeditor_fnine_20151230
    Build: 2015-12-30 14:15:31 Debug (32-bit)
    Compiled by Digital Mars D 2069
    

    念のため、64bit版も含めた4つの.exe全てにテストを行いましたが問題なく動作しました。

    確認方法として、各種カード(アイテムカードなど)を素早く開いて閉じるを何度か繰り返しましたが、 クラッシュする気配はありませんでした。

  10. Liar_cw NA

    すみません、早速ですが訂正します。

    情報カードに.png形式の画像ファイルを割り当て保存した直後に 「cwxeditor_fnine.exeは動作を停止してました」とWindows側のエラーが出ました。

  11. k4nagatsuki reporter

    とりあえず問題無さそうですね。では、これで完了としてクローズさせていただきます。

    何度もテストにお付き合いいただき本当にありがとうございました。

  12. k4nagatsuki reporter

    エラーが発生したのは32bit版でよろしいでしょうか。再現性はどうでしょうか。

    また、圧縮された状態のシナリオか、あるいは展開済みのシナリオかも教えていただけないでしょうか。

  13. Liar_cw NA

    すみません、動作確認が甘かったようです。まさか保存の方で出るなんて。

    はい、32bit版で発生を確認しました。

    • 展開しているクラシック形式のシナリオ。
    • ImageRef.wexを削除してもしなくても発生。

    .pngではない可能性も考えて、画像なし本文なしの「あああ」や「242」などの名前だけの 情報カードを作って上書き保存を行ってみたところ、保存直後にそれなりに高い確率で発生しました。 まだ簡単に調査を行っただけですので、他の種類のカードでも発生するかもしれません。

    • 作成→上書き保存を数回繰り返して停止の通知が表れる。

    エラーログは出力されませんでした。

  14. k4nagatsuki reporter

    https://bitbucket.org/k4nagatsuki/cwxeditor/downloads/cwxeditor_test_20151230a.zip

    上のテスト版では標準ライブラリの問題箇所を使う部分を全て書き換えたのですが、一部保存に絡む所があります。それを元に戻してみました。お試しください。

    私のところでは今のところ再現しません。保存処理が問題だとすると、カードの作成も関係ないかもしれません。

  15. Liar_cw NA

    そういえば以前、システム音声の再生方式と拡張子の噛み合わせが悪い、という事がありましたので 試しにシステム音声のパスを削除して鳴らないようにしたら、ピタリと動作停止の通知が止みました……。

    原因はこれかもしれません……。

    • 指定していたファイルは.ogg形式。
    • 再生方式はBGM効果音ともに「自動選択」、音量100%.
  16. Liar_cw NA
    cwxeditor_test_20151230a
    Build: 2015-12-30 15:19:33 Debug / Console (32-bit)
    Compiled by Digital Mars D 2069
    

    あまりの衝撃にバージョン表記を忘れてしまいました。

  17. k4nagatsuki reporter

    そうなると音声再生のDLLでエラーが起きているのが確認できるかもしれません。次の手順でWindowsのアプリケーションログを確認していただけないでしょうか。

    1. スタートメニューなどの「コンピューター」を右クリックしてコンテキストメニューを出し、「管理」を選択
    2. システムツール→イベントビューアー→Windowsログ→アプリケーション を選択
    3. エラーのアイコンがついている行を選択し、「障害が発生しているアプリケーション名」がcwxeditor.exeになっているか確認
    4. 「障害が発生しているモジュール名」がbass.dllSDL_mixer.dllになっている場合は、音声DLLが原因
  18. k4nagatsuki reporter

    ログからは分からないっぽいですね。

    コンソールが出るバージョンの場合は、保存時に音が鳴る時、Initialize *** StartInitialize *** Endというメッセージが出ていると思うのですが、その***の部分が何になっているか押していただけないでしょうか。

  19. Liar_cw NA

    再度.ogg形式のシステム音声を指定して、 「自動選択」以外の「WinMM」や「SDL」に変更してみたところ、 動作停止する気配が収まりました。

    問題は.dllではなくこの「自動選択」にある気がしてきましたが、どうでしょうか?

  20. Liar_cw NA
    Initialize BASS Audio Start
    Initialize BASS Audio End
    

    コンソールに表示されたログは上記のとおりです。

  21. k4nagatsuki reporter

    自動選択では最終的にどれかの形式が選ばれるのですが、一つ手動で強制的に使うようにできない再生形式があります。1.50やCWPyで使われているBASS Audioです。この方式は、CWPyのスキンを使用している時や、クラシックエンジンの1.50を使っている時に限り、自動選択されて有効になります。出力を見る限り実際有効になっているようです(他にInitializeがなければですが)。

    実際に試してみたところ、私の環境でも時折落ちる事が確認できました。DLLのバグでなければ、使い方が悪いのかもしれません。実際、同じファイルを音声再生コンテントの編集ダイアログなどで流してみてもなぜか落ちません。何が悪いのか調べてみます。

  22. Liar_cw NA
    cwxeditor_test_20151230b
    Build: 2015-12-30 16:20:48 Debug / Console (32-bit)
    Compiled by Digital Mars D 2069
    

    こちらの環境では、何度か保存して鳴らした後に落ちてしまいました。

  23. Liar_cw NA
    cwxeditor_test_20151230c
    Build: 2015-12-30 16:38:17 Debug / Console (32-bit)
    Compiled by Digital Mars D 2069
    

    最低でも50回は保存時に鳴らしたと思いますが、 落ちなくなりました!

  24. k4nagatsuki reporter

    ありがとうございます。となると、どうやらD言語処理系のガーベジコレクション(GC)とBASSの相性が悪そうです(GCのある言語からC言語のライブラリを使うときはいつも鬼門になるものではあるのですが)。理論上は完全には直っていないはずですが、おそらくほとんど発生しなくはなったはずです。完全に発生しなくなるように調査は続けます(でもDのGCはバグ多いからなぁ……)。

    最新のテスト版をアップロードしました。これで問題が起きないようなら、今度こそ完了にさせていただきます。

  25. Liar_cw NA
    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の相性問題でバタバタとさせてしまいましたが、 こちらも一応の解決に至ってよかったです。

    ひとまずお疲れ様でした。

  26. k4nagatsuki reporter

    本当に長々とありがとうございました。

    現在、原因となっていた処理(GCの起動とBASS再生)を並べる事で高頻度で問題を再現する事に成功していますので、もしかすると完全に直す事も可能かもしれません。もし直せたら、ここでお知らせします。

  27. k4nagatsuki reporter

    GCが動いても問題を引き起こさないパターンを見つけて最新のテスト版に入れました。

    問題は完全に解消しているはずです。よろしければお試しください(ってこれで再発したら洒落にならんな)。

  28. Liar_cw NA
    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ファイルで確認しました。)

    さすが、速い。

  29. k4nagatsuki reporter

    ご確認ありがとうございます。

    この手のバグは発見するのも原因を特定するのも修正するのも非常に困難なので、これを直せた(らしい)のは本当にラッキーでした。@Liar_cwさんのおかげです。ありがとうございました。

  30. Log in to comment