トップページ > 記事閲覧
特定の文字列処理を実行するとDxLib_End()でアクセス違反が発生する
名前:SmokingWOLF 日時: 2023/01/11 12:36

いつもDXライブラリに大変お世話になっております。 SetFontCacheCharNum、CreateFontToHandle、DrawStringToHandle、DeleteFontToHandleで 下記<再現ソース>の手順をおこなった際、 DxLib_End()内でアクセス違反が発生する現象を確認いたしました。 使用させていただいたDXライブラリはバージョン「3.24a」(1/11にダウンロードした版)です。 再現ソースを使用してこちらの環境で発生した状況は以下の通りです。 ●VisualStudio Community 2022でコンパイルし、  Debug、Release版どちらでもアクセス違反が発生しました。 ●指定した文字列自体は、画面外に出ている文字を除いて期待通り表示されているようでした。 ●Visual Studioの「出力」によると、Log.txtにおける「d3d11.dll の解放 1」の直後に  アクセス違反の例外が発生しているようでした。 ●Visual Studioからではなく、エクスプローラ上などからRelease版で出力されたEXEを  直接実行した場合は何もエラーが出ずに終了します。  しかし、そのEXEを削除しようとすると  「使用中のファイル 〜.exeによってファイルは開かれているため、操作を完了できません」  と出て削除できない状態になります。 環境依存や、使い方が悪いことによる問題かもしれませんが、 よければ一度ご確認いただけますと幸いです。 <こちらの環境のLog.txt> ttps://silversecond.net/tmp/20230111_DxLibReport_Log.txt <再現ソース> #include "DxLib.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); // ウィンドウモードに if (DxLib_Init() == -1) { return -1; } // DXライブラリ初期化処理 SetFontCacheCharNum(200);//フォントキャッシュ文字数を200に // いろいろな大きさのフォントハンドルを生成 int FontHandle = CreateFontToHandle("Meiryo", 150, 1, DX_FONTTYPE_ANTIALIASING_8X8, DX_CHARSET_SHFTJIS, 0); int FontHandle2 = CreateFontToHandle("Meiryo", 28, 1, DX_FONTTYPE_ANTIALIASING_8X8, DX_CHARSET_SHFTJIS, 0); int FontHandle3 = CreateFontToHandle("Meiryo", 20, 1, DX_FONTTYPE_ANTIALIASING_8X8, DX_CHARSET_SHFTJIS, 0); int FontHandle4 = CreateFontToHandle("Meiryo", 34, 1, DX_FONTTYPE_ANTIALIASING_8X8, DX_CHARSET_SHFTJIS, 0); int FontHandle5 = CreateFontToHandle("Meiryo", 22, 1, DX_FONTTYPE_ANTIALIASING_8X8, DX_CHARSET_SHFTJIS, 0); int FontHandle6 = CreateFontToHandle("Meiryo", 26, 1, DX_FONTTYPE_ANTIALIASING_8X8, DX_CHARSET_SHFTJIS, 0); int FontHandle7 = CreateFontToHandle("Meiryo", 64, 1, DX_FONTTYPE_ANTIALIASING_8X8, DX_CHARSET_SHFTJIS, 0); // 文字を表示。指定回数の画面更新後に自動で終了します for (int i = 0; i < 500; i++) { // ←ここの500を「100」など小さい値にすると、終了時のアクセス違反が発生しなくなります DrawStringToHandle(10, 10, "1ABCDEFGHIJKLMNOPQRSTUVWXXYZあいうえお", GetColor(255, 255, 255), FontHandle); DrawStringToHandle(10, 160, "2ABCDEFGHIJKLMNOPQRSTUVWXXYZあいうえお", GetColor(255, 255, 255), FontHandle2); DrawStringToHandle(10, 180, "3ABCDEFGHIJKLMNOPQRSTUVWXXYZあいうえお", GetColor(255, 255, 255), FontHandle3); DrawStringToHandle(10, 200, "4ABCDEFGHIJKLMNOPQRSTUVWXXYZあいうえお", GetColor(255, 255, 255), FontHandle4); DrawStringToHandle(10, 220, "5ABCDEFGHIJKLMNOPQRSTUVWXXYZあいうえお", GetColor(255, 255, 255), FontHandle5); DrawStringToHandle(10, 240, "6ABCDEFGHIJKLMNOPQRSTUVWXXYZあいうえお", GetColor(255, 255, 255), FontHandle6); DrawStringToHandle(10, 260, "7ABCDEFGHIJKLMNOPQRSTUVWXXYZあいうえお", GetColor(255, 255, 255), FontHandle7); DrawStringToHandle(10, 400, "自動で終了します、お待ち下さい", GetColor(255, 255, 255), FontHandle2); DxLib::ScreenFlip(); } // フォント解放 DeleteFontToHandle(FontHandle); DeleteFontToHandle(FontHandle2); DeleteFontToHandle(FontHandle3); DeleteFontToHandle(FontHandle4); DeleteFontToHandle(FontHandle5); DeleteFontToHandle(FontHandle6); DeleteFontToHandle(FontHandle7); DxLib_End(); return 0; // ソフトの終了 }
メンテ

Page: 1 |

Re: 特定の文字列処理を実行するとDxLib_End()でアクセス違反が発生する ( No.1 )
名前:管理人 日時:2023/01/12 00:28

ご報告ありがとうございます 早速試してみたのですが、私の手元の環境では載せていただいたプログラムと手順では例外は発生しませんでした ( Debug、Release、x86、x64 全てで試しましたが、何れも発生しませんでした ) d3d11.dll の解放1 の直後となりますと NVidia のドライバが原因で例外が発生している 可能性がありますので、よろしければ NVidia のドライバを安定版 or 最新版に更新してみてください m(_ _)m
メンテ
Re: 特定の文字列処理を実行するとDxLib_End()でアクセス違反が発生する ( No.2 )
名前:SmokingWOLF 日時:2023/01/12 15:32

早々のご確認ありがとうございます! さっそくNVidiaのドライバを最新版にしてPC再起動後に試してみましたが、 残念ながらアクセス違反が発生する現象は解消されませんでした。 (念のため、更新後のドライバはNVIDIA Geforce RTX 3060 Laptop GPUに対しての  バージョン31.0.15.2802 の 2022/12/22版になっていました) 管理人様の環境で再現されないとのことですので、お役に立つかはともかく情報を列挙させていただきます。 まず前述の<再現ソース>について、こちらの環境において追加で以下のことが分かりましたのでご報告いたします。 1.「SetFontCacheCharNum」で現象が発生する値は「82」以上。  → この再現ソースで「SetFontCacheCharNum」の数値を「81」に減らすと、    こちらの環境で全く現象が起きなくなることが分かりました。    すぐ下で述べている「500」の部分を「5000」などに増やしても問題は起きません。  → 「SetFontCacheCharNum」を「82」以上にすると、下記2のループ数「500」や「155」の状態で現象が再現します。 2.「for (int i = 0; i < 500; i++) {」のループ数「500」の部分は「150以上」で現象が起き始める。  → これはソースにも書いてありますが、このループ数「500」の数値を色々変えてみたところ、    Debug版でSetFontCacheCharNum(82)やSetFontCacheCharNum(200)で実行時、    ループ数145回にすると起きなくなり、    ループ数148〜153回あたりの値にすると問題が起きたり起きなかったりするようです。    ループ数155以上だと今のところ確実に再現します。  → SetFontCacheCharNumが「82以上」でさえあれば、SetFontCacheCharNumがどの値であっても(例えば500などでも)    問題発生までの必要ループ数は「約150回」でほぼ同じようです。 3.「SetUse3DFlag(false);」を「DxLib_Init()」前に追加すると現象が起きなくなる。  → x64、x86、Relase、Debug全ての組み合わせで問題が起きなくなったので、    ご推察のとおり、グラフィックデバイスに関連する問題のようです。 --- また、x64で検証するという観点が漏れていましたのでそちらでも試してみたところ、 x64の方では「サウンド関連の終了処理...」と表示される直後に最初のアクセス違反が発生するようでした。 x64のEXEも、エクスプローラからの直接実行後にEXEがファイルアクセス不能になる現象は同じでした。 必要なときのご確認用として、こちらでアクセス違反が発生した際の、 Visual Studioのx86とx64でのDebug版での「出力」内容を以下にアップロードさせていただきました。 (最後の「コード 0 (0x0) で終了しました。」は、アクセス違反が続くようになった時点で  VisualStudioの側でデバッグを手動停止したことによるものです。) x86時の「出力」内容 ttps://silversecond.net/tmp/20230112_DxLib_report_x86_debug_output.txt x64時の「出力」内容 ttps://silversecond.net/tmp/20230112_DxLib_report_x64_debug_output.txt --- 私はゲーム開発ツールのゲーム部分にDXライブラリを使わせていただいているのですが、 一部のユーザの方からも、本件が原因かは確定していませんが 「ゲーム実行後にEXEファイルが削除・上書きできなくなる」というご報告をいただいております。 このサンプルプログラムを使って、もし問題が起きる環境と起きない環境の差が分かりましたら、 またご報告させていただきます。 このたびは貴重なお時間を取っていただき、誠にありがとうございました。
メンテ
Re: 特定の文字列処理を実行するとDxLib_End()でアクセス違反が発生する ( No.3 )
名前:管理人 日時:2023/01/13 00:08

ご情報ありがとうございます ちょっとご質問なのですが、デバッグ実行時に本件のアクセス違反が発生した際には Visual Studio でブレークするのでしょうか? もしそうでしたら、よろしければこちらのDXライブラリのソースをビルドして実行する プロジェクトを使用して載せていただいた再現ソースを実行していただき、 アクセス違反でブレークした際のDXライブラリのソースファイル名と行番号を教えていただけないでしょうか? m(_ _)m https://dxlib.xsrv.jp/temp/DxLibSourceTest_WithUseCLib.zip 本件の現象を解消できるかはわかりませんが、現状よりは詳しい情報を得ることが出来ると思いますので…
メンテ
Re: 特定の文字列処理を実行するとDxLib_End()でアクセス違反が発生する ( No.4 )
名前:SmokingWOLF 日時:2023/01/13 13:00

ソリューションファイルまで作ってくださってありがとうございます! Visual Studioでブレークしているので早速試させていただいたところ、 問題が起きる箇所はDXライブラリ内にはなかったようで、ソース内からは何も検出されませんでした。 (後述の情報より、DxLib_End()内から呼び出される別のDLL内の処理で問題が起きている?気がします) 追加で、以下の情報が判明しました。 ・Visual Studio上でスレッドを表示しておくと例外スロー時の場所が分かると教えてもらったので表示してみたところ、  「nvwgf2um.dll スレッド」内で問題が起きていることが分かりました。  この点を先にご報告できなくて申し訳ございません。 ・数値を変えながらデバッグしたとき、ごくまれですが以下の場所でエラーが検出される場合がありました。  上記の点と合致する内容です。  (95%以上は、関数も何も表示されない逆アセンブリ状態でブレークされます) 【呼び出し履歴】  d3d11.dll!CallAndLogImpl<long (__stdcall*)(_D3DKMT_DESTROYALLOCATION2 const *),_D3DKMT_DESTROYALLOCATION2 *>()  d3d11.dll!NDXGI::CDevice::Deallocate2CB()  nvwgf2um.dll!529c9b72() →画像: ttps://silversecond.net/tmp/20230113_DxLib_report.png ・DXライブラリのバージョンを変えてそのたびにクリーン→リビルドして実験してみたところ、  3.17aまでさかのぼってみた限りにおいて、その全てで同様の現象が発生しました。  つまりその間の修正によって発生した問題ではなさそうに思います。 解決につながりそうな決定的な情報が全然なくて恐縮なのですが、ここまでの情報を見る限り 環境やドライバ側での問題の割合がますます強く疑われる状況だと感じます。 「nvwgf2um.dll」というキーワードで調べてみても同様の感想です。 一方で環境依存というのが分かりましたので、その点は影響範囲が限定されそうでほっとしております。 ひとまずは、環境によってゲーム後にEXEにファイルアクセスできなくなる問題があることは周知しつつ、 集められる範囲で情報収集しつつ、現時点ではドライバ側での問題の解決を待とうと考えております。 大変お騒がせして申し訳ございませんでした。 そして、あいまいな情報に対しても親切な対応をしてくださって誠にありがとうございました。
メンテ
Re: 特定の文字列処理を実行するとDxLib_End()でアクセス違反が発生する ( No.5 )
名前:管理人 日時:2023/01/13 23:45

ご情報ありがとうございます NVidia 関係の dll内で発生していましたか… DXライブラリはデフォルトでは Direct3D 11 を使用するのですが、 Direct3D 9 を使用すれば本件の現象が発生しないかもしれませんので よろしければ DxLib_Init の呼び出し前に SetUseDirect3DVersion( DX_DIRECT3D_9EX ) ; という記述を追加した上での実行を試してみていただけないでしょうか? m(_ _)m ( 上記の記述を追加すると、強制的に Direct3D 9 を使用することができます )
メンテ
Re: 特定の文字列処理を実行するとDxLib_End()でアクセス違反が発生する ( No.6 )
名前:SmokingWOLF(解決済) 日時:2023/01/14 00:32

情報ありがとうございます! おっしゃるとおり、SetUseDirect3DVersion( DX_DIRECT3D_9EX ) ;を追加すると 本件の現象が発生しなくなることを確認いたしました。 こちらはコンフィグでDirectXの11と9を選べるようにしているのですが、 情報収集した上で本件の影響範囲がかなり大きいようでしたら、 しばらくDirectXの9をデフォルトとすることで対応させていただこうと思います。 対処可能な手段を教えていただき、誠にありがとうございました!
メンテ
Re: 特定の文字列処理を実行するとDxLib_End()でアクセス違反が発生する ( No.7 )
名前:管理人(解決済) 日時:2023/01/14 02:21

Direct3D 9 では問題なく動作したとのことで何よりです 少し話しは逸れますが私は最近 ASTLIBRA というフリーソフトの Steam対応の作業に 携わったのですが、リリース後の不具合報告やその対応から分かったのは グラフィックについては Direct3D 9 サウンドについては XAudio が現状では最も多くの環境で安定して動作する、ということでした それぞれ DxLib_Init の前に SetUseDirect3DVersion( DX_DIRECT3D_9EX ) ; SetEnableXAudioFlag( TRUE ) ; を記述することでその設定にすることが出来ます 因みにDXライブラリはデフォルトではサウンドAPIとして比較的新しく低レイテンシの WASAPI ( Windows Audio Session API ) を使用するのですが、どうも環境によっては 『オーディオ出力の設定に関係なく特定のオーディオデバイスから音が出力される』 『PCのビデオ出力を HDMI でTVに接続して、オーディオ出力も HDMI の接続先のTVに 設定しているのに PC に接続された別のオーディオデバイスから音が出力される』 といった現象が発生するようで( 問題の無い環境では WASAPI でも設定通りの デバイスから出力されるのですが、一部の環境ではこのような現象が発生する模様 )、 そのような環境でも XAudio や Direct Sound 等の WASAPI 以外のサウンドAPIであれば 問題なく設定通りのデバイスから出力されるようです なので、最初は ASTLIBRA Revision ( ASTLIBRA の Steam版 )のデフォルト設定は Direct3D 11, WASAPI だったのですが、後からデフォルト設定を Direct3D 9, XAudio に 変更しました( その変更を行った後は『起動しない』『起動しても画面が真っ暗』 『音の出力先がおかしい』などのバグ報告が激減しました ) ”何のAPIが一番安定動作するか”は時間の経過とともに変化すると思いますが、現時点では このようになっていますということで、よろしければ参考にしてください m(_ _)m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存