トップページ > 記事閲覧
bus error の発生について
名前:sea 日時: 2017/03/20 19:26

初めまして、お世話になっております。 先日、DXライブラリのAndroid版をインストールさせていただき、色々試していたところ、 原因が分からないエラーが出てきたので、ご質問させていただきたく。 内容としては、実機でデバッグを行っていると「bus error」というエラーが発生してアプリが終了してしまう事象についてになります。 自分の方で分かった事としましては、非同期読込関連の以下の関数を実行している最中に発生しているらしい事まで確認しました。 稀に、ScreenFlip()等の関数の実行時にも発生しているようでした。 ・CheckHandleASyncLoad() ・GetASyncLoadNum() 更に補足しますと、上記の関数ですが、ループ構造にして最初の1回目の実行時には問題なく実行できているのですが、 2回目の実行時にbus errorが発生する挙動を起こしていました。 Wikipediaを見てみると、可能性は低いがハードウェアの故障も考えられるといった趣旨の事も記述されており、 DXライブラリのAndroid版利用者から同様の報告が見当たらないので、使用している実機端末を怪しんだ方がいいでしょうか。 以上になります、宜しくお願い致します。
メンテ

Page: 1 |

Re: bus error の発生について ( No.1 )
名前:管理人 日時:2017/03/20 22:53

DXライブラリAndroid版を使用していただきありがとうございます m(_ _)m 私の手元で以下のような検証用のコードを組んで実行してみたのですが、 bus error は発生しませんでした #include "DxLib.h" #define NUM 500 int android_main( void ) { int handle[ NUM ] ; int phase = 0 ; int loopcount = 0 ; int i ; // 背景色を灰色に SetBackgroundColor( 128,128,128 ) ; if( DxLib_Init() == -1)return -1; // 非同期読み込みON SetUseASyncLoadFlag( TRUE ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; while( ProcessMessage() == 0 ) { // 画面を初期化 ClearDrawScreen() ; switch( phase ) { case 0 : // 最初に読み込み開始を行う for( i = 0 ; i < NUM ; i ++ ) { handle[ i ] = LoadGraph( "Test1.bmp" ) ; } phase = 1 ; break ; case 1 : // 読み込みが完了していない要素があるまでループ for( i = 0 ; i < NUM ; i ++ ) { if( CheckHandleASyncLoad( handle[ i ] ) == TRUE ) { break ; } } // 全ての読み込みが完了していたら if( i == NUM ) { // 全てのハンドルを削除して最初に戻る for( i = 0 ; i < NUM ; i ++ ) { DeleteGraph( handle[ i ] ) ; } phase = 0 ; // ループ回数をインクリメント loopcount ++ ; } else { // 読み込み完了前の場合は残り読み込み数とループ数を描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "LoopCount:%d ASyncLoadCount:%d", loopcount, GetASyncLoadNum() ) ; } break ; } ScreenFlip() ; } DxLib_End(); return 0; } よろしければ seaさんの環境でも上記の検証用コードであればエラーが発生しないか 試してみていただけないでしょうか? あと、読み込みに使用された関数や読み込まれたファイルのサイズなども関係しているかもしれませんので、 よろしければエラーが発生した際に読み込んだファイルのサイズ・数・種類や使用された関数( LoadSoundMem や LoadGraph など )を教えてください m(_ _;m > Wikipediaを見てみると、可能性は低いがハードウェアの故障も考えられるといった趣旨の事も記述されており、 > DXライブラリのAndroid版利用者から同様の報告が見当たらないので、使用している実機端末を怪しんだ方がいいでしょうか。 いえ、私が少しだけ調べたところ、「bus error はファイル関係で起こるエラー」とあったので、 今回の非同期読み込みと一致しているので、ハードウェアの故障の可能性は低いのではないかと思います あと、他の方からご報告が無いのはDXライブラリAndroid版を使用されている方が少ないからだと思います(汗)
メンテ
Re: bus error の発生について ( No.2 )
名前:sea 日時:2017/03/21 02:23

ご返答ありがとうございます。 以下に確認情報を列挙しますので、ご確認ください。 > よろしければ seaさんの環境でも上記の検証用コードであればエラーが発生しないか > 試してみていただけないでしょうか?    上述されていたソースコードを実行しみたところ、bus errorは出なくなりました。    ですが、それとは別に新しく妙な事象が起きてしまったので、詳細を下記の補足に1.としてまとめて記載いたしました。    ※画像ファイルについては一旦下記のフォルダ内にあった画像に差し替えて実行しました。    path : サンプルプログラム実行用フォルダ\DxLibAndroidSample\DxLibAndroidSample.Packaging\assets\test1.bmp    また、自分が使っていた画像に差し替えて再度実行したところ、今回使っていた2種類の画像ファイル読込時に、bus errorが確認されました。    画像ファイル情報については下記の返答に記述してあります。 > あと、読み込みに使用された関数や読み込まれたファイルのサイズなども関係しているかもしれませんので、 > よろしければエラーが発生した際に読み込んだファイルのサイズ・数・種類や使用された関数( LoadSoundMem や > LoadGraph など )を教えてください m(_ _;m    画像サイズ等の情報は以下の通りになります。      拡張子:PNG      大きさ:240×240      サイズ:7.90KB      下記URLに配布されている「王様」という画像になります。      http:))nekuramap.blog.fc2.com/blog-entry-127.html      こちらは自分のコードでの読込時に使用していた関数はLoadDivGraph()です。      生成したハンドルの数は2つで、画像を区切りとって読み込んでいました。      拡張子:JPG      大きさ:716×1011      サイズ:286KB      画像の配布元を失念したため、JPGは以上の情報のみになります。      こちらは自分のコードでの読込時に使用していた関数はLoadGraph()です。      生成したハンドルの数は1つです。    音楽ファイルの読込処理はまだ行っていませんでしたので未確認になります。 > いえ、私が少しだけ調べたところ、「bus error はファイル関係で起こるエラー」とあったので、 > 今回の非同期読み込みと一致しているので、ハードウェアの故障の可能性は低いのではないかと思います > あと、他の方からご報告が無いのはDXライブラリAndroid版を使用されている方が少ないからだと思います(汗)   ファイル関係から起こるとは知りませんでした、端末の購入も検討していたのでとりあえず助かります。   Android版をリリースされてお忙しいと思いますが、気長に待っておりますので、宜しくお願いいたします。 <以下は補足になります>   1.BMP形式の画像ではbus errorの発生は確認されなかったので、そのまま上述されたソースを少し変更して     DrawGraph()関数で描画させてみたのですが、描画失敗との結果になっていました。     確認したところ、CheckHandleASyncLoad(handle[i])が-1を返していました。     ※LoadDivGraph()に変えて実行しても同じ結果でした。   2.別のソースでの確認でしたが、非同期処理をしないモードでの画像、音声データの読込・描画・再生をしたところ、     問題なく動作していたのは確認しています。 以上になります、宜しくお願いいたします。
メンテ
Re: bus error の発生について ( No.3 )
名前:管理人 日時:2017/03/22 01:37

ご返答ありがとうございます 詳細はまだ調べ切れていませんが、JPEGの読み込みの際にエラーが発生していることがわかりました ただ、非同期読み込みかどうかに関係なく 716x1011 の jpg 画像を DXライブラリAndroid版で LoadGraph で読み込むとエラーが発生してしまうので、もし seaさんの環境では 非同期読み込みの際にのみエラーが発生するということでしたら、私が今回発見した jpeg読み込みエラーと seaさんの環境で発生する bus error はまた別の原因かもしれません 尚、jpeg読み込み時のエラーについてはまだ修正できていません、少し日数が必要かもしれないので 申し訳ありませんがお時間をください m(_ _;m ( 画像のサイズが関係しているようなので、修正前のライブラリでも画像のサイズを奇数( 1011 )ではなく 2の倍数や4の倍数にリサイズすると正常に読み込めるようになるかもしれません ) > 1.BMP形式の画像ではbus errorの発生は確認されなかったので、そのまま上述されたソースを少し変更して >     DrawGraph()関数で描画させてみたのですが、描画失敗との結果になっていました。 >     確認したところ、CheckHandleASyncLoad(handle[i])が-1を返していました。 >     ※LoadDivGraph()に変えて実行しても同じ結果でした。 ファイルが開けていない可能性があります、Android版では読み込むファイルは必ず VisualStudio Community 2015 のソリューションエクスプローラーを使用して assets フォルダに 入れる必要がありますが、ソリューションエクスプローラー上の assets フォルダに入れていないファイルを LoadDivGraph で読み込もうとしてしまっているということは無いでしょうか? > 2.別のソースでの確認でしたが、非同期処理をしないモードでの画像、音声データの読込・描画・再生をしたところ、 >   問題なく動作していたのは確認しています。 お試しいただきありがとうございます 私の手元では 716x1011 の JPG ファイルを読み込むと、非同期処理をしないモードで読み込んでもエラーが 発生してしまうのですが、seaさんの環境では正常に読み込めますでしょうか?
メンテ
Re: bus error の発生について ( No.4 )
名前:sea 日時:2017/03/22 12:14

ご返答ありがとうございます。 以下に確認情報を列挙しますので、ご確認ください。 > 詳細はまだ調べ切れていませんが、JPEGの読み込みの際にエラーが発生していることがわかりました > ただ、非同期読み込みかどうかに関係なく 716x1011 の jpg 画像を DXライブラリAndroid版で > LoadGraph で読み込むとエラーが発生してしまうので、もし seaさんの環境では > 非同期読み込みの際にのみエラーが発生するということでしたら、私が今回発見した jpeg読み込みエラーと > seaさんの環境で発生する bus error はまた別の原因かもしれません >  > 尚、jpeg読み込み時のエラーについてはまだ修正できていません、少し日数が必要かもしれないので > 申し訳ありませんがお時間をください m(_ _;m > ( 画像のサイズが関係しているようなので、修正前のライブラリでも画像のサイズを奇数( 1011 )ではなく > 2の倍数や4の倍数にリサイズすると正常に読み込めるようになるかもしれません )   承知致しました。   仰る通り、こちらは同期読込であればJPGでも難なく描画しているので、何と妙な……。 >> 1.BMP形式の画像ではbus errorの発生は確認されなかったので、そのまま上述されたソースを少し変更して >>     DrawGraph()関数で描画させてみたのですが、描画失敗との結果になっていました。 >>     確認したところ、CheckHandleASyncLoad(handle[i])が-1を返していました。 >>     ※LoadDivGraph()に変えて実行しても同じ結果でした。 > ファイルが開けていない可能性があります、Android版では読み込むファイルは必ず > VisualStudio Community 2015 のソリューションエクスプローラーを使用して assets フォルダに > 入れる必要がありますが、ソリューションエクスプローラー上の assets フォルダに入れていないファイルを > LoadDivGraph で読み込もうとしてしまっているということは無いでしょうか?   こちらの件につきまして、もう一度見直して試してみました。   リファレンスにある DrawGraph() のサンプルプログラムをそのまま使って実行してみたところ、   BMP、JPG の両形式の読み込み、描画処理が行われた事を確認致しました。   この結果から、assetsの設定等に問題はないと判断しております。 >>  2.別のソースでの確認でしたが、非同期処理をしないモードでの画像、音声データの読込・描画・再生をしたところ、 >>    問題なく動作していたのは確認しています。 > お試しいただきありがとうございます > 私の手元では 716x1011 の JPG ファイルを読み込むと、非同期処理をしないモードで読み込んでもエラーが > 発生してしまうのですが、seaさんの環境では正常に読み込めますでしょうか?   上述した報告から、問題なく描画まで出来ていました……。    <以下は補足になります>   以前、管理人さんが試してくださったソースを再度デバッグで確認してみたところ、   どうやら3回目のループ (i = 2) で LoadGraph("test1.bmp") からハンドルを返すまでにbus error が発生しているようです。   handle[0], handle[1] には正常なハンドルを返しているようでした。      上記の結果から、int handle[500] を一旦 int handle に変更し、実行してみたのですが、   そうすると何故か LoadGraph("test1.bmp") から1つ目のハンドルを返す時点で bus error が発生してしまいました。      最後に、リファレンスの DrawGraph() を非同期読込型に対応させたつもりの下記プログラムを実行してみたのですが、   結果は GHandle = LoadGraph("test1.bmp") では正常なハンドルを返しているようですが、   CheckHandleASyncLoad(GHandle) を呼び出すところで bus error が発生していました。   こちらについては、1回目〜5回目の呼び出しの間にエラーが発生してしまいました。   エラーが起こる前までは num に「1」を返していました。   GetASyncLoadNum() に変更対応しても同じような結果となってしまいました。    #include "DxLib.h" int android_main(void) { int GHandle; if (DxLib_Init() == -1) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 非同期読込ON SetUseASyncLoadFlag(TRUE); // test1.bmpの読み込み GHandle = LoadGraph("test1.bmp"); // 読込が終わるまでループ while (true) { int num = CheckHandleASyncLoad(GHandle); // ←私の方では、この行を1〜5回呼び出す間に bus error が発生してしまいました。 それ以外は「1」を返してました。 if (num == FALSE) { break; } } // 読みこんだグラフィックを画面左上に描画 DrawGraph(0, 0, GHandle, TRUE); WaitKey(); // 結果を見るためにキー待ち(『WaitKey』を使用) DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 } 以上になります、宜しくお願いいたします。
メンテ
Re: bus error の発生について ( No.5 )
名前:管理人 日時:2017/03/23 01:11

ご情報ありがとうございます > 仰る通り、こちらは同期読込であればJPGでも難なく描画しているので、何と妙な……。 716x1011 のサイズであれば必ずエラーが発生するというわけではないですね… ( 私が自前で用意した 716x1011 サイズの jpeg ファイルではエラーが発生するものと なっていたようです、つまりエラーが発生する jpeg ファイルになっているかどうかは サイズに因るものではないようです… ) > 最後に、リファレンスの DrawGraph() を非同期読込型に対応させたつもりの下記プログラムを実行してみたのですが、 > 結果は GHandle = LoadGraph("test1.bmp") では正常なハンドルを返しているようですが、 > CheckHandleASyncLoad(GHandle) を呼び出すところで bus error が発生していました。 ありがとうございます、載せていただいたプログラムで私の環境でも実機で bus error が 発生するのを確認できました 原因をすぐにでも調べたいのですが、今週はもう週末になるまで作業の時間を確保できそうに無いので 修正作業の開始は最速でも週末になります 申し訳ありませんが修正版ができるまでは非同期読み込みは使用しないようにしてください m(_ _;m
メンテ
Re: bus error の発生について ( No.6 )
名前:sea 日時:2017/03/23 18:35

ご返答ありがとうございます。 > 716x1011 のサイズであれば必ずエラーが発生するというわけではないですね… > ( 私が自前で用意した 716x1011 サイズの jpeg ファイルではエラーが発生するものと > なっていたようです、つまりエラーが発生する jpeg ファイルになっているかどうかは > サイズに因るものではないようです… )   こういった差異の場合、端末サイドの問題になるんでしょうか……。 > 載せていただいたプログラムで私の環境でも実機で bus error が > 発生するのを確認できました >  > 原因をすぐにでも調べたいのですが、今週はもう週末になるまで作業の時間を確保できそうに無いので > 修正作業の開始は最速でも週末になります >  > 申し訳ありませんが修正版ができるまでは非同期読み込みは使用しないようにしてください m(_ _;m   承知致しました。   再現された様で、一段落といったところかと思います。   対応してくださり、ありがとうございます。   以上の事から、実機端末も問題ないとほぼ確信できました。   修正についてですが、時間の方は気になりませんので管理人さんのペースで、どうぞ宜しくお願いいたします。 以上になります、失礼致します。
メンテ
Re: bus error の発生について ( No.7 )
名前:管理人 日時:2017/03/26 03:55

お待たせしました、bus error が発生しないように修正したバージョンを アップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.exe // Android版 ARM用 ただ、『修正』とはいっても、DXライブラリのプログラムに手を加えたわけではなく、 DXライブラリAndroid版のプログラムのコンパイルに使用する C++コンパイラを Clang から GCC に変更する、という対応をしました ( Clang では『最適化あり』でコンパイルするとDXライブラリ内部の関数に入った 瞬間にクラッシュしたり、関数内のコード量が一定を超えるとクラッシュしたり、 にも関わらず非同期用のスレッドではなく android_main を実行しているスレッドで 同じ関数を実行するとクラッシュし無かったりと謎の挙動をしたので… ) > こういった差異の場合、端末サイドの問題になるんでしょうか……。 いえ、単純に私が用意した jpegファイルと seaさんのお手元にある jpegファイルの 内容が異なるために結果が異なっているだけです 私が用意した jpegファイルを使用すれば seaさんの環境でも( というかどのような 環境でも )エラーが発生します ( 因みに今回のバージョンではその問題も修正してあります )
メンテ
Re: bus error の発生について ( No.8 )
名前:sea 日時:2017/03/26 13:24

ご対応してくださり、ありがとうございます。 こちらでも bus error の発生は無くなりました。 ですが、下記の非同期読込判断系の関数が、一向に読込完了の返り値を返さなかったです……。(下記両関数とも4〜5分程度待ちました) ・CheckHandleASyncLoad(GHandle) ・GetASyncLoadNum() プログラムは「Re: bus error の発生について ( No.4 )」に記述されているものを使いました。 因みに使用した画像は、DXライブラリに入っているサンプル画像の「test1.bmp」になります。 以上になります、お手数ですが、ご確認お願いいたします。 以上、失礼致します。
メンテ
Re: bus error の発生について ( No.9 )
名前:管理人 日時:2017/03/26 20:39

bus error が発生しなくなったようで何よりです No.4 のプログラムですが、こちらの箇所を while (true) { int num = CheckHandleASyncLoad(GHandle); // ←私の方では、この行を1〜5回呼び出す間に bus error が発生してしまいました。 それ以外は「1」を返してました。 if (num == FALSE) { break; } } while (true) から while (ProcessMessage() == 0) に変更していただくと読み込み完了になります while (ProcessMessage() == 0) { int num = CheckHandleASyncLoad(GHandle); // ←私の方では、この行を1〜5回呼び出す間に bus error が発生してしまいました。 それ以外は「1」を返してました。 if (num == FALSE) { break; } } 非同期読み込みは大部分の処理を非同期で行うのですが、一部メインスレッドからではないと実行できない 処理があり、その処理を関数 ProcessMessage の中で行っているので、ProcessMessage が一切呼ばれないと 『メインスレッドで処理してもらわないといけない箇所』から先に進めなくなり、結果として非同期読み込みが 一向に終わらないということになります よろしければお試しください m(_ _)m
メンテ
Re: bus error の発生について ( No.10 )
名前:sea(解決) 日時:2017/03/27 18:16

ご対応ありがとうございます。 ProcessMessage()に変更したプログラムで実行してみたところ、問題なく動作しました! ありがとうございます! 引き続き作成を進める事が出来ます。 親身に対応していただき、ありがとうございました。 以上です、失礼致します。
メンテ

Page: 1 |

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

   クッキー保存