自力での解決が行き詰ってしまったので質問させていただきます。
現在C++とDXライブラリを用いたゲームを製作しているのですが、実行時に動作が停止するようになってしまいました。
コンパイラはVisualStudioExpress2012で、停止時のメッセージは「~exeは動作を停止しました」「問題が発生したため、プログラムが正しく動作しなくなりました」。
このメッセージ自体はさほど珍しくもないものだと思うのですが、問題は原因を解明しようとデバッガーを使用した際です。
通常の実行(コマンドで言えばCTRL+F5)をしたときには動作を停止しました。
なのに、デバッガーによる実行(F5)をしたときは停止せずに動いてしまうのです。
これはDebugモードでもReleaseモードでも同じで、通常実行では停止し、ローカルWindowsデバッガーを使うと予定通りの動きをします。
諸事情でソースコードの公開が出来ないため曖昧な質問になってしまうのですが……。
同じような事例の解決策に心当たりがある方はご回答いただけると幸いです。
エラーがあるのにデバッガーが反応しない
Re: エラーがあるのにデバッガーが反応しない
メモリ配置に依存するようなバグの場合、デバッガ経由で起動すると動作が変わってしまいデバッグできないことがあります。
このような場合は_CrtCheckMemoryなどを使ってヒープが破壊されていないか調べたり、
症状が出ないようになるまでソースコードをコメントアウトするなどして目星を付けるのが一般的なアプローチではないかと思います。
このような場合は_CrtCheckMemoryなどを使ってヒープが破壊されていないか調べたり、
症状が出ないようになるまでソースコードをコメントアウトするなどして目星を付けるのが一般的なアプローチではないかと思います。
-
yotumo
Re: エラーがあるのにデバッガーが反応しない
h2so5さん
回答ありがとうございます。
紹介していただいた2つの手法について試してみようと思います。
所用でこれから外出するためすぐにとはいきませんが、結果が出たらご報告させていただきます。
回答ありがとうございます。
紹介していただいた2つの手法について試してみようと思います。
所用でこれから外出するためすぐにとはいきませんが、結果が出たらご報告させていただきます。
-
yotumo
Re: エラーがあるのにデバッガーが反応しない
紹介していただいた方法についての報告です。
まず手法①は情けないことに、_CrtCheckMemoryの使い方が分からず試すことができませんでした。
調べてはみたのですがVSの公式サイトの説明では理解できず、他のサイトでも具体的な使用例について触れられてなかったので……。
申し訳ありません。
次に、手法②のコメントアウトの方です。
問題のプログラムではゲームループに入る前、GameManageというクラスがnewされます。
そのGameManageクラスのコンストラクタでは、
ステージ管理クラスのnew
NPC管理クラスのnew
PC管理クラスのnew
の順番に処理が行われるのですが、このうちNPCとPCの管理クラスのnewをコメントアウトしておけば正常に動きます。
NPC管理クラスの処理を行うと動作が停止してしまいます。
ただ……このNPC管理クラスですが、動作停止の問題が起きてから、一切手を加えていません。
私の感覚で言うと、以前はちゃんと問題なく動いていたのに、突然エラーが発生するようになったという感じです。
また、コメントアウトをすべて解除した状態で通常実行した場合でも、ごく稀に正常な動作をすることがありました。
これは、その時だけ偶然メモリ確保が上手く行ったということなのでしょうか?
まず手法①は情けないことに、_CrtCheckMemoryの使い方が分からず試すことができませんでした。
調べてはみたのですがVSの公式サイトの説明では理解できず、他のサイトでも具体的な使用例について触れられてなかったので……。
申し訳ありません。
次に、手法②のコメントアウトの方です。
問題のプログラムではゲームループに入る前、GameManageというクラスがnewされます。
そのGameManageクラスのコンストラクタでは、
ステージ管理クラスのnew
NPC管理クラスのnew
PC管理クラスのnew
の順番に処理が行われるのですが、このうちNPCとPCの管理クラスのnewをコメントアウトしておけば正常に動きます。
NPC管理クラスの処理を行うと動作が停止してしまいます。
ただ……このNPC管理クラスですが、動作停止の問題が起きてから、一切手を加えていません。
私の感覚で言うと、以前はちゃんと問題なく動いていたのに、突然エラーが発生するようになったという感じです。
また、コメントアウトをすべて解除した状態で通常実行した場合でも、ごく稀に正常な動作をすることがありました。
これは、その時だけ偶然メモリ確保が上手く行ったということなのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: エラーがあるのにデバッガーが反応しない
バグっていても上手く動いていることは良くあります。
ゲームの場合、一分の情報を破壊していても動いているって市販ゲームは沢山あるでしょう。バグが出ないから気づいていないだけです。
NPC管理クラスだけを管理範囲外のメモリ情報の破壊に関与していないか厳密にポインタ処理と添字範囲外アクセスをチェックしてみた方が良いと思います。
>ただ……このNPC管理クラスですが、動作停止の問題が起きてから、一切手を加えていません。
>私の感覚で言うと、以前はちゃんと問題なく動いていたのに、突然エラーが発生するようになったという感じです。
そう見えると思いますが偶然です。
ゲームの場合、一分の情報を破壊していても動いているって市販ゲームは沢山あるでしょう。バグが出ないから気づいていないだけです。
NPC管理クラスだけを管理範囲外のメモリ情報の破壊に関与していないか厳密にポインタ処理と添字範囲外アクセスをチェックしてみた方が良いと思います。
>ただ……このNPC管理クラスですが、動作停止の問題が起きてから、一切手を加えていません。
>私の感覚で言うと、以前はちゃんと問題なく動いていたのに、突然エラーが発生するようになったという感じです。
そう見えると思いますが偶然です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: エラーがあるのにデバッガーが反応しない
他の箇所によるメモリ破壊をNPC管理クラスが顕在化させている可能性もあるのでは。
NPC管理クラス以外のコードも(つまるところ全部)チェックする必要があると思います。
NPC管理クラス以外のコードも(つまるところ全部)チェックする必要があると思います。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: エラーがあるのにデバッガーが反応しない
NPC管理クラスだと断言するには無理がありますね。失礼しました。ISLe さんが書きました:他の箇所によるメモリ破壊をNPC管理クラスが顕在化させている可能性もあるのでは。
NPC管理クラス以外のコードも(つまるところ全部)チェックする必要があると思います。
まずはじめに、手を付けるのはNPC管理クラスにしてみましょう。ぐらいの意味にとってください。
NPC管理クラスは大丈夫だと思っている思い込みが怖かったので、問題が有る可能性があるよと警告したかっただけです。
ただ、バグの発動状態となっている今のソースコードは全部を保存しておいてください。
何かの拍子にバグが発現しなくなると恐怖の潜伏バグに変わってしまいます。 → これは他の人とか環境が変わらないと発現しない恐怖のバグとなります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
yotumo
Re: エラーがあるのにデバッガーが反応しない
softya(ソフト屋)さん
回答ありがとうございます。
今まで上手く行っていた=バグがない、ということではない訳ですね。
正直、もしかして開発環境の方のバグじゃ……などと外部の問題を疑っていた気持ちもあったので反省します。
思い込みを廃して再チェックしてみることにします。
ISLeさん
回答ありがとうございます。
なるほど、そういうこともあるのですね。
NPC管理クラスのチェック後も解決しないようであれば他のクラスのチェックも行いたいと思います。
回答ありがとうございます。
今まで上手く行っていた=バグがない、ということではない訳ですね。
正直、もしかして開発環境の方のバグじゃ……などと外部の問題を疑っていた気持ちもあったので反省します。
思い込みを廃して再チェックしてみることにします。
ISLeさん
回答ありがとうございます。
なるほど、そういうこともあるのですね。
NPC管理クラスのチェック後も解決しないようであれば他のクラスのチェックも行いたいと思います。
-
yotumo
Re: エラーがあるのにデバッガーが反応しない
数日かけて調査した結果、ステージ管理クラスで配列外アクセスしていたことが分かりました。
これにてこの件は解決とさせていただきます。
回答してくださった皆様、本当にありがとうございました。
これにてこの件は解決とさせていただきます。
回答してくださった皆様、本当にありがとうございました。