トップページ > 記事閲覧
32bitDebugで、特定のPNGファイルを2回目のLoadGraphで読み込むと、ハンドルされない例外が発生する場合
名前:レイ 日時: 2022/07/15 15:59

ある特定のPNGファイルをLoadGraphで読み込む際に、他の処理を挟んで同じファイルを2回読み込むとLoadGraphの所で「ハンドルされない例外」が出てプログラムが停止してしまいます。 コードは以下のような感じです。 int a_handle; a_handle = LoadGraph( "PNGファイルaのパス" ); ...色々な処理 DeleteGraph( a_handle ); ...色々な処理(他の画像ファイルの読み込み等を含む) a_handle = LoadGraph( "PNGファイルaのパス" ); ←ハンドルされない例外で停止 以下のコードも試してみたのですが、こちらは特に問題は発生しませんでした。 a_handle = LoadGraph( "PNGファイルaのパス" ); DeleteGraph( a_handle ); a_handle = LoadGraph( "PNGファイルaのパス" ); ←問題なし DeleteGraph( a_handle ); 2回連続LoadGraph以外にも、間に挟んでいる処理の内容によっては停止されたり停止されなかったりしました。 また、このファイルを別のPNGファイルに置き換えたり、画像加工ツールで中身を描き替えたりするとこちらも停止されたり停止されなかったりします。 さらに、この例外での停止はVisual c++ 2019の32bitのDebugモードの時だけ発生し、64bitのDebugや、32bitのReleaseモードでは発生しませんでした なのでまとめると、特定のPNGファイルが1度LoadGraphされた後に、他のなんらかの処理を挟んで再びLoadGraphをすると、32bitのDebugモードの時だけ画像ファイルの中身によって停止されてしまう、ということです。 すごいピンポイントな状況での問題であり、Releaseでは今のところ発生していないので致命的な問題という認識なのですが、一応報告しました。 以下は停止した時のログです。 0:ChangeWindowMode実行 0:ウインドウモードフラグが立てられました 15:ディスプレイ情報のセットアップ開始 15: モニターの数:1 ディスプレイデバイスの数:7 15: No.0 モニター名:\\.\DISPLAY1 1920x1080 32bit 59Hz 46:ディスプレイ情報のセットアップ完了 78:DXライブラリの初期化処理開始 93: システムの情報を出力します 93: DXライブラリ Ver3.23c 93: 論理プロセッサの数 : 4 93: OS Windows11 ( Build 22000 ) 97: COMの初期化... 成功 100: 非同期読み込み処理の初期化...成功 101: ファイルアクセス処理の初期化...成功 102: メモリ総量:8028.05MB 空きメモリ領域:899.07MB 105: タイマーの精度を検査します 105: 精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 106: パフォーマンスカウンターを使用します タイマー精度 : 10000.000000 KHz 106: ソフトの二重起動検査... 二重起動はされていませんでした 114: ウインドウクラスを登録します... 登録に成功しました 116: ウインドウモード起動用のウインドウを作成します 120: ウインドウの作成に成功しました 121: ウインドウを表示します 250: IMEを無効にしました 254: ウインドウスタイルをウインドウモード用に変更します... 完了 295: DirectInput関係初期化処理 296: XInput DLL の読み込み中... 成功 303: DirectInput8 の取得を試みます...成功 322: 引き続き初期化処理... 初期化成功 351: ジョイパッドの初期化... 352: XInput 対応コントローラーのチェックを開始します 353: XInput 対応コントローラー No.0 をチェック 354: XInput 対応コントローラー No.0 の接続は確認できませんでした 355: XInput 対応コントローラー No.1 をチェック 356: XInput 対応コントローラー No.1 の接続は確認できませんでした 356: XInput 対応コントローラー No.2 をチェック 357: XInput 対応コントローラー No.2 の接続は確認できませんでした 358: XInput 対応コントローラー No.3 をチェック 358: XInput 対応コントローラー No.3 の接続は確認できませんでした 359: XInput 対応コントローラーのチェック完了 359: DirectInput 対応ジョイパッドの列挙を開始します 376: DirectInput 対応入力装置を検出しました 382: Device Product GUID : 05c4054c,0000,0000,00,00,50,49,44,56,49,44 382: Device Instance GUID : 260af480,7484,11ec,80,01,44,45,53,54,00,00 383: DirectInputDevice8 の作成... 成功 387: DirectInputDevice の情報を取得します... 成功 389: Device Product Name : Wireless Controller 390: Device Instance Name : Wireless Controller 391: 検出した DirectInput 対応入力装置が Xbox360コントローラーか確認... 不一致 393: 検出した DirectInput 対応入力装置が XboxOneコントローラーか確認... 不一致 395: 検出した DirectInput 対応入力装置が XInput 対応コントローラーか確認... 不一致 942: DirectInputDevice のデータ形式に JOYSTICK 形式を設定... 成功 943: DirectInputDevice の協調レベルに DISCL_FOREGROUND | DISCL_EXCLUSIVE を設定... 成功 944: DirectInputDevice から取得する X軸 の値の範囲を設定... 成功 945: DirectInputDevice から取得する Y軸 の値の範囲を設定... 成功 947: DirectInputDevice から取得する Z軸 の値の範囲を設定... 成功 949: DirectInputDevice から取得する Rx軸 の値の範囲を設定... 成功 950: DirectInputDevice から取得する Ry軸 の値の範囲を設定... 成功 951: DirectInputDevice から取得する Rz軸 の値の範囲を設定... 成功 952: DirectInputDevice のボタンの数を取得... 成功 ボタンの数は 14 個です 953: DirectInputDevice の X軸 のデッドゾーンを設定... 成功 954: DirectInputDevice の Y軸 のデッドゾーンを設定... 成功 956: DirectInputDevice の Z軸 のデッドゾーンを設定... 成功 956: DirectInputDevice の Rx軸 のデッドゾーンを設定... 成功 957: DirectInputDevice の Ry軸 のデッドゾーンを設定... 成功 958: DirectInputDevice の Rz軸 のデッドゾーンを設定... 成功 959: DirectInputDevice の DirectInputEffect No.0 を作成... 失敗 Error Code :0x80004001 959: DirectInputDevice の DirectInputEffect No.1 を作成... 失敗 Error Code :0x80004001 960: DirectInputDevice の通知処理用の Event を作成... 成功 961: DirectInputDevice の通知処理用の Event を DirectInputDevice に設定... 成功 961: DirectInputDevice のアクセス権を取得... 成功 965: 検出した DirectInput 対応入力装置を入力ナンバー 0 で登録します 965: 検出した DirectInput 対応入力装置の初期化は正常に終了しました 965: DirectInput 対応ジョイパッドの列挙終了 965: ジョイパッドの初期化は正常に終了しました 966: マウスデバイスの初期化... 初期化成功 966: キーボードデバイスの初期化... 初期化成功 967: DirectInput 関連の初期化は正常に終了しました 1006: WASAPI の初期化を行います 1021: デバイス名 : ヘッドフォン (Realtek(R) Audio) 1027: デフォルト遅延時間 : 10.000 ms 1028: 最小遅延時間 : 3.000 ms 1028: 遅延時間 : 10.000 ms 1033: チャンネル数   : 2 ch 1033: 量子化ビット深度 : 32 bit 1034: 有効ビット深度  : 32 bit 1034: サンプリングレート : 48000 Hz 1034: データ形式 : 浮動小数点型 1284: 動作モード : 共有モード 1285: WASAPI の初期化は正常に終了しました 1468: d3d11.dll の読み込み.... 成功 1478: dxgi.dll の読み込み.... 成功 1481: API CreateDXGIFactory2 のアドレスを取得します.... 成功 1482: IDXGIFactory2 を作成します.... 成功 1491: IDXGIAdapter を列挙 1491: Adapter No.0 Desc:NVIDIA Quadro P400 1492: Output Device No.0 Name:\\.\DISPLAY1 1493: Adapter No.1 Desc:Intel(R) UHD Graphics 630 1494: Adapter No.2 Desc:Microsoft Basic Render Driver 1494: API D3D11CreateDevice のアドレスを取得します.... 成功 1495: IDXGIAdapter を取得します.... 成功 1496: Direct3D 11 FeatureLevel 11_0 以上を対象とします 1496: ID3D11Device オブジェクトを取得します.... 成功 1609: IDXGIDevice1 を取得します.... 成功 1610: IDXGIDevice1->SetMaximunFrameLatency( 1 ); を実行しました 1610: [ウインドウモード 1920x1080] 1610: IDXGISwapChain2 を作成します.... 成功 1612: IDXGIFactory2->CreateSwapChainForHwnd の戻り値:0x00000000 1613: IDXGIOutput を取得します.... 成功 1615: Graphics Device:NVIDIA Quadro P400 1616: 画面のフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 1616: 16bit Zバッファフォーマットは DXGI_FORMAT_D16_UNORM です 1617: 24bit Zバッファフォーマットは DXGI_FORMAT_D24_UNORM_S8_UINT です 1618: 32bit Zバッファフォーマットは DXGI_FORMAT_D32_FLOAT です 1618: 16bit カラーフォーマットは DXGI_FORMAT_B5G6R5_UNORM です 1619: 32bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です 1619: アルファ付き 16bit カラーフォーマットは DXGI_FORMAT_B4G4R4A4_UNORM です 1620: アルファ付き 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 1620: アルファテスト用 16bit カラーフォーマットは DXGI_FORMAT_B5G5R5A1_UNORM です 1620: アルファテスト用 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 1620: DXT1テクスチャフォーマットは DXGI_FORMAT_BC1_UNORM です 1621: DXT2テクスチャフォーマットは使えません 1621: DXT3テクスチャフォーマットは DXGI_FORMAT_BC2_UNORM です 1621: DXT4テクスチャフォーマットは使えません 1621: DXT5テクスチャフォーマットは DXGI_FORMAT_BC3_UNORM です 1622: BC7_UNORM テクスチャフォーマットは DXGI_FORMAT_BC7_UNORM です 1622: BC7_UNORM_SRGB テクスチャフォーマットは DXGI_FORMAT_BC7_UNORM_SRGB です 1622: ABGR 整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_UNORM です 1622: ABGR 浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_FLOAT です 1623: ABGR 浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32B32A32_FLOAT です 1623: 1チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8_UNORM です 1623: 1チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_UNORM です 1624: 1チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_FLOAT です 1624: 1チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32_FLOAT です 1624: 2チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8G8_UNORM です 1624: 2チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_UNORM です 1625: 2チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_FLOAT です 1625: 2チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32_FLOAT です 1625: 描画用 16bit カラーフォーマットは DXGI_FORMAT_B5G6R5_UNORM です 1625: 描画用 32bit カラーフォーマットは DXGI_FORMAT_B8G8R8X8_UNORM です 1626: 描画用アルファ付き 32bit カラーフォーマットは DXGI_FORMAT_R8G8B8A8_UNORM です 1626: 描画用 ABGR 整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_UNORM です 1626: 描画用 ABGR 浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16B16A16_FLOAT です 1627: 描画用 ABGR 浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32B32A32_FLOAT です 1627: 描画用1チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8_UNORM です 1627: 描画用1チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_UNORM です 1627: 描画用1チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16_FLOAT です 1627: 描画用1チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32_FLOAT です 1628: 描画用2チャンネル整数 8 ビット型カラーフォーマットは DXGI_FORMAT_R8G8_UNORM です 1628: 描画用2チャンネル整数 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_UNORM です 1628: 描画用2チャンネル浮動小数点 16 ビット型カラーフォーマットは DXGI_FORMAT_R16G16_FLOAT です 1628: 描画用2チャンネル浮動小数点 32 ビット型カラーフォーマットは DXGI_FORMAT_R32G32_FLOAT です 1628: 使用する機能レベル:D3D_FEATURE_LEVEL_11_1 1629: 同時にレンダリングできるバッファの数:8 1629: 最大テクスチャサイズ 幅:16384 高さ:16384 1629: 標準描画用の頂点バッファの作成.... 成功 1630: シェーダーコード関係の初期化.... 成功 1721: 各種シェーダー用定数バッファの作成.... 成功 1724: 各種 ID3D11InputLayout の作成.... 成功 1751: 画像の単純転送処理の初期化... 成功 1753: 深度バッファを作成します.... 成功 1804: フォントの初期化を行います 1809: フォントの初期化は正常に終了しました 1890: 文字コードバッファの初期化を行います... 完了しました 1977:DXライブラリの初期化処理終了 また、停止した時の呼び出し履歴も張っておきます。 一番上が直近です。 LoadPngImage_Fast(struct DxLib::tagSTREAMDATA *,struct DxLib::tagBASEIMAGE *,int) C++ DxLib::CreateGraphImageType2_UseGParam(struct DxLib::CREATEBASEIMAGETYPE2_GPARAM *,struct DxLib::tagSTREAMDATA *,struct DxLib::tagBASEIMAGE *) C++ DxLib::CreateGraphImageOrDIBGraph_UseGParam(struct DxLib::LOADBASEIMAGE_GPARAM *,wchar_t const *,void const *,int,int,int,int,int,struct DxLib::tagBASEIMAGE *,struct tagBITMAPINFO * *,void * *) C++ DxLib::CreateGraphImage_plus_Alpha_UseGParam(struct DxLib::LOADBASEIMAGE_GPARAM *,wchar_t const *,void const *,int,int,void const *,int,int,struct DxLib::tagBASEIMAGE *,struct DxLib::tagBASEIMAGE *,int,int) C++ DxLib::Graphics_Image_CreateGraphFromMem_UseGParam(struct DxLib::LOADGRAPH_GPARAM *,int,int,void const *,int,void const *,int,int,int,int) C++ DxLib::Graphics_Image_CreateGraphFromMem_UseGParam(struct DxLib::LOADGRAPH_GPARAM *,int,int,void const *,int,void const *,int,int,int,int) C++ DxLib::Graphics_Image_CreateGraph_UseGParam(struct DxLib::LOADGRAPH_PARAM *,int,int) C++ DxLib::LoadBmpToGraph_WCHAR_T(wchar_t const *,int,int,int) C++ DxLib::LoadBmpToGraph(char const *,int,int,int) C++ DxLib::LoadGraph(char const *,int) C++
メンテ

Page: 1 |

Re: 32bitDebugで、特定のPNGファイルを2回目のLoadGraphで読み込むと、ハンドルされない例外が発生する場合 ( No.1 )
名前:管理人 日時:2022/07/16 02:18

すみません、載せていただいた呼び出し履歴にある LoadPngImage_Fast は最近追加した高速に pngファイルを読み込む関数なのですが、 何かバグがあるのかもしれません( コードを確認した限りではバグとなりそうな箇所は見つからなかったのですが…多分あると思います ) 手元の pngファイルを 200個程読み込むテストをしてみたのですが、特に問題は発生しませんでした もし特定の pngファイルのみ本件のエラーが発生してしまうとのことでしたら、原因を調べてみたいと思いますので お手数で申し訳ありませんがエラーが発生してしまう pngファイルをこちらのメールアドレス宛にお送り頂けないでしょうか m(_ _;m BQE00322(あっとまーく)nifty.com ( (あっとまーく)を@に置き換えてください )
メンテ
Re: 32bitDebugで、特定のPNGファイルを2回目のLoadGraphで読み込むと、ハンドルされない例外が発生する場合 ( No.2 )
名前:管理人 日時:2022/07/16 16:41

すみません、LoadPngImage_Fast にメモリの不正なアクセスが発生する可能性のある箇所がありました これがレイさんの環境で発生したエラーと同じものかは不明ですが、よろしければこちらの修正版をお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: 32bitDebugで、特定のPNGファイルを2回目のLoadGraphで読み込むと、ハンドルされない例外が発生する場合 ( No.3 )
名前:レイ(解決済み) 日時:2022/07/17 17:00

修正版で実行したところ、エラーが発生していた状況でエラーが発生しない事を確認しました。 お忙しい中、対応ありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存