プログラムがフリーズする原因とは?
プログラムがフリーズする原因とは?
プログラムがフリーズする原因って何があるんでしょうか?
例えば、プログラム上の(動作上の)塊
A
B
C
D
とあったとき、プログラムがフリーズすることがあったとします
Bだけをコメントアウトしてもフリーズしたまま
Dだけをコメント(略)
BとDを共にコメントアウトするとフリーズしなくなる
この場合、プログラムがフリーズする原因として何が考えられるのでしょうか?
ちなみに、フリーズはプログラムが起動し、ゲームをプレイできるようになってから10数秒後ぐらいに起こります
例えば、プログラム上の(動作上の)塊
A
B
C
D
とあったとき、プログラムがフリーズすることがあったとします
Bだけをコメントアウトしてもフリーズしたまま
Dだけをコメント(略)
BとDを共にコメントアウトするとフリーズしなくなる
この場合、プログラムがフリーズする原因として何が考えられるのでしょうか?
ちなみに、フリーズはプログラムが起動し、ゲームをプレイできるようになってから10数秒後ぐらいに起こります
-
フリオ
Re: プログラムがフリーズする原因とは?
B、Dにエラーの原因とそれを顕在化する要因がある場合、
Aに原因があって、B、Dにそれを顕在化する要因がある場合、
Aに原因があってBにそれを顕在化する要因があり、Cに原因があってDにをれを顕在化する要因がある場合、
等が考えられるので、
これだけだと、なんともいえないのでは?
Aに原因があって、B、Dにそれを顕在化する要因がある場合、
Aに原因があってBにそれを顕在化する要因があり、Cに原因があってDにをれを顕在化する要因がある場合、
等が考えられるので、
これだけだと、なんともいえないのでは?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムがフリーズする原因とは?
メモリ破壊を起こしている場合は偶然の積み重ねで関係ないモジュールがフリーズする可能性は大きいです。
そこそこの大きさプログラムでは当たり前のようにあると思っておいて下さい。
※ そういう部分のガードを徹底的に行えばある程度は避ける事ができます。つまりエラー処理やらポインタの値のチェック、配列の添字範囲外のチェックなどです。想定外の値を弾きswitch文でdefaultに来たらエラーにするなどの工夫も有効でしょう。
あとフリーズしている場合デバッガで中断してフリーズする原因を特定したほうが良いと思います。
そこそこの大きさプログラムでは当たり前のようにあると思っておいて下さい。
※ そういう部分のガードを徹底的に行えばある程度は避ける事ができます。つまりエラー処理やらポインタの値のチェック、配列の添字範囲外のチェックなどです。想定外の値を弾きswitch文でdefaultに来たらエラーにするなどの工夫も有効でしょう。
あとフリーズしている場合デバッガで中断してフリーズする原因を特定したほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムがフリーズする原因とは?
これは思いつきませんでしたフリオ さんが書きました:Aに原因があって、B、Dにそれを顕在化する要因がある場合、
Aに原因があってBにそれを顕在化する要因があり、Cに原因があってDにをれを顕在化する要因がある場合、
今まで
A
C
というプログラムでこれが動いていたので、ここは考えなくても大丈夫だろうと、勝手に考えていました
そうなんですか。これが、仕事で納期直前に発覚したら・・・・・・・・・恐ろしいですねsoftya(ソフト屋) さんが書きました:メモリ破壊を起こしている場合は偶然の積み重ねで関係ないモジュールがフリーズする可能性は大きいです。
そこそこの大きさプログラムでは当たり前のようにあると思っておいて下さい。
エラー処理は教えていただいたとおり、入れるようにしていますが、配列の添字とかは考えたことなかったです。(そのせいで大抵のバグはこれだったりするのですが^^;softya(ソフト屋) さんが書きました:※ そういう部分のガードを徹底的に行えばある程度は避ける事ができます。つまりエラー処理やらポインタの値のチェック、配列の添字範囲外のチェックなどです。想定外の値を弾きswitch文でdefaultに来たらエラーにするなどの工夫も有効でしょう。
VC++2010でのやり方がわかりません。クライアントがフリーズするとVCのほうもフリーズすることがあるようなのですが・・・・・softya(ソフト屋) さんが書きました:あとフリーズしている場合デバッガで中断してフリーズする原因を特定したほうが良いと思います。
一度調べてみます
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムがフリーズする原因とは?
その他のテクニック。
1.どこでフリーズしているか不明なら、OutputDebugString()で通過ポイント識別子をあちこちに埋め込んでおいて通過ポイントの通過を調べるのも方法です。
2.再帰呼び出しは上限数を決めて上限を超えないようにガードする。超えたらaboat()など。
3.while/forループは上限数を超えないようにカウンタを設けてガードする。超えたらaboat()など。
あとVSが生きているならデバッガで中断できるはずです。
1.どこでフリーズしているか不明なら、OutputDebugString()で通過ポイント識別子をあちこちに埋め込んでおいて通過ポイントの通過を調べるのも方法です。
2.再帰呼び出しは上限数を決めて上限を超えないようにガードする。超えたらaboat()など。
3.while/forループは上限数を超えないようにカウンタを設けてガードする。超えたらaboat()など。
あとVSが生きているならデバッガで中断できるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムがフリーズする原因とは?
大まかに区切って
OutputDebugStringで大体のあたりをつけ
最後に表示されたのとその次の間で細かくやっていくと
どうもsendでフリーズしている模様です。
具体的には1704ループ目です
受信が1703回できているのかを確認する予定です
OutputDebugStringで大体のあたりをつけ
最後に表示されたのとその次の間で細かくやっていくと
どうもsendでフリーズしている模様です。
具体的には1704ループ目です
受信が1703回できているのかを確認する予定です
Re: プログラムがフリーズする原因とは?
受信側では1620ループ目でフリーズ・・・・ではないようですが処理が行われなくなっているようです
クライアント側は1699ループ目でフリーズです(数値訂正)
クライアント側は1699ループ目でフリーズです(数値訂正)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムがフリーズする原因とは?
sendとrecvの数が同じとは限りませんが、TCP/UDPどちらの話でしょう?
あとrecv側ではtimeoutとか処理してないんでしょうか?
数だけ見ると送信パケットが溜まりすぎているためsendに支障が出ているようにも見えますが、send側もtimeout処理を設けたほうが良いかも知れません。
あとrecv側ではtimeoutとか処理してないんでしょうか?
数だけ見ると送信パケットが溜まりすぎているためsendに支障が出ているようにも見えますが、send側もtimeout処理を設けたほうが良いかも知れません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムがフリーズする原因とは?
UDPです。
selectを用い、さらにタイムアウトは1μs取っています
タイムアウトを設定する・・・・ですか。その発想はなかったです。とはいえ、どうすればいいのか・・・・・少し考えて見ます
selectを用い、さらにタイムアウトは1μs取っています
そうなんですよね。その結論に達したのですが、どうしようかと・・・・・softya(ソフト屋) さんが書きました:数だけ見ると送信パケットが溜まりすぎているためsendに支障が出ているようにも見えます
タイムアウトを設定する・・・・ですか。その発想はなかったです。とはいえ、どうすればいいのか・・・・・少し考えて見ます
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムがフリーズする原因とは?
それだけとは断言できないので次のことも検討してみて下さい。winsock関係のメモリが破壊されている可能性も皆無ではありません。
1.同じようなパケットを送信動作をする小さなプログラムを作ってテスト。下に書く送信ログを送信に使っても良いかも。
2.送信ログファイルと受信ログファイルを作って送受信のパケットの突き合わせを行う。テキストにして比較はWinMargeなどを使うと便利。
1.同じようなパケットを送信動作をする小さなプログラムを作ってテスト。下に書く送信ログを送信に使っても良いかも。
2.送信ログファイルと受信ログファイルを作って送受信のパケットの突き合わせを行う。テキストにして比較はWinMargeなどを使うと便利。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムがフリーズする原因とは?
送信側の総データ量は508kBなのに、受信側は131,568kBというふうです
データが大きすぎるのか教えてくださったソフトでは開けませんでした。
データが大きすぎるのか教えてくださったソフトでは開けませんでした。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムがフリーズする原因とは?
あれ?resvとsendは対のデータではないのですか? 送信側のソフトと受信側のソフトで突き合わせをすべきです。
受信が131,568kBもあるなら送信も131,568kBないと変ですが。
1600回程度で、そんなにパケットが記録されるんでしょうか?
とりあえず、大きいパケットの付きあわせが難しいのであれば、
パケット毎にmd5ハッシュを生成してmd5ハッシュを記録しただけのログを生成してみて下さい。
それなら膨大なパケットログにはならないはずです。
参考例。
「opensslを用いて、MD5のハッシュ値を求める - s-kitaの日記」
http://d.hatena.ne.jp/s-kita/20080803/1217775248
受信が131,568kBもあるなら送信も131,568kBないと変ですが。
1600回程度で、そんなにパケットが記録されるんでしょうか?
とりあえず、大きいパケットの付きあわせが難しいのであれば、
パケット毎にmd5ハッシュを生成してmd5ハッシュを記録しただけのログを生成してみて下さい。
それなら膨大なパケットログにはならないはずです。
参考例。
「opensslを用いて、MD5のハッシュ値を求める - s-kitaの日記」
http://d.hatena.ne.jp/s-kita/20080803/1217775248
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムがフリーズする原因とは?
送信側は計算上(送信回数*送信データバイト数)と一致するので、受信側が508kにならないといけないんですが・・・・・・
これを書かなければいけませんでしたね。ごめんなさい
MD5ハッシュとかいうのをやってみます
これを書かなければいけませんでしたね。ごめんなさい
MD5ハッシュとかいうのをやってみます
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: プログラムがフリーズする原因とは?
md5導入が難しかったら、とりあえず生データのままで受信が500KB程度で打ち切って送信と受信で比べてみたらどうでしょうか?史上最悪のデスペナ さんが書きました:MD5ハッシュが上手くできませんので暫くかかりそうです
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: プログラムがフリーズする原因とは?
とりあえず、データを2回だけ送信するプログラムに変えました
受信プログラム(マルチスレッド)が上手く働いていないようです
既に何も送信してないのに受信スレッドが反応しているので・・・・・・
とりあえず、こちらは解決にしておきます
お手数をおかけしました
受信プログラム(マルチスレッド)が上手く働いていないようです
既に何も送信してないのに受信スレッドが反応しているので・・・・・・
とりあえず、こちらは解決にしておきます
お手数をおかけしました