Depurando aplicaciones php con xdebug
| author: | Hugo Ruscitti |
|---|---|
| date: | 25 de Mayo 2010 |
Introducción
Xdebug es un módulo que te permite depurar aplicaciones escritas en el lenguaje de programación PHP.
En este artículo veremos una de las funcionalidades que permite xdebug: depurar una aplicación de manera interactiva, inspeccionando variables, controlando la ejecución del programa y algunos conceptos básicos.
También veremos dos herramientas alternativas para interactuar con xdebug: NetBeans y VIM. De forma que puedas darte una idea general de lo que ofrece cada una.
Instalación
Para instalar xdebug se puede usar directamente el sistema de paquetes apt:
apt-get install php5-xdebug
Este comando instala varios archivos en tu sistema, uno de ellos es /usr/share/php5-xdebug/xdebug.ini-dist.
Tenes que abrir este archivo, copiar las lineas que aparecen y agregarlas a tu archivo /etc/php5/apache2/php.ini.
Luego de los cambios el archivo php.ini tendría que terminar con algo similar a lo siguiente:
zend_extension=/usr/lib/php5/20090626+lfs/xdebug.so
Luego se tiene que reiniciar el servidor web y probar si la extensión se cargó correctamente:
apache2ctrl restart
Una forma de ver si xdebug se cargó correctamente es crear un archivo php donde se ejecute la función phpinfo(), y luego ver el resultado dentro del navegador.
Este es un ejemplo de cómo se tendría que ver la salida de phpinfo:
Depuración remota
Una de las posibilidades que brinda xdebug se denomina depuración remota, y consiste en que puedas controlar la ejecución de un programa de manera interactiva desde una aplicación.
Para seguir este artículo vamos a habilitar esa posibilidad, lo primero que tiene que modificar es el archivo php.ini agregando lo siguiente:
[xdebug] xdebug.remote_enable=1 xdebug.remote_host=localhost xdebug.remote_port=9000 xdebug.remote_handler=dbgp
y luego reiniciar nuevamente el servidor web:
apache2ctrl restart
Componentes
xdebug funciona como una aplicación cliente-servidor, porque en realidad cuando usas xdebug no estás interactuando directamente con xdebug sino mediante una aplicación.
xdebug se encarga de interceptar el flujo de ejecución normal de php e intercambia mensajes con una aplicación clientes para que le dé órdenes. En nuestro caso, esa aplicación cliente que da ordenes puede ser NetBeans o VIM.
Entonces, para que podamos empezar a depurar un programa necesitamos decirle a xdebug que vamos a ponerlo en comunicación con una aplicación cliente.
Ejemplo
Para iniciar la depuración mediante un explorador web, tienes tres posibilidades:
- instalar un complemento que inicie o termine la sesión de depuración.
- agregar un parámetro a la URL del sitio para controlar a XDEBUG.
- habilitar la funcionalidad de manera permanente.
Personalmente me resulta mas sencilla la primer opción, por ejemplo firefox tiene un complemento que inserta un icono en parte inferior de la pantalla para eso: También hay una extensión de firefox que hace esto, está en:
https://addons.mozilla.org/en-US/firefox/addon/58688/
el navegador Chrome tiene algo similar:
https://chrome.google.com/extensions/detail/eadndfjplgieldjbigjakmdgkmoaaaoc
En cambio, si no se quiere instalar un complemento adicional se puede utilizar la URL del sitio como canal de comunicación con xdebug. Por ejemplo, para controlar xdebug se puede usar alguno de estos parámetros get:
XDEBUG_SESSION_START=session_name XDEBUG_SESSION_STOP
por ejemplo: localhost/mi_app/index.php?XDEBUG_SESSION_START=1.
Y por último, si se quiere dejar habilitada la depuración remota de forma permanente se puede agregar la siguiente linea al archivo php.ini:
xdebug.remote_autostart=1
Aplicación de ejemplo
Comencemos con algo muy sencillo, un programa php que imprime una lista de números en inglés:
<?php echo "Contando numeros:"; $numbers = array("one", "two", "three"); echo "<ul>"; foreach ($numbers as $n) { echo "<li>$n</li>"; } echo "</ul>"; ?>
Si guardamos este programa en un archivo cualquiera y lo solicitamos desde un navegador tendríamos que ver en pantalla algo así:
Depurar desde NetBeans
NetBeans tiene complementos para funcionar como un cliente de xdebug, solo que antes se tiene que crear un proyecto PHP para representar a la aplicación.
Una vez identificado el archivo a depurar se tiene que hacer click sobre la numeración de lineas para definir un breakpoint.
Note
Un breakpoint es un punto de corte, un lugar donde queremos que el programa se detenga para inspeccionarlo.
Luego, se tiene que solicitar la página desde un navegador y se producirá la conexión entre netbeans y xdebug.
A partir de ahora se pueden utilizar los botones de la barra de herramientas para controlar la ejecución del programa:
Depurar desde VIM
Instalación
Tienes que descargar el siguiente complemento:
http://www.vim.org/scripts/script.php?script_id=1929
luego descomprimirlo y copiar su contenido dentro el directorio .vim/. Por ejemplo con los siguientes comandos:
cd ~/.vim wget http://www.vim.org/scripts/download_script.php?src_id=7285 -O xdebug.zip unzip xdebug.zip
Iniciando la depuración
Lo primero que tienes que hacer es iniciar el depurador con F5, eso hace que vim abra una conexión en el puerto 9000 esperando a que xdebug inicie la comunicación (aquí tendrías que darle actualizar al navegador).
Note
Inicialmente el complemento tiene predefinida la cantidad de segundos que debe esperar hasta que el navegador se conecte. Este límite es de 5 segundos, lo que me pareció poco, porque a veces te llevá mas tiempo localizar el navegador y darle al botón actualizar. Así que si quieres cambiar este límite por uno mayor puedes usar el siguiente comando:
sed -i "s/5 seconds/20 seconds/g" ~/.vim/plugin/debugger.py sed -i "s/setdefaulttimeout(5)/setdefaulttimeout(20)/g" ~/.vim/plugin/debugger.py
donde el número 20 se puede cambiar por la cantidad de segundos que quieras.
Ah, y si vim está abierto tienes que reiniciarlo o ejecutar lo siguiente para que tome los cambios del archivo:
:source ~/.vim/plugin/debugger.vim
Una vez que se establece la conexión, la pantalla de vim se transforma en lo siguiente:
A partir de este momento podremos controlar la ejecución del programa con los comandos que se muestran a la derecha.
Por ejemplo, el comando ,e nos permite ingresar una sentencia y observar su valor, o bien pulsando F3 avanzamos sin ingresar en las funciones.
En resumen, los comandos mas utilizados son:
- F2 - step into
- F3 - step over
- F4 - step out (busca el breakpoint)
- F5 - run
- F6 - quit debug
- F12 - obtener la propiedad debajo del cursor
- ,e - evaluar una expresión
- :Bp - define un breakpoint


