喫茶XRAYトップページ
[
▲前のスレッド
]
[9686]
無限ループの発見方法
返信
削除
2016/4/3 (日) 23:41:31
ny
こんにちは。デルファイ2006ですが、
テストラン中に無限ループに入っているようです。
どこのループに入っているのか分からず困っています。
無限ループの再現性も確認できていません。(まずはこれが先なのですが)
何かいい方法ありませんか?
ご教授ください。
[9687]
Re:無限ループの発見方法
返信
削除
2016/4/4 (月) 00:24:48
igy
▼ nyさん
> こんにちは。デルファイ2006ですが、
ちなみに、Delphi2006(Borland Developer Studio 2006)には、
Update2とHotfix があると思うのですが、適用済みですか?
[9688]
Re2:無限ループの発見方法
返信
削除
2016/4/4 (月) 01:08:23
ny
>Update2とHotfix があると思うのですが、適用済みですか?
??
わかりません。ってことは未適応かと。
当方、無料バージョンのターボデルファイです。
OSはWIN10です。
[9689]
Re3:無限ループの発見方法
返信
削除
2016/4/4 (月) 07:42:42
igy
▼ nyさん
> >Update2とHotfix があると思うのですが、適用済みですか?
> ??
> わかりません。ってことは未適応かと。
> 当方、無料バージョンのターボデルファイです。
Turbo Delphiであれば、Hotfix-Rollupが出ているようですね。
[9690]
Re4:無限ループの発見方法
返信
削除
2016/4/4 (月) 07:55:38
Mr.XRAY
> Turbo Delphiであれば、Hotfix-Rollupが出ているようですね。
トラブルの内容によっては,Update や Hotfix を適用すると解決する場合が
あるので,一応適用しておいた方がいいと思われます.
では,このような情報はどうして入手するかですが,
例えば DEKO さんとこでも可能です.
[Delphi の製品情報]
http://
ht-
deko.
com/
Delphi/
で,肝心の無限ループの件ですが,難しいですね.
何か検出方法があるのかも知れませんが,私は知りません.
一つ一つチェックしていくしかないのかも知れません.
過去の記憶では,ループが永久に続いてしまう,というのがありました.
これは,主にループを抜け出す条件判定の問題ですね.
そういうことがチェックしやすいコーディングを心掛けるとか... (^^;
[9691]
Re5:無限ループの発見方法
返信
削除
2016/4/4 (月) 08:29:31
igy
あと、無限ループ と書かれていますが、なぜ、無限ループってわかったのですか?
(単にプログラムが暴走しているってことは、ないですか?)
[9692]
Re6:無限ループの発見方法
返信
削除
2016/4/4 (月) 09:53:51
Mr.XRAY
▼ igyさん
> あと、無限ループ と書かれていますが、なぜ、無限ループってわかったのですか?
> (単にプログラムが暴走しているってことは、ないですか?)
あっ,そうですよね.
私も,某掲示板の質問を読んだ時,
「ん ? 何故,そう判断したんだろう?」
というのがあります.
[9693]
Re6:無限ループの発見方法
返信
削除
2016/4/4 (月) 10:41:01
Mr.XRAY
> あと、無限ループ と書かれていますが、なぜ、無限ループってわかったのですか?
無限ループということが分かっているのであれば,
ループしている場所で発生していることになりますね.
while, repeat, フックなんかもループの一種ですね.
[9694]
Re7:無限ループの発見方法
返信
削除
2016/4/4 (月) 11:22:37
igy
▼ nyさん
> どこのループに入っているのか分からず困っています。
> 無限ループの再現性も確認できていません。(まずはこれが先なのですが)
そもそも、この現象が発生したのは、どういう状況からですか?
例えば、
・何かの機能を追加した後から発生。追加する前は起こっていなかった・・・とか。
・Windows Xpでは問題なかったが、Windows 10にしたら発生した・・とか。
[9695]
Re8:無限ループの発見方法
返信
削除
2016/4/4 (月) 12:18:07
ny
皆様、ご教授ありがとうございます。
>なぜ、無限ループってわかったのですか?
テストランさせている際、固まってしまい、CPUメーターが上昇。
while内の条件判断が怪しいのですが、無限ループ中にコード内に中断マークを複数張っても止まらず、
問題個所を発見できません。
実行を中断させると、コードに戻れました。
実行中にコード側ウインドウの下ウインドウに「スレッドなんたら・・」と出てきますので、
それを手掛かりに、と、思ったのですが・・・・
>Windows 10にしたら発生した
ではないです。対象プログラムは10年位異状なく使っているもので、
今回機能を追加作成中で。
無限ループの再現ができればよいのですが。
「Update ・ Hotfix」を探してみます。
[9696]
Re9:無限ループの発見方法
返信
削除
2016/4/4 (月) 13:04:16
igy
▼ nyさん
> 中断マークを複数張っても止まらず、
その場所に到達する前に暴走しているとかは、ないですか?
[9697]
Re10:無限ループの発見方法
返信
削除
2016/4/4 (月) 18:45:50
Mr.XRAY
> その場所に到達する前に暴走しているとかは、ないですか?
本題とは直接関係ないかも知れませんが,最近経験した現象です.
ある Windows API の関数を使用したコードなんですが,
引数に与える値によっては,関数が永久に終了しないのがありました.
MSDN で調べたら,そのようなことがないように,その関数のコールバック関数を
作成して,コールバックの中で処理してください.
というのがありました.
コールバック関数なんかつくっていられんわい !! ( <-- つくれよ !? )
ということで,その関数を実行する前に引数の値をチェックする処理を追加
しました.
[9699]
Re9:無限ループの発見方法
返信
削除
2016/4/4 (月) 20:46:54
taki
▼ nyさん
> while内の条件判断が怪しいのですが、無限ループ中にコード内に中断マークを複数張っても止まらず、
> 問題個所を発見できません。
> 実行を中断させると、コードに戻れました。
Delphi2006のデバッグ機能がどうだったか分からないのですが、
ブレークポイントが設定できるのであれば、
ステップ実行、トレース実行とかも使えると思うのですが。
問題解決はジミチにコードを追っかけるしか方法はないと思います。
whileループ内の命令にブレークポイントを設定しても停止
しないのであれば、igyさんが指摘されているようにwhile
ループに入る前の問題でしょうね。
最初から1つ1つ命令をステップ実行するのは大変なので、
「カーソルの位置まで実行」というのもありますので、
試してみてはいかがですか。
つまり、ここまでは大丈夫という命令にカーソルを置いて、
「カーソルの位置まで実行」をすると、そこまで一気に
進めますので、そこからステップ実行で確かめられますよ。
もしDelphi2006のデバッグ機能の事、間違っていたらごめんなさい。
[9700]
Re10:無限ループの発見方法
返信
削除
2016/4/4 (月) 23:03:19
ny
お騒がせしています。
再現性、確認できました。
無限ループ箇所も発見できました。
やはり機能追加に伴う「while内」に不具合ありでした。
DelphiVer1 Ver2>ターボDelphiの流れで現在に至っています。
Win10の環境になってさすがに「Delphi 10」に切換えようと体験版をやってみましたが、
ターボDelphiのコードでは不具合があって諦めています。
(マウスのスクロールボタン・文字列の長さLenの返り値の違いなど)
なので、「Update2とHotfix」の適応についても現環境下では見送りました。
皆様ありがとうございました。
[
▼次のスレッド
]
INCM/CMT
Cyclamen v3.82