web-dev-qa-db-fra.com

Retrouver les erreurs de segmentation en PHP?

Je recherche un moyen relativement simple de localiser les erreurs de segmentation dans PHP (comme indiqué dans le journal des erreurs Apache). Voici ma configuration de lampe en ce moment:

Linux: OpenSUSE 11.3 x86_64
Apache: 2.2.15-3.7
MySQL: 5.1.46-2.18
PHP: 5.3.2-1.31

Le code en question n'est pas le mien, c'est Gallery2: http://gallery.menalto.com Un scénario typique est que je vais à la page principale de la galerie et qu'aucune vignette n'apparaît, mais je reçois un nouvel ensemble d'erreurs d'erreur de segmentation dans le journal des erreurs.

Compte tenu de la complexité relative de ce logiciel, il n’est pas particulièrement adapté aux formes simples de débogage. J'aimerais pouvoir parcourir le code et voir exactement ce qui se passe. Les "solutions" que j'ai vues jusqu'à présent pour ce faire étaient plutôt loin d'être "relativement indolores".

J'ai utilisé avec succès Gallery2 sur ce serveur (versions antérieures des progiciels LAMP) et sur d'autres serveurs. Je suppose donc qu'il y a quelque chose de défectueux dans ma configuration actuelle, mais je ne peux pas voir où l'erreur se produit, réparer ou contourner le problème.

3
S. W.

Puis-je suggérer de regarder http://sourceforge.net/tracker/index.php?func=detail&aid=1692166&group_id=7130&atid=1071 et http://gallery.menalto.com/ node/62436 # comment-22857 ?

Il semble y avoir des problèmes courants liés à l'utilisation d'Apache_setenv ou à l'URL gzippée deux fois (selon le scénario - le premier semble plus probable si les vignettes n'apparaissent pas):

Je pense que le problème est que mod_deflate tente de gziper les données une seconde fois en fonction de l'URL, ce qui entraîne des ruptures sur certains systèmes. Lui dire de ne pas gzip les fichiers que nous envoyons aide dans ce cas.


Il peut y avoir un bug en PHP. Essayez d’ajouter $gallery->setConfig('apacheSetenvBroken', 1); à votre config.php pour désactiver l’utilisation de la fonction Apache_setenv ().

Ce n’est pas la réponse à la question que vous vous posez (au-delà de l’utilisation de Zend Framework avec des plugins ou des commandes en ligne de commande php et gdb. Je ne sais pas comment déboguer les segfaults en PHP), mais cela peut aider.

2
Metalshark

Pour déboguer PHP segfaults, vous créerez normalement un nouveau fichier .php (afin qu'il n'interfère pas avec votre code principal) comme ceci (en l'appelant my_first_debugger.php):

<?php
include('annoying_caller_page_that_crashes.php');
?>

Puis lancez gdb php. Si gdb n'est pas installé ou si les binaires gdb/php ne sont pas dans votre chemin, des erreurs se produiront. Utilisez donc YaST2 pour installer tout ce qui est nécessaire (procurez-vous les bibliothèques de développement/debug pour php car elles incluent généralement des symboles de débogage).

Vous obtiendrez une sortie comme:

GNU gdb x.x
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
(gdb) 

Ensuite, faites un run my_first_debugger.php dans la ligne de commande.

Recherchez les packages -dev et -dbg s'il existe des messages tels que (no debugging symbols found) ou si le nom de la fonction appelée ne s'affiche pas.

0
Metalshark