Sélectionner une page

L’objectif de cet article est de vous présenter un moyen de débugger relativement simplement des scripts PHP directement sur un serveur sur lequel vous êtes connecté à distance via SSH.

Crash course

#!/bin/bash
#Install vdebug on a server https://www.octopuce.fr/debugger-php-en-cli-avec-xdebug-vim/

[ -z which sudo ] && echo "Vous devez installer Sudo d'abord !"
sudo apt-get install curl git php5-cli php5-xdebug vim-nox
XDEBUG_PATH=$(find /usr/ -name "xdebug.so" | tail -n 1)

echo "Configure xdebug..."
echo -e "
zendextension=$XDEBUG_PATH
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.remote_host=localhost
xdebug.remote_autostart=1
xdebug.idekey=vim_session " > /etc/php5/cli/conf.d/20-xdebug.ini

echo "Installe pathogen et vdebug..."
mkdir -p ~/.vim/autoload ~/.vim/bundle
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
cd ~/.vim/bundle && git clone git@github.com:joonty/vdebug.git

echo "Changements dans .vimrc..."
echo -e "
execute pathogen#infect()
call pathogen#helptags()
let g:vdebug_options = {}
let g:vdebug_options['port'] = 9000
" >> ~/.vimrc

echo "Ajoute l'idekey dans .bashrc..."
echo 'export XDEBUGIDEKEY=\"idekey=vim_session\"' >> ~/.bashrc
source ~/.bashrc

 

Introduction

Formidable outil permettant de debugger pas à pas, Xdebug est très apprécié pour son intégration dans quantité d’IDE: phpStorm, Atom, NetBeans, Sublime Text, etc. Généralement, on active Xdebug sur son serveur, et en configurant son IDE, on est capable de débugger à distance un script qui tourne sur une requète Http. Mais comment faire, dans le cas de l’execution d’un script en cli, pour débugger en local.

Exemple via ssh sur un serveur distant.

Prérequis concernant le serveur sur lequel vous voulez débugger :

  • Debian Wheezy ou Jessie
  • Php 5.3 minimum
  • Vim, compilé avec le support de Python comme langage de script (fournis sous debian par le paquet vim-nox)
  • Xdebug
  • Git (optionnel)

Xdebug, donne moi la puissance….

Nous allons utiliser une configuration un peu particulière pour le Xdebug que vous avez installé.
Elle passe Xdebug en débuggeur pas à pas, mais pour interagir avec un client en local.
Ouvrez le fichier .ini relatif à votre configuration : /etc/php5/cli/php.ini ou /etc/php5/cli/conf.d/20-xdebug.ini .
Vous devez vous assurez qu’y figurent les lignes suivantes:

 

zendextension = /chemin/vers/xdebug.so
; Demande à xdebug de contacter un client (ici vim) selon
; les informations spécifiées par xdebug.remoteenable et
; xdebug.remoteport
xdebug.remoteenable = 1

; Dans notre cas, notre client écoute sur le port 9000, et nous somme en local
xdebug.remoteport =9000
xdebug.remotehost = localhost

; Normalement, xdebug attend de recevoir un Cookie ou un argument spécifique
; dans une requete GET ou POST. En passant cette option, on demande à
; xdebug de toujours tenter une connection à un hypothétique client
; à chaque lancement de php
; Attention: laisser cette option à 1 peut freiner les performances de php
xdebug.remote_autostart=1

; Clé passée par xdebug à DBGP pour communiquer avec le client, et qui dépend de
; son environnement. Ici, on utilisera vimsession comme valeur pour xdebug.idekey
xdebug.idekey=vimsession

La documentation officielle de Xdebug vous donnera toutes les options de configuration.

Vim ma vie de développeur

Le plugin Vdebug (écrit en python) interface Vim avec n’importe quel debuggueur utilisant le protocole DBGP, pour Php (ici, Xdebug), Python, Ruby, Perl ou encore NodeJs. Son rôle : transformer ici vim en client Xdebug.

Les gestionnaires de plugins offrent une facilité d’installation et de gestion. Nous allons pour notre part utiliser Pathogen. Il s’installe ainsi :

mkdir -p ~/.vim/autoload ~/.vim/bundle && \
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim

Pathogen est maintenant installé dans ~/.vim/autoload/pathogen.vim.
Les quelques lignes au dessus créent les dossiers suivants :

  • ~/.vim/autoload, dans lequel se trouve pathogen,
  • ~/.vim/bundle, dans lequel nous allons placer nos plugins pour vim

En l’occurence nous allons y ajouter vdebug :

 cd ~/.vim/bundle && git clone git@github.com:joonty/vdebug.git

Maintenant, reste à éditer le .vimrc de votre utilisateur :

" ~/.vimrc

" On active Pathogen:
execute pathogen#infect()
call pathogen#helptags()

" Puis quelque option pour vdebug:
let g:vdebugoptions = {}
let g:vdebugoptions["port"] = 9000

Pour valider l’installation de vdebug, ouvrez un script avec vim et appuyez sur F5. Si tout s’est bien passé le message  » Waiting for a connection (Ctrl-C to cancel, this message will self-destruct in 20 seconds…) » devrait s’afficher.
Et maintenant, testons!

Vdebug ain’t afraid of no bug !

Nous allons travailler dans un environnement Terminator avec 2 terminaux l’un à côté de l’autre.

Vous êtes connecté en SSH sur le serveur dans un premier panneau. Indiquez à Xdebug votre idekey:

 export XDEBUG_IDEKEY="idekey=vim_session"

Ouvrez le script que vous souhaitez débugger avec vim, dans un second panneau.

vim example.php

Vdebug s’utilise de la manière suivante:

  • <F10> pour poser un point d’arrêt
  • <F5> pour lancer une session xdebug
  • <F6> pour quitter une session xdebug

Placez un point d’arrêt, puis lancez une session xdebug avec F5.

Vdebug - point d'arret

Lançons le script:

php example.php

Si tout se passe bien, un nouvel onglet s’ouvre automatiquement dans vim, avec 4 panneaux:

Vdebug

  • Le panneau de gauche, c’est votre script : la ligne rouge représente l’execution en cours, les lignes vertes vos points d’arrêt
  • Sur votre droite, trois panneaux:
    • En haut, l’état des variables
    • Au milieu, le stack
    • En bas, l’état de xdebug

Tips :

Utilisation des onglets dans vim

Pour ouvrir plusieurs fichiers dans vim, lancez

 vim -p fichier1, fichier2, fichier3

Dans vim, pour ouvrir un fichier dans un nouvel onglet, lancez :

:tabedit mon_fichier

Naviguez entre les onglets avec gt pour passer à l’onglet de droite, et gT pour l’onglet de gauche. Entrez :q pour quitter un onglet.

Utiliser la souris dans vim

Pour pouvoir redimensionner les panneaux dans l’onglet de débug, utilisez votre souris en lançant sur vim:

:set mouse=a

Cette commande active le support de la souris pour tous les modes de vim. Attention, il n’est disponible que si vous utilisez un terminal type xterm.  Pour désactiver l’option :

:set mouse=

Obtenez plus d’informations concernant le support de la souris avec la commande:

:help mouse

En cours de session, différentes commandes à retenir:

  • <F5> Passer au prochain point d’arrêt
  • <F2> Passer à la prochaine instruction
  • <F3> Rentrer dans l’instruction
  • <F4> Sortir de l’instruction
  • <F6> Arrêter la session

Pour obtenir plus d’information sur vdebug, lancez dans vim:

:help vdebug

 

Liens utiles

 

Happy debugging!