7

私は最近、プログラミング能力に挑戦する問題に遭遇しました、そしてそれは非常に偶然の無限ループでした。私はそれを乾かすためにいくつかのコードを書き直し、それが呼び出した正確なメソッドによって繰り返し呼び出されていた関数を変更しました。確かに、初歩的な問題です。Apacheはクラッシュすることで問題を解決することを決定し、ログには「生成された子プロセス」しか記録されませんでした。問題は、私がその日の問題のデバッグを実際に終了したことがなく、午後に発生し、今日それを解決しなければならなかったことでした。

結局、私の解決策は単純でした。ロジックを手動でログに記録し、何が起こったかを確認します。この問題は、2行の一意の行とそれに続く2行がそれぞれ約200回繰り返されるログファイルがある場合にすぐに明らかになりました。

無限ループから身を守る方法は何ですか?そして、それが失敗したとき(そしてそれはそうなるでしょう)、それを追跡するための最速の方法は何ですか?確かに最も効果的なのはログファイルですか、それとも他の何かですか?

それがベストプラクティスである場合、あなたの答えは言語に依存しない可能性がありますが、私はむしろPHP固有の手法とコードに固執したいと思います。

4

5 に答える 5

15

xdebugなどのデバッガーを使用して、無限ループが含まれていると思われるコードをウォークスルーできます。

Xdebug-PHP用のデバッガーおよびプロファイラーツール

設定することもできます

max_execution_time

クラッシュする前に無限ループが燃える時間を制限します。

于 2009-07-16T19:11:17.543 に答える
4

最も安全な方法は、ループに制限チェックを組み込むことだと思うことがあります。ループ構造のタイプは重要ではありません。この例では、「while」ステートメントを選択しました。

$max_loop_iterations = 10000;
$i=0;
$test=true;
while ($test) {

  if ($i++ == $max_loop_iterations) {
    echo "too many iterations...";
    break;
  }

  ...
}

$ max_loop_iterationsの妥当な値は、以下に基づいている可能性があります。

  • 実行時に設定される定数値
  • 入力のサイズに基づいて計算された値
  • または、相対的な実行速度に基づいて計算された値

これがお役に立てば幸いです、-N

于 2009-07-17T12:47:19.497 に答える
1

ユニットテストも良い考えかもしれません。PHPUnitを試してみることをお勧めします。

于 2009-07-16T19:49:15.673 に答える
0

実行を追跡し、コールグラフをダンプできますか?無限ループは明らかであり、意図的なもの(巨大なメイン​​ループ)と事故(ローカルのアバババ...ループまたはメインループに戻らないループ)を簡単に見つけることができます

大規模で複雑なプログラムに対してこれを行うソフトウェアについて聞いたことがありますが、スクリーンショットが見つかりませんでした。誰かが3dsmaxのようなプログラムをトレースし、本当にきれいなコールグラフをダンプしました。

于 2009-07-21T21:58:36.300 に答える
-2

簡単なコードを書くと、バグがより明らかになりますか?あなたの無限ループは、人間が理解できないような制御構造のばかげた糸球によるものではないかと思います。したがって、もちろんあなたはそれをやり遂げました。

すべての無限ループは悪くありません(例while (!quit))。

于 2009-07-16T19:36:51.270 に答える