Re: LoadGraphにてAccessViolationExceptionが発生する ( No.15 ) |
- 名前:AlphaGod 日時:2020/12/16 13:08
管理人様
後もう一点下記のような不具合があるようです。
300回起動 x 5セットのFlipを繰り返す処理に入るまでの起動試験を行いましたが、どうも不定期(230回目だったり、85回目だったり)にDX.SetFontSize(15);
でデッドロックしています。
SetFontSize前後にログを吐くように仕込んでありますため、デッドロックするのは、全てこのAPIのみ、かつAPI内部で発生しています。
何分か待ってみましたが、リターンしてこないようです。
現在、分かっている現象をまとめますと、下記のとおりです。
・DX.SetFontSize()でごく稀にデッドロックする。
・DX.LoadGraph()で稀に例外(@)が発生する。
・DX.DrawCircle(),DX.SetDrawScreen()でも稀に例外(@)が発生する。
@とは、保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.16 ) |
- 名前:管理人 日時:2020/12/17 00:23
Log.txt の貼り付けありがとうございます
すみません、3点ほどご質問させてください
1.Log.txt の内容を見る限りは最後までプログラムが実行されているようですが、
例外が発生するものの、プログラムはクラッシュ( 強制終了 )していないということでしょうか?
2.LoadGraph 内で発生する例外は、以下のようなシンプルに LoadGraph を実行するだけの
プログラムでも発生するのでしょうか?
DX.ChangeWindowMode(DX.TRUE);
if (DX.DxLib_Init() < 0)
{
return;
}
int GrHandle = DX.LoadGraph( "Test1.bmp" );
DX.DxLib_End();
3.SetFontSize や DrawCircle、SetDrawScreen についても、2の LoadGraph のように
SetFontSize だけを実行するプログラムや、SetDrawScreen だけを実行するプログラムでも
同様にデッドロックや例外が発生するのでしょうか?
それとも複数の関数を使用した場合のみ発生するのでしょうか?
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.17 ) |
- 名前:AlphaGod 日時:2020/12/17 11:00
管理人様
お世話になっております。
1.Log.txt の内容を見る限りは最後までプログラムが実行されているようですが、
例外が発生するものの、プログラムはクラッシュ( 強制終了 )していないということでしょうか?
→このLog.txtは正常にプログラムが走った時のものです。例外発生時のものではないです。必要であれば、例外発生時のLog.txtを取得します。
2.LoadGraph 内で発生する例外は、以下のようなシンプルに LoadGraph を実行するだけの
プログラムでも発生するのでしょうか?
→この通りのプログラムのみをC#に実装して数100回実施してみます。確認しましたらすぐにご連絡致します。
3.SetFontSize や DrawCircle、SetDrawScreen についても、2の LoadGraph のように
SetFontSize だけを実行するプログラムや、SetDrawScreen だけを実行するプログラムでも
同様にデッドロックや例外が発生するのでしょうか?
それとも複数の関数を使用した場合のみ発生するのでしょうか?
→これについては、複数の関数を使用した場合にのみ発生していると思われますが、2番目と同様に、SetFontSizeのみ最低限のものを実装して確認をしてみます。
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.18 ) |
- 名前:AlphaGod 日時:2020/12/17 11:43
管理人様
お世話になっております。
2.LoadGraph 内で発生する例外は、以下のようなシンプルに LoadGraph を実行するだけの
プログラムでも発生するのでしょうか?
→この通りのプログラムのみをC#に実装して数100回実施してみます。確認しましたらすぐにご連絡致します。
→LoadGraph,DeleteGraphを単純に永久に繰り返してみました、やはり不定期の箇所で必ず下記のようなアクセス違反が発生しました。
↓発生エラー
0x3A74BF90 (igd10iumd32.dll) で例外がスローされました (sampleApp.exe 内): 0xC0000005: 場所 0x0000042C への書き込み中にアクセス違反が発生しました
↓発生場所
3A74BF90 and dword ptr [ecx+2Ch],0FFFF0000h
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.19 ) |
- 名前:管理人 日時:2020/12/17 22:07
ご質問にご返答いただきありがとうございます
例外が発生した場合はそこでプログラムが止まってしまうということですね
LoadGraph だけでエラーが発生した件も了解しました
手元で No.16 のプログラムを100回実行してみましたが、例外が発生することはありませんでした
私が作成したプロジェクトをアップしましたので、こちらでも AlphaGodさんの環境では例外が
発生してしまうか、よろしければ試してみていただけないでしょうか? m(_ _)m
https://dxlib.xsrv.jp/temp/DxLibDLLTest_VS2019.zip
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.20 ) |
- 名前:AlphaGod 日時:2020/12/18 09:43
管理人様
お世話になっております。
上記プロジェクトにて実施しましたが、例外は発生しませんでした。
ちなみに、上記プロジェクトを下記の通り5000回繰り返すようにしましたが、同様に例外は起きませんでした。
GrHandleにはすべて値が入っていました。
int[] GrHandle = new int[5000];
for (int i=0;i<GrHandle.Length;i++)
{
GrHandle[i] = DX.LoadGraph("Test1.bmp");
}
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.21 ) |
- 名前:管理人 日時:2020/12/18 20:49
お試しいただきありがとうございます
例外は発生しませんでしたか…
例外が発生してしまうプロジェクトと異なる点などはありますでしょうか?
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.22 ) |
- 名前:AlphaGod 日時:2020/12/21 08:23
管理人様
お世話になっております。
>例外が発生してしまうプロジェクトと異なる点などはありますでしょうか?
異なる点ですが、現在思いつくのは、下記の2点くらいかと思います。
・FormにDX.SetUserWindow(this.Handle);を指定している点
・環境による違いとしては、二つのGPU(Intel i7上のUHD Graphics 630、RTX 2070 with Max-Q Design)を積んでいる点で、
かつUHD Graphics 630を指定して利用している(Windows10の機能で、グラフィックスのパフォーマンスの基本設定->クラシックアプリ->参照->本アプリ.exe->省電力)。
以上、宜しくお願い致します。
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.23 ) |
- 名前:みけ 日時:2020/12/22 18:33
タスクバー時はお世話様でした(-ω-)/ >管理人様
ちょっと気になったので[DxLibDLLTest_VS2019]をこちらでもテストしました
VSの実行テストだと検証出来ないのでバッチでEXEを実行しました
[LOOP.BAT]
echo off
set /A counter=1
:loop
echo %counter%
DxLibDLLTest_VS2019.exe
set /A counter+=1
goto loop
結果、強制リブート3回(1回目:約2680 / 2回目:不明 / 3回目:不明ですが4250回時は動作確認済み)・デッドロック1回(3870回目)
強制リブートはBSoDが発生しないでシステムが落ちるので詳細わかりません
下記をコメントした状態のテストは後日行います
// int GrHandle = DX.LoadGraph("Test1.bmp");
また、環境による現象の可能性がありますので他のPCテストは確認出来たら記事に上げます。
ではでは、、
■追記12/21
DX.LoadGraphをコメントしたプログラムで
12/21 16:46 約9500〜以上 BSoD発生 ダンプリスト取れなかったorz(ダンプ作成中のエラーのため、ダンプ ファイルの作成が失敗しました。)
bluescreenviewで読み込み出来た詳細です、
Bug Check String:IRQL_NOT_LESS_OR_EQUAL
Bug Check Code :0x0000000a
p1:00000000`0000000f
p2:00000000`000000ff
p3:00000000`00000000
p4:fffff802`826032c4
Caused By Driver :FLTMGR.SYS
Caused By Address:FLTMGR.SYS+38650
Crash Address:ntoskrnl.exe+3f5780
DX.LoadGraphがある状態よりも確率悪いのでもう少し調べてみますね、、
調査PC(debug用の骨董品ですいません)
DXライブラリ Ver3.22b
OS Windows10 ( Build 19042.685 ) 20H2
CPU名:Intel(R) Core(TM)2 CPU 6700 @ 2.66GHz
メモリ総量:6141.70MB 空きメモリ領域:3407.85MB
Graphics Device:NVIDIA GeForce GT 710 driver:460.89
■追記12/22
強制リブート等の検証はOS絡みが濃厚のため一時休止します、
初期化等は省略しています(OS64bit コンパイル64bit)
PROGRAM_1 (4時間ループさせて動作、異常なし)
int[] GrHandle = new int[20000];//メモリー無くなって一部スワップするまでの設定
for (int i=0;i<GrHandle.Length;i++)
{
GrHandle[i] = DX.LoadGraph("Test1.bmp");
}
PROGRAM_2 (3時間ループさせて動作、異常なし)
while (true)
{
if (DX.ProcessMessage() == -1) break;
GrHandle = DX.LoadGraph("Test1.bmp");
DX.DeleteGraph(GrHandle);
}
[Test.zip]
C#は使用しないのでよく解らないのですがスレッド関数あるのでマルチスレッドで動作させてるような・・・(つд⊂)エーン
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.24 ) |
- 名前:管理人 日時:2020/12/22 00:11
> AlphaGodさん
> ・FormにDX.SetUserWindow(this.Handle);を指定している点
> ・環境による違いとしては、二つのGPU(Intel i7上のUHD Graphics 630、RTX 2070 with Max-Q Design)を積んでいる点で、
> かつUHD Graphics 630を指定して利用している(Windows10の機能で、グラフィックスのパフォーマンスの基本設定->クラシックアプリ->参照->本アプリ.exe->省電力)。
どちらも原因に関係している可能性がありますが、『DX.SetUserWindow(this.Handle);を指定している点』の
方が有力な気がします
よろしければ AlphaGodさんが No.18 の検証の際に使用された
『DX.SetUserWindow(this.Handle); を使用して、且つ LoadGraph、DeleteGraph だけを繰り返す』プロジェクトを頂けないでしょうか?
こちらであれば私の環境でも現象が発生する可能性が高い気がしますので m(_ _)m
> みけさん
ご検証ありがとうございます
2680回や4250回は凄いですね…
流石に確率が違い過ぎるので、みけさんのご検証で発生した現象と AlphaGodさんの環境で発生した
現象はそれぞれ異なる不具合なのではないかと少し思っています
とりあえず私も LOOP.bat で強制リブート等が発生するか試してみます
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.25 ) |
- 名前:AlphaGod 日時:2020/12/22 10:04
管理人様
お世話になっております。
非常にシンプルにした版のプロジェクト一式を管理人様のメールアドレス(BQE00322@nifty.ne.jp)に送付致しました。
5000回のLoadGraphとDeleteGraphを繰り返す処理を入れておりますが、やはり何回やっても簡単にループ中に例外が発生しました。
ご確認のほど、何卒宜しくお願い致します。
私も不具合解決に向けて調査を続けます。
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.26 ) |
- 名前:AlphaGod 日時:2020/12/22 13:35
管理人様
管理人様宛のメールアドレスがエラーとなり遅れなかったので、下記のオンラインストレージに保存しました。
ttps://firestorage.jp/download/7bf6348fa6435dd63e6815148149b3cf9f44c30e
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.27 ) |
- 名前:AlphaGod 日時:2020/12/22 14:30
管理人様
お世話になっております。
原因が見えてきました。32bitで動作させた場合(32bitを選ぶ)は、少なくとも下記のDXライブラリAPIで不定期(=1025回目だったり67回目だったり2156回目だったり)
で例外が発生します。
・DX.DrawCircle
・DX.LoadGraph
64bitで動作させると例外は一度も発生していません。他のAPIも同様の可能性はありそうです。
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.28 ) |
- 名前:管理人 日時:2020/12/23 00:36
> AlphaGodさん
お手数をおかけしてすみません、再現用プロジェクトを拝見しました
( 手元の環境でも現象が再現しました )
結論としましては、DxLib_Init などのDXライブラリの関数を呼ぶスレッドと
メインスレッドが分かれていることが原因でした
( threadDxLib = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadDxLib)); が原因 )
個人的にはDXライブラリの関数を呼ぶスレッドがメインスレッドとは異なっても
単一のスレッドから呼ばれていれば問題無いと思っていたのですが、駄目だったようです
対策としては
・Direct3D 9 をマルチスレッド対応モードで使用する
というのがありまして、DX.DxLib_Init を呼ぶ前に
DX.SetUseDirect3DVersion(DX.DX_DIRECT3D_9EX);
DX.SetMultiThreadFlag(DX.TRUE);
を実行することでDXライブラリは Direct3D 11 の代わりに Direct3D 9 を
マルチスレッド対応モードで使うようになり、本件のエラーが発生しなくなります
よろしければお試しください m(_ _)m
> みけさん
> 強制リブート等の検証はOS絡みが濃厚のため一時休止します、
なるほど…私の手元の環境で9時間ほど実行して、40660回実行してもリブートはしなかったので
確かにその可能性が高いかもしれません
> [Test.zip]
> C#は使用しないのでよく解らないのですがスレッド関数あるのでマルチスレッドで動作させてるような・・・(つд⊂)エーン
ご推察の通りマルチスレッド関連が本件の原因でした
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.29 ) |
- 名前:AlphaGod 日時:2020/12/23 11:53
管理人様
お世話になっております。
原因が判明して良かったです。
Dxirect3D9動作、かつマルチスレッド対応モードにて、例外が発生しないか等の確認をしてみます。
DX.SetUseDirect3DVersion(DX.DX_DIRECT3D_9EX);ですが、Direct3D11ではなく、Direct3D9で使用するのは、本不具合の解消に影響するものとの認識で
あっておりますでしょうか?例外に、特に影響がない場合は、最新の11を使用したいと考えています。
また、マルチスレッド対応モードですが、スレッドを2本走らせているということは、現在のC#版DXライブラリでは必須?となる認識であってますでしょうか?
以上、宜しくお願い致します。
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.30 ) |
- 名前:AlphaGod 日時:2020/12/23 12:01
管理人様
トータル3000回近く、リリース予定のソフトウェアで起動を繰り返し試験してみました。
含めているDXライブラリの使用しているすべてのAPIで一度も例外やデッドロック等は発生しませんでした!
調査に協力して頂いた方、本当に有難うございます。また、何かあればご連絡いたします。
以上、宜しくお願い致します。
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.31 ) |
- 名前:管理人 日時:2020/12/23 23:40
正常に動作するようになったようで何よりです
> DX.SetUseDirect3DVersion(DX.DX_DIRECT3D_9EX);ですが、Direct3D11ではなく、Direct3D9で使用するのは、本不具合の解消に影響するものとの認識で
> あっておりますでしょうか?
はい、合っています
Direct3D 11 ではこの対応はできません
> また、マルチスレッド対応モードですが、スレッドを2本走らせているということは、現在のC#版DXライブラリでは必須?となる認識であってますでしょうか?
はい、スレッドを2本以上走らせる場合はマルチスレッド対応モードは必須となります
( 厳密にはメインスレッド以外のスレッドからDXライブラリの関数を呼ぶ場合は必須となります )
私が No.19 でアップしたようなメインスレッドだけしか存在しないプログラムであれば、
今回の対策は行う必要は無く、Direct3D 11 を使用することも可能です
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.32 ) |
- 名前:AlphaGod 日時:2020/12/25 11:43
管理人様
お世話になっております。
マルチスレッド対応モードですが、これはDXライブラリを使用する側に関係してくるAPIということでしょうか?
メインスレッドと他スレッドというのは、C#.NETの場合でいいますと、メインスレッドと同義はProgram.csのMain()関数(=メインスレッドのコンテキスト)
を意味するかと思います。そうすると、そのコンテキスト以外でDXライブラリを使用している場合はすべてDX.SetMultiThreadFlag(DX.TRUE);を呼ぶ必要が
あるという認識であっておりますでしょうか?
また、その場合、下記のAPIは両方とも必ずセットで呼ぶ必要がありますか?
DX.SetUseDirect3DVersion(DX.DX_DIRECT3D_9EX);
DX.SetMultiThreadFlag(DX.TRUE);
以上、宜しくお願い致します。
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.33 ) |
- 名前:管理人 日時:2020/12/26 01:22
> メインスレッドと他スレッドというのは、C#.NETの場合でいいますと、メインスレッドと同義はProgram.csのMain()関数(=メインスレッドのコンテキスト)
> を意味するかと思います。そうすると、そのコンテキスト以外でDXライブラリを使用している場合はすべてDX.SetMultiThreadFlag(DX.TRUE);を呼ぶ必要が
> あるという認識であっておりますでしょうか?
すみません、C#に詳しくないのですが、Program.csのコンテキスト以外が全てメインスレッドではないのでしたら、
そのご認識で合っていると思います
> また、その場合、下記のAPIは両方とも必ずセットで呼ぶ必要がありますか?
> DX.SetUseDirect3DVersion(DX.DX_DIRECT3D_9EX);
> DX.SetMultiThreadFlag(DX.TRUE);
はい、SetMultiThreadFlag は Direct3D 9 にのみ影響のある関数なので、必ずセットで呼ぶ必要があります
|
Re: LoadGraphにてAccessViolationExceptionが発生する ( No.34 ) |
- 名前:AlphaGod(解決済み) 日時:2020/12/28 11:38
本件解決いたしました。
ご協力いただき本当に有難うございました^o^!
|