トップページ > 過去ログ > 記事閲覧
DxLib_End 実行時のアクセス違反について
名前:いっち 日時: 2011/01/16 00:24

デバッガ上で実行しているプログラムを終了する際に、 たまに(毎回では無く)、大量のアクセス違反が発生することがあります。 問題なく終了した場合とアクセス違反が発生した場合の出力ウィンドウのログをアップロードしましたのでご覧下さい。 >://www1.axfc.net/uploader/Sc/so/194677.zip&key=dxlib 正常終了した場合のログでは137行目から以下のような出力があります。 > 4535:フォントの初期化は正常に終了しました > スレッド 'Win32 スレッド' (0x81c) はコード 0 (0x0) で終了しました。 > 'Test.exe': 'C:\WINDOWS\system32\d3d9.dll' をアンロード > 'Test.exe': 'C:\WINDOWS\system32\d3d8thk.dll' をアンロード > 4545:DirectInput 関連の終了処理... 完了 異常終了した場合のログの同じく137行目から以下のような出力があります。 > 2707:フォントの初期化は正常に終了しました > 'Test.exe': 'C:\WINDOWS\system32\d3d9.dll' をアンロード > 'Test.exe': 'C:\WINDOWS\system32\d3d8thk.dll' をアンロード > Test.exe の 0x4b76ba36 で初回の例外が発生しました: 0xC0000005: 場所 0x4b76ba36 を読み込み中にアクセス違反が発生しました。 そして、このアクセス違反のログは1093行目の以下の行まで続きます。 > スレッド 'Win32 スレッド' (0x1bc) はコード 0 (0x0) で終了しました。 正常終了の場合、「スレッドの終了−>DLLのアンロード」となっていますが、 異常終了の場合、「DLLのアンロード−>スレッドの終了」という流れになっており、 私はこれが原因でアクセス違反が起こっているのではないかと疑っています。 今回、DXライブラリのソースを含めたコードを作ったので確認してみましたが、 スレッドの終了のログは DxGraphics2.cpp の TerminateDirectX関数内で以下のコードを通過した際に(正常時は)出力されていました。 > // Direct3DDevice9 の解放 > if( GRH.Direct3DDevice9Object ) > { > /*コメント割愛*/ > GRH.Direct3DDevice9Object->Release() ; > GRH.Direct3DDevice9Object = NULL ; > GRH.BeginSceneFlag = FALSE ; > } DLLのアンロードのログは上記コードの数行後、以下のコードを通過した際に出力されていました。 > // d3d9.dll の解放 > if( GRH.Direct3D9DLL ) > { > FreeLibrary( GRH.Direct3D9DLL ) ; > GRH.Direct3D9DLL = NULL ; > } 他の方から事象の報告が無いことを考えると、通常では起こらないのだと思いますが、 こういったことが発生する原因について心当たりがございましたらご教授下さい。 ちなみにテストに使用したコードはスレッド SetChangeScreenModeGraphicsSys(no=2120) で使用した 以下のプロジェクトを0115版のライブラリとソースに更新したものです。 > ://www1.axfc.net/uploader/H/so/124642.zip&key=dxlib

Page: 1 |

Re: DxLib_End 実行時のアクセス違反について ( No.1 )
名前:管理人 日時:2011/01/23 23:06

不具合のご報告ありがとうございます 私の手元でアップしていただいたプロジェクトを使って試してみましたが、 何度試しても現象は再現しませんでした DLLのアンロードをするコードは全部で4箇所にあるので、もしかしたら TerminateDirectX 以外の関数内で先に解放されてしまっているのかもしれません DLLをアンロードする箇所で「Direct3D9 DLL の解放 4」というように アンロードしたことと、アンロードした箇所を記したログが出力されるようにしてみましたので、 よろしければこちらのソースで再度試してどのようにログが出力されるか教えていただけないでしょうか?m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe
Re: DxLib_End 実行時のアクセス違反について ( No.2 )
名前:いっち 日時:2011/01/24 22:18

> よろしければこちらのソースで再度試してどのようにログが出力されるか教えていただけないでしょうか?m(_ _)m テストしてみました。 結果としては「Direct3D9 DLL の解放 4」が出力されていました。 以下が、その際の出力ウィンドウの内容です。 > ://www1.axfc.net/uploader/Sc/so/197819.zip&key=dxlib よろしくお願いします。
Re: DxLib_End 実行時のアクセス違反について ( No.3 )
名前:いっち 日時:2011/01/27 20:56

追記です ご参考になるかわかりませんが、以下の関数の戻り値は正常時も事象発生時も 0 が返ってきていました。 > GRH.Direct3DDevice9Object->Release() ; また、通過したときに終了しているスレッドは、以下の部分を通過したときに作成されるスレッドのようでした。 DxGraphics2.cpp Line:3962 (CreateDirect3D9DeviceObject) > hr = GRH.Direct3D9Object->CreateDevice( > GRH.ValidAdapterNumber ? GRH.UseAdapterNumber : D_D3DADAPTER_DEFAULT, > D_D3DDEVTYPE_HAL, > GetMainWindowHandle(), > // D_D3DCREATE_MIXED_VERTEXPROCESSING/*D_D3DCREATE_HARDWARE_VERTEXPROCESSING*/ > ( GRH.VertexHardwareProcess ? D_D3DCREATE_MIXED_VERTEXPROCESSING : D_D3DCREATE_SOFTWARE_VERTEXPROCESSING ) > | ( WinData.UseFPUPreserve ? D_D3DCREATE_FPU_PRESERVE : 0 ) > | ( GRH.UseMultiThread ? D_D3DCREATE_MULTITHREADED : 0 ), > &param, > &GRH.Direct3DDevice9Object ) ; 現在テストに使用しているプロジェクトです。(DXライブラリからビルドするようにしているので少し大きいです) > ://www1.axfc.net/uploader/He/so/310515.zip&key=dxlib
Re: DxLib_End 実行時のアクセス違反について ( No.4 )
名前:管理人 日時:2011/02/05 23:20

ご情報ありがとうございます 「Direct3D9 DLL の解放 4」が出力される箇所で解放されているとなると、私の意図通りの正常な動作です・・・ アップしていただいたプロジェクトを実行してみたのですが、件の現象は発生しませんでした 15回ほど実行したのですが、どのくらいの割合で発生するのでしょうか? あと、Direct3D9 DLL 以外に Direct3DDevice9 の解放も関係しているので 原因がわかる可能性は低いですが Direct3DDevice9 の解放時にも 「Direct3D9Device の解放 2」 といったログを出力するようにしてみました 何度も申し訳ありませんが、よろしければこちらで再度お試しになってみていただけ無いでしょうか? m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe
Re: DxLib_End 実行時のアクセス違反について ( No.5 )
名前:いっち 日時:2011/02/06 20:04

> 何度も申し訳ありませんが、よろしければこちらで再度お試しになってみていただけ無いでしょうか? m(_ _;m テストしてみました。 結果としては正常時も異常時も「Direct3DDevice9 の解放 3」が出力されていました。 以下が、その際の出力ウィンドウの内容です。 > ://www1.axfc.net/uploader/Sc/so/202338.zip&key=dxlib > 15回ほど実行したのですが、どのくらいの割合で発生するのでしょうか? 発生するときはあっさり発生するのですが、発生しないときはなかなか発生しません・・・。 今回ログを取得する際も50回程試行して発生しないので以下のように若干ソースを改変しました。 > DXST_ERRORLOG_ADD( _T( "Direct3D9 DLL の解放 4\n" ) ) ; > FreeLibrary( GRH.Direct3D9DLL ) ; ↓↓↓↓ > FreeLibrary( GRH.Direct3D9DLL ) ; > DXST_ERRORLOG_ADD( _T( "Direct3D9 DLL の解放 4\n" ) ) ; よろしくお願いします。
Re: DxLib_End 実行時のアクセス違反について ( No.6 )
名前:管理人 日時:2011/02/13 19:01

お試しいただきありがとうございます 「Direct3DDevice9 の解放 3」が出力されていたとなりますと、解放される箇所は私の意図通りです 今回も70回ほど試してみましたが私の環境では再現しませんでした 何度もお試しいただいているので心苦しいのですが、この件はとりあえず保留としたいと思います 貴重なお時間を使っていただいたのに解決せずで申し訳ありません 保留にする理由は ・原因特定には現象が再現できる環境でも何十回とテスト実行をしなければならないと予想できますが、  まず現象が再現できないので原因特定が困難 ・発生タイミングが終了時なので仮に発生してもプレイヤーの不利益になり難い の二つです 原因についてですが、DXライブラリのプログラムにあるのか、それとも他の何かにあるのかはわかりません Direct3DDevice の解放をしただけでエラーが発生しているので、グラフィックスデバイスのドライバや インストールされている DirectX の DLL に原因がある可能性もありますし、 DXライブラリのプログラムにある場合はDXライブラリ内での Direct3D API 呼び出しのどれかが 原因となっている可能性があります DirectX SDK をインストールすると付いてくる Debug版のDirectXランタイムライブラリを使用するように設定すると Direct3D の些細なエラーや警告レベルの処理でもログに出力されるのですが、それにも何も出力されないので、 原因は結構根深いところにあるのかもしれません
Re: DxLib_End 実行時のアクセス違反について ( No.7 )
名前:いっち 日時:2011/02/14 20:41

> 何度もお試しいただいているので心苦しいのですが、この件はとりあえず保留としたいと思います > 貴重なお時間を使っていただいたのに解決せずで申し訳ありません 了解しました。こちらこそご尽力頂き感謝しております。 私としてはとりあえず「DXライブラリ内で要因として思い当たる点の有無」をお聞きしたかったので満足しております。 今後はDirectXやドライバ周りを見直してみたいと思います。 現在は、DirectXのrun-timeをインストールしなおして、様子を見ています(軽くテストしただけですが事象は発生していません)。 また、何か進展があればご報告させていただきます。 ありがとうございました。
Re: DxLib_End 実行時のアクセス違反について ( No.8 )
名前:いっち 日時:2011/03/28 22:49

一月ほど様子を見ましたが、再発していません。 (ただ、まちがえてOSのパッチもあててしまったので原因がDirectXにあったのか確信はありません) 大変お騒がせして申し訳ありませんでした。 これで解決とさせて頂きます。

Page: 1 |