Différences entre versions de « Débogage PHP »

De Cliss XXI
Sauter à la navigation Sauter à la recherche
imported>SylvainBeucler
imported>SylvainBeucler
 
(4 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
Il existe des outils pour tracer les erreurs dans PHP. Nous ne parlerons que des outils libres, cela va de soit.
+
Il existe des outils libres pour tracer les erreurs dans PHP.
  
== DBG ==
+
Pour l'instant, xdebug est le plus proche du fonctionnel parmi les solutions disponibles.
 +
 
 +
== Xdebug ==
 +
 
 +
* Xdebug extensions for PHP
 +
* http://www.xdebug.org/
 +
* Extension Zend
  
* http://dd.cron.ru/dbg/
+
Xdbug peut contacter un client via TCP/IP (debugclient) pour lancer une session de débogage.
* debugging and profiling
 
* Extension PHP
 
  
Interface de contrôle en ligne de commande, ou avec DDD.
+
Il y a deux protocoles:
 +
* GDB (sans rapporta avec le GNU debugger) est utilisable via un simple netcat (nc -l -p 9000). Le jeu de commande reste relativement simple cependant (bt, run, finish, break {main}, etc.). Pas d'alias ou raccourcis pour les commandes comme dans GDB.
 +
* DBGP utilise un autre jeu de commande plus lourd (run -i IDENTIFIANT à la place de run, breakpoint_set -i IDENTIFIANT {main} à la place de break {main}...), et répond en XML. Il faut donc avoir un IDE qui intègre la communication avec xdebug.
  
La nouvelle version 3 est proprio et intégrée dans un IDE (pas essayé).
+
Les sessions de débogage dans une appli web peuvent être suivies via un cookie qui indique l'identifiant de session.
  
La version 2 est libre mais ne compile pas avec PHP5/Debian, et produit un module cassé avec PHP4/Debian (<code>PHP Warning:  Unknown(): Unable to load dynamic library '/usr/lib/php4/20050606+lfs/dbg.so' - /usr/lib/php4/20050606+lfs/dbg.so: undefined symbol: OnUpdateLong in Unknown on line 0</code>).
+
=== Exemple d'installation ===
  
Bref il n'y a plus de version libre maintenue.
+
On utilise Xdebug + GEBEN (mode pour Emacs 22) + DGBp:
  
== APD ==
+
<pre>
 +
# Xdebug
 +
wget 'http://xdebug.org/files/xdebug-2.0.4.tgz'
 +
tar xzf xdebug-2.0.4.tgz
 +
cd xdebug-2.0.4
 +
phpize
 +
./configure --enable-xdebug
 +
make
 +
sudo make install
  
* Advanced PHP Debugger
+
# optional since geben 0.20
* http://pecl.php.net/package/apd/
+
cd debugclient
* Extension Zend
+
./configure && make && sudo make install
  
Non-intéractif, plutôt un ''profiler''
+
cat <<EOF > /etc/php5/conf.d/xdebug.ini
 +
zend_extension="/usr/lib/php5/20060613+lfs/xdebug.so"
 +
xdebug.remote_enable = 1
 +
xdebug.remote_host = localhost
 +
xdebug.remote_port = 9000
 +
xdebug.remote_handler = dbgp
 +
EOF
  
 +
# GEBEN
 +
wget http://geben-on-emacs.googlecode.com/files/geben-0.19.tar.gz
 +
tar xzf geben-0.19.tar.gz
 +
cd geben-0.19
 +
make
 +
sudo make install
 +
cat <<EOF >> ~/.emacs
 +
(autoload 'geben "geben" "PHP Debugger on Emacs" t)
 +
EOF
 +
</pre>
  
== Xdebug ==
+
Pour tester:
 +
* Lancer Emacs
 +
* <code>M-x geben</code> (lance <code>debugclient</code> qui écoute sur le port 9000)
 +
* Visiter http://localhost/~moi/monscript.php?XDEBUG_SESSION_START=1 - ceci active le débogage jusqu'à ce que le cookie XDEBUG_SESSION expire, ou que XDEBUG_SESSION_STOP=1 soit utilisé [http://www.xdebug.org/docs/remote].
  
* Xdebug extensions for PHP
+
Emacs se positionne sur le fichier et permet d'avancer pas à pas. La touche "v" affiche l'ensemble des variables, globales et locales, sous une forme arborescente.
* http://www.xdebug.org/
 
* Extension Zend
 
  
Modifie le gestionnaire d'erreur de PHP pour afficher l'état de la pile d'appels (''stacktrace'').
+
Note: dans la 0.19, Geben utilise le fichier SPIP réel, ce qui permet de positionner des break-points. Dans la 0.23, il travaille sur une copie temporaire, et donc aucun break-point n'est possible à l'avance! J'ai dû louper quelque chose ou alors c'est vraiment du n'importe quoi.
  
[[Image:Xdebug.png]]
+
Autres éditeurs libres:
 +
* Eclipse: http://www.eclipse.org/pdt/ and http://www.phpeclipse.net/
 +
* NetBeans: http://php.netbeans.org/
 +
* Protoeditor: http://protoeditor.sourceforge.net/
 +
* VI: http://www.vim.org/scripts/script.php?script_id=1929
  
Il y a moyen que PHP/xdebug contacte un client via TCP/IP (debugclient) pour lancer une session de débogage. L'outil est franchement primitif et j'ai du mal à l'utiliser. Apparemment il faut avoir un IDE qui intègre la communication avec xdebug, mais l'outil recommandé est prioriétaire. On est loin de C+GDB.
+
Référence:
 +
* http://www.xdebug.org/docs/remote
 +
* http://code.google.com/p/geben-on-emacs/
  
Le protocole dit "GDB" n'est aucunement utilisable avec GDB lui-même, ni avec le mode GUD d'Emacs. En fait on peut intéragir avec ce "protocole" via un simple netcat (nc -l -p 9000), il n'a pas grand chose à voir avec GDB. Le jeu de commande reste relativement simple cependant (bt, run, finish, break {main}, etc.). Pas d'alias ou raccourcis pour les commandes comme dans GDB.
+
== Autres ==
  
Le nouveau protocole DBGP utilise un autre jeu de commande plus lourd (run -i IDENTIFIANT à la place de run, breakpoint_set -i IDENTIFIANT {main} à la place de break {main}...), et répond en XML. Bref ce n'est pas utilisable sans IDE.
+
Xdebug peut aussi modifier le gestionnaire d'erreur de PHP pour afficher l'état de la pile d'appels (''stacktrace'').
  
Les sessions de débogage dans une appli web peuvent être suivies via un cookie qui indique l'identifiant de session.
+
[[Image:Xdebug.png]]
J'ai essayé de lancer un débogage pas à pas, mais l'exécution reprend sans mon accord au bout d'un moment, et la commande "list" ne me dit pas toujours sur quelle ligne je me trouve. Pas moyen non plus d'obtenir le nom du fichier courant, ou alors j'ai mal cherché.
 
  
Bref, c'est déjà ça mais peut mieux faire.
+
(note: on peut faire un effet similaire avec du code PHP du style <code>set_error_handler("debug_print_backtrace");</code>)
  
 
== Gubed ==
 
== Gubed ==
Ligne 56 : Ligne 92 :
 
Il y a également une interface graphique spécifique à Gubed.
 
Il y a également une interface graphique spécifique à Gubed.
  
= BODY =
+
== DBG ==
 +
 
 +
* http://dd.cron.ru/dbg/
 +
* debugging and profiling
 +
* Extension PHP
 +
 
 +
Interface de contrôle en ligne de commande, ou avec DDD.
 +
 
 +
La nouvelle version 3 est proprio et intégrée dans un IDE (pas essayé).
 +
 
 +
La version 2 est libre mais ne compilait pas fin 2006 - à retester..
 +
 
 +
== APD ==
  
* http://members.ozemail.com.au/~djf01/body.html
+
* Advanced PHP Debugger
 +
* http://pecl.php.net/package/apd/
 +
* Extension Zend
  
C'est vieux, écrit en PHP, et à base d'interface web. Je le sens pas.
+
Non-intéractif, plutôt un ''profiler''
  
 
= Autres outils =
 
= Autres outils =

Version actuelle datée du 24 avril 2009 à 21:35

Il existe des outils libres pour tracer les erreurs dans PHP.

Pour l'instant, xdebug est le plus proche du fonctionnel parmi les solutions disponibles.

Xdebug

Xdbug peut contacter un client via TCP/IP (debugclient) pour lancer une session de débogage.

Il y a deux protocoles:

  • GDB (sans rapporta avec le GNU debugger) est utilisable via un simple netcat (nc -l -p 9000). Le jeu de commande reste relativement simple cependant (bt, run, finish, break {main}, etc.). Pas d'alias ou raccourcis pour les commandes comme dans GDB.
  • DBGP utilise un autre jeu de commande plus lourd (run -i IDENTIFIANT à la place de run, breakpoint_set -i IDENTIFIANT {main} à la place de break {main}...), et répond en XML. Il faut donc avoir un IDE qui intègre la communication avec xdebug.

Les sessions de débogage dans une appli web peuvent être suivies via un cookie qui indique l'identifiant de session.

Exemple d'installation

On utilise Xdebug + GEBEN (mode pour Emacs 22) + DGBp:

# Xdebug
wget 'http://xdebug.org/files/xdebug-2.0.4.tgz'
tar xzf xdebug-2.0.4.tgz
cd xdebug-2.0.4
phpize
./configure --enable-xdebug
make
sudo make install

# optional since geben 0.20
cd debugclient
./configure && make && sudo make install

cat <<EOF > /etc/php5/conf.d/xdebug.ini
zend_extension="/usr/lib/php5/20060613+lfs/xdebug.so"
xdebug.remote_enable = 1
xdebug.remote_host = localhost
xdebug.remote_port = 9000
xdebug.remote_handler = dbgp
EOF

# GEBEN
wget http://geben-on-emacs.googlecode.com/files/geben-0.19.tar.gz
tar xzf geben-0.19.tar.gz
cd geben-0.19
make
sudo make install
cat <<EOF >> ~/.emacs
(autoload 'geben "geben" "PHP Debugger on Emacs" t)
EOF

Pour tester:

Emacs se positionne sur le fichier et permet d'avancer pas à pas. La touche "v" affiche l'ensemble des variables, globales et locales, sous une forme arborescente.

Note: dans la 0.19, Geben utilise le fichier SPIP réel, ce qui permet de positionner des break-points. Dans la 0.23, il travaille sur une copie temporaire, et donc aucun break-point n'est possible à l'avance! J'ai dû louper quelque chose ou alors c'est vraiment du n'importe quoi.

Autres éditeurs libres:

Référence:

Autres

Xdebug peut aussi modifier le gestionnaire d'erreur de PHP pour afficher l'état de la pile d'appels (stacktrace).

Xdebug.png

(note: on peut faire un effet similaire avec du code PHP du style set_error_handler("debug_print_backtrace");)

Gubed

Modifie les scripts PHP à la volée pour appeler le debugger. Ce modèle est simple, mais ne pose-t-il pas des limitations (comment remonter d'une ligne ou gérer la pile des appels, par exemple?)

Quanta Plus propose un environnement intégré de programmation et s'intègre avec Gubed. Voici une documentation qui explique comment configurer le tout. Je n'ai pas réussi à la faire fonctionner...

Il y a également une interface graphique spécifique à Gubed.

DBG

Interface de contrôle en ligne de commande, ou avec DDD.

La nouvelle version 3 est proprio et intégrée dans un IDE (pas essayé).

La version 2 est libre mais ne compilait pas fin 2006 - à retester..

APD

Non-intéractif, plutôt un profiler

Autres outils

Apparemment il y a un ou deux produits propriétaires intégrés dans des IDE elles-aussi proprio. Pensez à vérifier la licence d'un produit qu'on vous recommande.

Liens