7
votes

Comment déboguer et protéger contre des boucles infinies dans PHP?

J'ai récemment couru contre un problème qui a contesté mes capacités de programmation, et c'était une boucle infinie très accidentelle. J'ai réécrit un certain code pour la sécher et modifier une fonction qui était appelée à plusieurs reprises par les méthodes exactes qu'elle a appelées; Un problème élémentaire, certainement. Apache a décidé de résoudre le problème en se brisant et le journal a noté que "Processus enfant engendré". Le problème était que je n'ai jamais fini de déboguer la question de ce jour-là, elle a recadré dans l'après-midi et devait le résoudre aujourd'hui.

À la fin, ma solution était simple: enregistrer la logique manuellement et voir ce qui s'est passé. Le problème était immédiatement apparent lorsque j'avais un fichier journal composé de deux lignes uniques, suivies de deux lignes qui ont été répétées deux cents fois chacun.

Quels sont les moyens de nous protéger contre les boucles infinies? Et, quand cela échoue (et ce sera-t-il), quel est le moyen le plus rapide de le suivre? Est-ce vraiment le fichier journal le plus efficace, ou autre chose?

Votre réponse pourrait être un langage agnostique s'il s'agissait d'une meilleure pratique, mais je préfère rester avec des techniques et un code spécifiques à PHP.


2 commentaires

Cette question ne me frappe pas différent du général "Comment écrivez-vous des logiciels sans bug" question ...


@gahooa, c'est juste toi; Je ne suis pas intéressé par des logiciels sans bug, car ce n'allait jamais y arriver. Je veux juste des conseils pour attraper ce problème, ce qui m'a attrapé de garde l'autre jour.


5 Réponses :


15
votes

Vous pouvez utiliser un débogueur tel que XDEBUG et parcourir votre code que vous soupçonnez contenant la boucle infinie.

xdebug - outil de débogueur et de profileur pour php p>

Vous pouvez également définir p >

max_execution_time


1 commentaires

J'avais complètement oublié de Xdebug. Merci!



-2
votes

écrire un code simple, afin que les insectes soient plus apparents? Je me demande si votre boucle infinie est due à un peu de structures de contrôle de fil ridicule qu'aucun être humain ne peut comprendre. Ainsi, bien sûr, vous êtes allié.

Toutes les boucles infinies ne sont pas mauvaises (par exemple tandis que (! Quit) ).


1 commentaires

C'était dans une base de code 100 lignes; Pas beaucoup là pour me pendre. Le problème réécrivait une routine d'une paire de routines étroitement entrecondis et inversant le flux d'appels. a-> b-> c est devenu a <-> b .



1
votes

Les tests unitaires peuvent également être une bonne idée. Vous voudrez peut-être essayer phpunit.


1 commentaires

Bonne idée, mais mon code, bien que testable, aurait écrasé les tests de l'unité.



4
votes

Je trouve parfois la méthode la plus sûre consiste à incorporer une vérification limite dans la boucle. Le type de construction de boucle n'a pas d'importance. Dans cet exemple, j'ai choisi une déclaration "tandis que": xxx

une valeur raisonnable pour $ max_loop_itérations peut être basée sur:

  • une valeur constante définie à l'exécution
  • une valeur calculée basée sur la taille d'une entrée
  • ou peut-être une valeur calculée basée sur la vitesse d'exécution relative

    J'espère que cela aide, - n


0 commentaires

0
votes

Pouvez-vous suivre l'exécution et jeter un graphique d'appel? Les boucles infinies seront évidentes et vous pouvez facilement choisir ceux qui sont exprès (une énorme grandloop) contre un accident (local abababa ... boucle ou boucle qui ne revient jamais à Mainloop)

J'ai entendu parler de logiciels qui le fait pour les grands programmes complexes, mais je ne pouvais pas trouver une capture d'écran pour vous. Quelqu'un a tracé un programme comme 3DSmax et a largué un très joli graphique d'appels.


0 commentaires