喫茶XRAYトップページ

[スレッド全体
]

[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