2009-07-16 3 views
5

Ich stieß vor kurzem auf ein Problem, das meine Programmierfähigkeiten herausforderte, und es war eine sehr zufällige Endlosschleife. Ich hatte einen Code umgeschrieben, um ihn auszutrocknen, und er änderte eine Funktion, die wiederholt mit genau den Methoden aufgerufen wurde, die sie aufgerufen hatte; ein elementares Thema, sicherlich. Apache entschied, das Problem durch einen Absturz zu lösen, und das Protokoll notierte nichts anderes als den "erzeugten Kindprozess". Das Problem war, dass ich das Problem an diesem Tag nie wirklich beendete, es kam am Nachmittag auf und musste es heute lösen.Wie Debuggen und Schutz vor Endlosschleifen in PHP?

Am Ende war meine Lösung einfach: Protokollieren Sie die Logik manuell und sehen Sie, was passiert ist. Das Problem war sofort offensichtlich, als ich eine Protokolldatei hatte, die aus zwei eindeutigen Zeilen bestand, gefolgt von zwei Zeilen, die jeweils zweihundert Mal wiederholt wurden.

Wie können wir uns vor Endlosschleifen schützen? Und wenn das scheitert (und es wird), was ist der schnellste Weg, es aufzuspüren? Ist es tatsächlich die Protokolldatei, die am effektivsten ist, oder etwas anderes?

Ihre Antwort könnte sprachunabhängig sein, wenn es eine Best Practice wäre, aber ich würde lieber bei PHP-spezifischen Techniken und Code bleiben.

+1

Diese Frage trifft mich nicht anders als die allgemeine Frage "Wie schreibt man fehlerfreie Software?" Frage ... – gahooa

+0

@gahooa, das bist nur du; Ich bin nicht an fehlerfreier Software interessiert, weil es nie dorthin gelangt. Ich möchte nur Tipps, um dieses Problem zu lösen, was mich neulich überrascht hat. –

Antwort

15

Sie könnten einen Debugger wie xdebug verwenden und durch Ihren Code gehen, von dem Sie vermuten, dass er die Endlosschleife enthält.

Xdebug - Debugger and Profiler Tool for PHP

können Sie legen auch

max_execution_time 

die Zeit, die Endlos-Schleife vor dem Absturz wird brennen zu begrenzen.

+0

Ich hatte xdebug komplett vergessen. Vielen Dank! –

0

schreiben Sie einfachen Code, so dass Bugs mehr offensichtlich sein werden? Ich frage mich, ob deine Endlosschleife auf eine lächerliche Garnkugel von Kontrollstrukturen zurückzuführen ist, die kein Mensch verstehen kann. Also natürlich hast du es getan.

Alle Endlosschleifen sind nicht schlecht (z. B. while (!quit)).

+0

Dies war in einer Codebasis mit 100 Zeilen; nicht viel, um mich aufzuhängen. Das Problem bestand darin, eine Routine eines verflochtenen Paars von Routinen neu zu schreiben und den Anruffluss umzukehren. "a-> b-> c" wurde zu "a <-> b". –

1

Unit-Tests könnten ebenfalls eine gute Idee sein. Vielleicht möchten Sie PHPUnit ausprobieren.

+0

Gute Idee, aber mein Code, während testbar, hätte die Komponententests abgestürzt. –

3

Manchmal finde ich die sicherste Methode, eine Grenzwertprüfung in die Schleife einzubauen. Die Art des Schleifenkonstrukts spielt keine Rolle. In diesem Beispiel habe ich eine ‚while‘ Aussage:

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

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

    ... 
} 

Ein angemessener Wert für $ max_loop_iterations könnte auf basieren:

  • einen konstanter Wert zur Laufzeit gesetzt
  • ein berechneter Wert auf der Basis des Größe eines Eingang
  • oder vielleicht ein berechneter Wert, basierend auf relative Laufzeitgeschwindigkeit

Hoffnung t seine Hilfe, - N

0

Können Sie die Ausführung verfolgen und ein Anrufdiagramm ausgeben? endlose Schleifen sind offensichtlich, und Sie können leicht diejenigen, die absichtlich sind (eine riesige Hauptschleife) gegen einen Unfall (lokale abababa ...Schleife oder Schleife, die niemals zum Hauptband zurückkehrt)

Ich habe von Software gehört, die dies für große komplexe Programme tut, aber ich konnte keinen Screenshot für Sie finden. Jemand hat ein Programm wie 3dsmax nachverfolgt und ein wirklich hübsches Anrufdiagramm ausgegeben.

Verwandte Themen